From: Radek Czajka Date: Thu, 27 Jan 2011 12:00:51 +0000 (+0100) Subject: #968: don't import invalid slugs X-Git-Url: https://git.mdrn.pl/wolnelektury.git/commitdiff_plain/cac039925d37df5c305dbf9151fdbf426b24ccb5?ds=sidebyside;hp=--cc #968: don't import invalid slugs --- cac039925d37df5c305dbf9151fdbf426b24ccb5 diff --git a/apps/catalogue/models.py b/apps/catalogue/models.py index 129bb8abe..cb1eff841 100644 --- a/apps/catalogue/models.py +++ b/apps/catalogue/models.py @@ -493,6 +493,7 @@ class Book(models.Model): @classmethod def from_text_and_meta(cls, raw_file, book_info, overwrite=False, build_epub=True, build_txt=True): + import re from tempfile import NamedTemporaryFile from slughifi import slughifi from markupstring import MarkupString @@ -511,6 +512,8 @@ class Book(models.Model): # Read book metadata book_base, book_slug = book_info.url.rsplit('/', 1) + if re.search(r'[^a-zA-Z0-9-]', book_slug): + raise ValueError('Invalid characters in slug') book, created = Book.objects.get_or_create(slug=book_slug) if created: diff --git a/apps/catalogue/tests/book_import.py b/apps/catalogue/tests/book_import.py index f22be327f..eb5cea734 100644 --- a/apps/catalogue/tests/book_import.py +++ b/apps/catalogue/tests/book_import.py @@ -3,12 +3,15 @@ from django.core.files.base import ContentFile from catalogue.test_utils import * from catalogue import models +from nose.tools import raises + + class BookImportLogicTests(WLTestCase): def setUp(self): WLTestCase.setUp(self) self.book_info = BookInfoStub( - url=u"http://wolnelektury.pl/example/default_book", + url=u"http://wolnelektury.pl/example/default-book", about=u"http://wolnelektury.pl/example/URI/default_book", title=u"Default Book", author=PersonStub(("Jim",), "Lazy"), @@ -30,7 +33,7 @@ class BookImportLogicTests(WLTestCase): book = models.Book.from_text_and_meta(ContentFile(BOOK_TEXT), self.book_info) self.assertEqual(book.title, "Default Book") - self.assertEqual(book.slug, "default_book") + self.assertEqual(book.slug, "default-book") self.assert_(book.parent is None) self.assertFalse(book.has_html_file()) @@ -104,6 +107,13 @@ class BookImportLogicTests(WLTestCase): self.assertEqual(book.fragments.count(), 0) self.assertEqual(book.tags.filter(category='theme').count(), 0) + @raises(ValueError) + def test_book_with_invalid_slug(self): + """ Book with invalid characters in slug shouldn't be imported """ + self.book_info.url = "http://wolnelektury.pl/example/default_book" + BOOK_TEXT = "" + book = models.Book.from_text_and_meta(ContentFile(BOOK_TEXT), self.book_info) + def test_book_replace_title(self): BOOK_TEXT = """""" book = models.Book.from_text_and_meta(ContentFile(BOOK_TEXT), self.book_info)