Add the ability to view IP addresses in auth, with a basic search interface

This commit is contained in:
2012-03-29 22:51:58 +01:00
parent 150a6503c6
commit 45630f10f7
4 changed files with 58 additions and 3 deletions

View File

@@ -19,6 +19,9 @@
{% if "hr"|installed %} {% if "hr"|installed %}
<li><b>Blacklist Status: {% if blacklisted %}<font color='red'>BLACKLISTED</font> ({{ blacklisted }} items){% else %}<font color='geen'>OK</font>{% endif %}</b></li> <li><b>Blacklist Status: {% if blacklisted %}<font color='red'>BLACKLISTED</font> ({{ blacklisted }} items){% else %}<font color='geen'>OK</font>{% endif %}</b></li>
{% endif %} {% endif %}
{% if user.ip_addresses.count %}
<li><a href="{% url sso-ipaddress %}?user={{ user.username }}">IP Address Lookup</a> ({{ user.ip_addresses.count }} associated addresses)</li>
{% endif %}
</p> </p>
<p> <p>

View File

@@ -0,0 +1,25 @@
{% extends "base.html" %}
{% block title %}IP Search: {% if kuser %}{{ kuser }}{% else %}{{ ip }}{% endif %}{% endblock %}
{% block content %}
<h1>IP Search: {% if kuser %}{{ kuser }}{% else %}{{ ip }}{% endif %}</h1>
{% if object_list %}
<table>
<thead>
<tr><th>IP Address</th><th>User</th><th>First Use</th><th>Last Use</th></tr>
</thead>
<tbody>
{% for object in object_list %}
<tr><td><a href="{% url sso-ipaddress %}?ip={{ object.ip_address }}">{{ object.ip_address }}</a></td>
<td><a href="{% url sso-ipaddress %}?user={{ object.user.username }}">{{ object.user }}</a> (<a href="{% url sso-viewuser object.user.username %}">Profile</a>)</td>
<td>{{ object.first_seen }}</td>
<td>{{ object.last_seen }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
{% endblock %}

View File

@@ -7,7 +7,7 @@ from sso import views
urlpatterns = patterns('', urlpatterns = patterns('',
('^$', views.profile), ('^$', views.profile),
(r'^profile/$', views.profile), url(r'^profile/$', views.profile, name='sso-profile'),
(r'^profile/add/service', views.service_add), (r'^profile/add/service', views.service_add),
(r'^profile/del/service/$', views.service_del), (r'^profile/del/service/$', views.service_del),
(r'^profile/del/service/(?P<serviceid>\d+)/$', views.service_del), (r'^profile/del/service/(?P<serviceid>\d+)/$', views.service_del),
@@ -23,6 +23,8 @@ urlpatterns = patterns('',
(r'^users/$', views.user_lookup), (r'^users/$', views.user_lookup),
url(r'^users/(?P<username>.*)/addnote/$', login_required(views.AddUserNote.as_view()), name='sso-addusernote'), url(r'^users/(?P<username>.*)/addnote/$', login_required(views.AddUserNote.as_view()), name='sso-addusernote'),
url(r'^users/(?P<username>.*)/$', views.user_view, name='sso-viewuser'), url(r'^users/(?P<username>.*)/$', views.user_view, name='sso-viewuser'),
url(r'^address/$', login_required(views.UserIPAddressView.as_view()), name='sso-ipaddress'),
) )
urlpatterns += patterns('django.views.generic.simple', urlpatterns += patterns('django.views.generic.simple',

View File

@@ -13,7 +13,7 @@ from django.contrib.auth.decorators import login_required
from django.template import RequestContext from django.template import RequestContext
from django.core import serializers from django.core import serializers
from django.conf import settings from django.conf import settings
from django.views.generic import FormView from django.views.generic import FormView, ListView
from gargoyle import gargoyle from gargoyle import gargoyle
from gargoyle.decorators import switch_is_active from gargoyle.decorators import switch_is_active
@@ -23,7 +23,7 @@ from eve_api.models import EVEAccount, EVEPlayerCharacter
from eve_api.tasks import import_apikey, import_apikey_result, update_user_access from eve_api.tasks import import_apikey, import_apikey_result, update_user_access
from eve_proxy.models import ApiAccessLog from eve_proxy.models import ApiAccessLog
from reddit.tasks import update_user_flair from reddit.tasks import update_user_flair
from sso.models import ServiceAccount, Service, SSOUser, ExistingUser, ServiceError from sso.models import ServiceAccount, Service, SSOUser, ExistingUser, ServiceError, SSOUserIPAddress
from sso.forms import UserServiceAccountForm, ServiceAccountResetForm, UserLookupForm, APIPasswordForm, EmailChangeForm, PrimaryCharacterForm, UserNoteForm from sso.forms import UserServiceAccountForm, ServiceAccountResetForm, UserLookupForm, APIPasswordForm, EmailChangeForm, PrimaryCharacterForm, UserNoteForm
@login_required @login_required
@@ -366,3 +366,28 @@ class AddUserNote(FormView):
obj.save() obj.save()
return super(AddUserNote, self).form_valid(form) return super(AddUserNote, self).form_valid(form)
class UserIPAddressView(ListView):
model = SSOUserIPAddress
def dispatch(self, request, *args, **kwargs):
if not request.user.has_perm('sso.can_view_users_restricted'):
return HttpResponseForbidden()
return super(AddUserNote, self).dispatch(request, *args, **kwargs)
def get_queryset(self):
if self.request.GET.has_key('user'):
qs = self.model.objects.filter(user__username__exact=self.request.GET.get('user'))
else:
qs = self.model.objects.filter(ip_address__contains=self.request.GET.get('ip', ''))
return qs.order_by('-last_seen')
def get_context_data(self, **kwargs):
ctx = super(UserIPAddressView, self).get_context_data(**kwargs)
ctx.update({
'ip': self.request.GET.get('ip', None),
'kuser': self.request.GET.get('user', None),
})
return ctx