# HG changeset patch # User neko259 # Date 2013-08-26 08:07:32 # Node ID 81f8bb6b4ee3e180fc8dba90657d23e2ef226f05 # Parent 96ce3526ce52429c1d35d5e8c7076240feea42fe Added IP ban lists. Added migration for bans. Use generic ip address for posting instead of ipv4 only. diff --git a/boards/admin.py b/boards/admin.py --- a/boards/admin.py +++ b/boards/admin.py @@ -1,6 +1,7 @@ from django.contrib import admin -from boards.models import Post, Tag, Admin +from boards.models import Post, Tag, Admin, Ban admin.site.register(Post) admin.site.register(Tag) admin.site.register(Admin) +admin.site.register(Ban) \ No newline at end of file diff --git a/boards/migrations/0002_auto__add_ban__chg_field_post_poster_ip.py b/boards/migrations/0002_auto__add_ban__chg_field_post_poster_ip.py new file mode 100644 --- /dev/null +++ b/boards/migrations/0002_auto__add_ban__chg_field_post_poster_ip.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'Ban' + db.create_table(u'boards_ban', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('ip', self.gf('django.db.models.fields.GenericIPAddressField')(max_length=39)), + )) + db.send_create_signal(u'boards', ['Ban']) + + + # Changing field 'Post.poster_ip' + db.alter_column(u'boards_post', 'poster_ip', self.gf('django.db.models.fields.GenericIPAddressField')(max_length=39)) + + def backwards(self, orm): + # Deleting model 'Ban' + db.delete_table(u'boards_ban') + + + # Changing field 'Post.poster_ip' + db.alter_column(u'boards_post', 'poster_ip', self.gf('django.db.models.fields.IPAddressField')(max_length=15)) + + models = { + u'boards.admin': { + 'Meta': {'object_name': 'Admin'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'boards.ban': { + 'Meta': {'object_name': 'Ban'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}) + }, + u'boards.post': { + 'Meta': {'object_name': 'Post'}, + '_text_rendered': ('django.db.models.fields.TextField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('boards.thumbs.ImageWithThumbsField', [], {'max_length': '100', 'blank': 'True'}), + 'last_edit_time': ('django.db.models.fields.DateTimeField', [], {}), + 'parent': ('django.db.models.fields.BigIntegerField', [], {}), + 'poster_ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}), + 'poster_user_agent': ('django.db.models.fields.TextField', [], {}), + 'pub_time': ('django.db.models.fields.DateTimeField', [], {}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['boards.Tag']", 'symmetrical': 'False'}), + 'text': ('markupfield.fields.MarkupField', [], {'rendered_field': 'True'}), + 'text_markup_type': ('django.db.models.fields.CharField', [], {'default': "'markdown'", 'max_length': '30'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'boards.tag': { + 'Meta': {'object_name': 'Tag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + } + } + + complete_apps = ['boards'] \ No newline at end of file diff --git a/boards/models.py b/boards/models.py --- a/boards/models.py +++ b/boards/models.py @@ -215,7 +215,7 @@ class Post(models.Model): escape_html=False) image = thumbs.ImageWithThumbsField(upload_to=_update_image_filename, blank=True, sizes=(IMAGE_THUMB_SIZE,)) - poster_ip = models.IPAddressField() + poster_ip = models.GenericIPAddressField() poster_user_agent = models.TextField() parent = models.BigIntegerField() tags = models.ManyToManyField(Tag) @@ -287,3 +287,11 @@ class Admin(models.Model): def __unicode__(self): return self.name + '/' + '*' * len(self.password) + + +class Ban(models.Model): + + ip = models.GenericIPAddressField() + + def __unicode__(self): + return self.ip diff --git a/boards/templates/boards/authors.html b/boards/templates/boards/banned.html copy from boards/templates/boards/authors.html copy to boards/templates/boards/banned.html --- a/boards/templates/boards/authors.html +++ b/boards/templates/boards/banned.html @@ -3,28 +3,11 @@ {% load i18n %} {% block head %} - {% trans "Authors" %} + {% trans "Banned" %} {% endblock %} {% block content %}
-

Authors

- {% for nick, values in authors.items %} -

- {{ nick }} ({{ values.name }}): - {% for value in values.contacts %} - {{ value }} - {% endfor %} - - {% for role in values.roles %} - {% trans role %} - {% endfor %} -

- {% endfor %} -
-

{% trans "Distributed under the" %} - GNU GPLv3 - {% trans "license" %}

-

- {% trans "Repository" %}

+ {% trans 'Your IP address has been banned. Contact the administrator' %}
{% endblock %} \ No newline at end of file diff --git a/boards/urls.py b/boards/urls.py --- a/boards/urls.py +++ b/boards/urls.py @@ -26,6 +26,7 @@ urlpatterns = patterns('', url(r'^captcha/', include('captcha.urls')), url(r'^jump/(?P\w+)/$', views.jump_to_post, name='jumper'), url(r'^authors/$', views.authors, name='authors'), + url(r'^banned/$', views.you_are_banned, name='banned'), # RSS feeds url(r'^rss/$', AllThreadsFeed()), diff --git a/boards/views.py b/boards/views.py --- a/boards/views.py +++ b/boards/views.py @@ -9,7 +9,7 @@ from boards import utils from boards.forms import ThreadForm, PostForm, SettingsForm, PlainErrorList, \ ThreadCaptchaForm, PostCaptchaForm -from boards.models import Post, Admin, Tag +from boards.models import Post, Admin, Tag, Ban from boards import authors import neboard @@ -46,6 +46,12 @@ def index(request, page=0): def _new_post(request, form, thread_id=boards.models.NO_PARENT): """Add a new post (in thread or as a reply).""" + ip = _get_client_ip(request) + is_banned = Ban.objects.filter(ip=ip).count() > 0 + + if is_banned: + return redirect(you_are_banned) + data = form.cleaned_data title = data['title'] @@ -56,8 +62,6 @@ def _new_post(request, form, thread_id=b else: image = None - ip = _get_client_ip(request) - tags = [] new_thread = thread_id == boards.models.NO_PARENT @@ -222,6 +226,11 @@ def authors(request): return render(request, 'boards/authors.html', context) +def you_are_banned(request): + context = _init_default_context(request) + return render(request, 'boards/banned.html', context) + + def _get_theme(request): """Get user's CSS theme"""