diff --git a/bookwyrm/emailing.py b/bookwyrm/emailing.py index 5e08ebba1..ccc0aea61 100644 --- a/bookwyrm/emailing.py +++ b/bookwyrm/emailing.py @@ -4,7 +4,7 @@ from django.template.loader import get_template from bookwyrm import models, settings from bookwyrm.tasks import app, EMAIL -from bookwyrm.settings import DOMAIN +from bookwyrm.settings import DOMAIN, BASE_URL def email_data(): @@ -14,6 +14,7 @@ def email_data(): "site_name": site.name, "logo": site.logo_small_url, "domain": DOMAIN, + "base_url": BASE_URL, "user": None, } diff --git a/bookwyrm/models/site.py b/bookwyrm/models/site.py index 201a499e5..36e6bb128 100644 --- a/bookwyrm/models/site.py +++ b/bookwyrm/models/site.py @@ -12,7 +12,7 @@ from model_utils import FieldTracker from bookwyrm.connectors.abstract_connector import get_data from bookwyrm.preview_images import generate_site_preview_image_task -from bookwyrm.settings import DOMAIN, ENABLE_PREVIEW_IMAGES, STATIC_FULL_URL +from bookwyrm.settings import BASE_URL, ENABLE_PREVIEW_IMAGES, STATIC_FULL_URL from bookwyrm.settings import RELEASE_API from bookwyrm.tasks import app, MISC from .base_model import BookWyrmModel, new_access_code @@ -188,7 +188,7 @@ class SiteInvite(models.Model): @property def link(self): """formats the invite link""" - return f"https://{DOMAIN}/invite/{self.code}" + return f"{BASE_URL}/invite/{self.code}" class InviteRequest(BookWyrmModel): @@ -235,7 +235,7 @@ class PasswordReset(models.Model): @property def link(self): """formats the invite link""" - return f"https://{DOMAIN}/password-reset/{self.code}" + return f"{BASE_URL}/password-reset/{self.code}" # pylint: disable=unused-argument diff --git a/bookwyrm/models/user.py b/bookwyrm/models/user.py index 8db9af7b6..f793d61b8 100644 --- a/bookwyrm/models/user.py +++ b/bookwyrm/models/user.py @@ -19,7 +19,7 @@ from bookwyrm.connectors import get_data, ConnectorException from bookwyrm.models.shelf import Shelf from bookwyrm.models.status import Status from bookwyrm.preview_images import generate_user_preview_image_task -from bookwyrm.settings import DOMAIN, ENABLE_PREVIEW_IMAGES, USE_HTTPS, LANGUAGES +from bookwyrm.settings import BASE_URL, DOMAIN, ENABLE_PREVIEW_IMAGES, USE_HTTPS, LANGUAGES from bookwyrm.signatures import create_key_pair from bookwyrm.tasks import app, MISC from bookwyrm.utils import regex @@ -214,8 +214,7 @@ class User(OrderedCollectionPageMixin, AbstractUser): @property def confirmation_link(self): """helper for generating confirmation links""" - link = site_link() - return f"{link}/confirm-email/{self.confirmation_code}" + return f"{BASE_URL}/confirm-email/{self.confirmation_code}" @property def following_link(self): diff --git a/bookwyrm/templates/email/html_layout.html b/bookwyrm/templates/email/html_layout.html index b9f88732f..467d6d6e5 100644 --- a/bookwyrm/templates/email/html_layout.html +++ b/bookwyrm/templates/email/html_layout.html @@ -2,10 +2,10 @@
- logo + logo
- {{ site_name }}
+
{{ site_name }}
{{ domain }}
@@ -18,9 +18,9 @@
-

{% blocktrans %}BookWyrm hosted on {{ site_name }}{% endblocktrans %}

+

{% blocktrans %}BookWyrm hosted on {{ site_name }}{% endblocktrans %}

{% if user %} -

{% trans "Email preference" %}

+

{% trans "Email preference" %}

{% endif %}
diff --git a/bookwyrm/templates/email/invite/html_content.html b/bookwyrm/templates/email/invite/html_content.html index adc993b7b..9d2cda364 100644 --- a/bookwyrm/templates/email/invite/html_content.html +++ b/bookwyrm/templates/email/invite/html_content.html @@ -12,6 +12,6 @@

{% url 'code-of-conduct' as coc_path %} {% url 'about' as about_path %} - {% blocktrans %}Learn more about {{ site_name }}.{% endblocktrans %} + {% blocktrans %}Learn more about {{ site_name }}.{% endblocktrans %}

{% endblock %} diff --git a/bookwyrm/templates/email/invite/text_content.html b/bookwyrm/templates/email/invite/text_content.html index 26dcd1720..05fe91456 100644 --- a/bookwyrm/templates/email/invite/text_content.html +++ b/bookwyrm/templates/email/invite/text_content.html @@ -5,6 +5,6 @@ {{ invite_link }} -{% blocktrans %}Learn more about {{ site_name }}:{% endblocktrans %} https://{{ domain }}{% url 'about' %} +{% blocktrans %}Learn more about {{ site_name }}:{% endblocktrans %} {{ base_url }}{% url 'about' %} {% endblock %} diff --git a/bookwyrm/templates/opensearch.xml b/bookwyrm/templates/opensearch.xml index fd5c8f231..980ca5604 100644 --- a/bookwyrm/templates/opensearch.xml +++ b/bookwyrm/templates/opensearch.xml @@ -10,6 +10,6 @@ {{ image }} diff --git a/bookwyrm/tests/models/test_fields.py b/bookwyrm/tests/models/test_fields.py index 2917c8908..7c1dcadc9 100644 --- a/bookwyrm/tests/models/test_fields.py +++ b/bookwyrm/tests/models/test_fields.py @@ -4,7 +4,7 @@ from dataclasses import dataclass import datetime import json import pathlib -import re +from urllib.parse import urlparse from typing import List from unittest import expectedFailure from unittest.mock import patch @@ -22,7 +22,7 @@ from bookwyrm.activitypub.base_activity import ActivityObject from bookwyrm.models import fields, User, Status, Edition from bookwyrm.models.base_model import BookWyrmModel from bookwyrm.models.activitypub_mixin import ActivitypubMixin -from bookwyrm.settings import DOMAIN +from bookwyrm.settings import PROTOCOL, NETLOC # pylint: disable=too-many-public-methods @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") @@ -427,12 +427,10 @@ class ModelFields(TestCase): instance = fields.ImageField() output = instance.field_to_activity(user.avatar) - self.assertIsNotNone( - re.match( - rf"https:\/\/{DOMAIN}\/.*\.jpg", - output.url, - ) - ) + parsed_url = urlparse(output.url) + self.assertEqual(parsed_url.scheme, PROTOCOL) + self.assertEqual(parsed_url.netloc, NETLOC) + self.assertRegex(parsed_url.path, r"\.jpg$") self.assertEqual(output.name, "") self.assertEqual(output.type, "Image") diff --git a/bookwyrm/tests/models/test_site.py b/bookwyrm/tests/models/test_site.py index 0933dac0c..c9f9a1315 100644 --- a/bookwyrm/tests/models/test_site.py +++ b/bookwyrm/tests/models/test_site.py @@ -79,7 +79,7 @@ class SiteModels(TestCase): def test_site_invite_link(self): """invite link generator""" invite = models.SiteInvite.objects.create(user=self.local_user, code="hello") - self.assertEqual(invite.link, f"https://{settings.DOMAIN}/invite/hello") + self.assertEqual(invite.link, f"{settings.BASE_URL}/invite/hello") def test_invite_request(self): """someone wants an invite""" @@ -95,7 +95,7 @@ class SiteModels(TestCase): """password reset token""" token = models.PasswordReset.objects.create(user=self.local_user, code="hello") self.assertTrue(token.valid()) - self.assertEqual(token.link, f"https://{settings.DOMAIN}/password-reset/hello") + self.assertEqual(token.link, f"{settings.BASE_URL}/password-reset/hello") @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") @patch("bookwyrm.suggested_users.remove_user_task.delay") diff --git a/bookwyrm/tests/models/test_status_model.py b/bookwyrm/tests/models/test_status_model.py index 6323eeca3..2fede3684 100644 --- a/bookwyrm/tests/models/test_status_model.py +++ b/bookwyrm/tests/models/test_status_model.py @@ -227,11 +227,9 @@ class Status(TestCase): self.assertEqual(activity["sensitive"], False) self.assertIsInstance(activity["attachment"], list) self.assertEqual(activity["attachment"][0]["type"], "Document") - self.assertTrue( - re.match( - r"https:\/\/your.domain.here\/images\/covers\/test(_[A-z0-9]+)?.jpg", - activity["attachment"][0]["url"], - ) + self.assertRegex( + activity["attachment"][0]["url"], + rf"^{settings.BASE_URL}/images/covers/test(_[A-z0-9]+)?.jpg$", ) self.assertEqual(activity["attachment"][0]["name"], "Test Edition") @@ -263,12 +261,10 @@ class Status(TestCase): ), ) self.assertEqual(activity["attachment"][0]["type"], "Document") - # self.assertTrue( - # re.match( - # r"https:\/\/your.domain.here\/images\/covers\/test_[A-z0-9]+.jpg", - # activity["attachment"][0].url, - # ) - # ) + self.assertRegex( + activity["attachment"][0]["url"], + rf"^{settings.BASE_URL}/images/covers/test_[A-z0-9]+.jpg$", + ) self.assertEqual(activity["attachment"][0]["name"], "Test Edition") def test_quotation_to_activity(self, *_): @@ -306,11 +302,9 @@ class Status(TestCase): ), ) self.assertEqual(activity["attachment"][0]["type"], "Document") - self.assertTrue( - re.match( - r"https:\/\/your.domain.here\/images\/covers\/test(_[A-z0-9]+)?.jpg", - activity["attachment"][0]["url"], - ) + self.assertRegex( + activity["attachment"][0]["url"], + rf"^{settings.BASE_URL}/images/covers/test(_[A-z0-9]+)?.jpg$", ) self.assertEqual(activity["attachment"][0]["name"], "Test Edition") @@ -400,11 +394,9 @@ class Status(TestCase): ) self.assertEqual(activity["content"], "test content") self.assertEqual(activity["attachment"][0]["type"], "Document") - self.assertTrue( - re.match( - r"https:\/\/your.domain.here\/images\/covers\/test_[A-z0-9]+.jpg", - activity["attachment"][0]["url"], - ) + self.assertRegex( + activity["attachment"][0]["url"], + rf"^{settings.BASE_URL}/images/covers/test_[A-z0-9]+.jpg$", ) self.assertEqual(activity["attachment"][0]["name"], "Test Edition") @@ -425,11 +417,9 @@ class Status(TestCase): ) self.assertEqual(activity["content"], "test content") self.assertEqual(activity["attachment"][0]["type"], "Document") - self.assertTrue( - re.match( - r"https:\/\/your.domain.here\/images\/covers\/test_[A-z0-9]+.jpg", - activity["attachment"][0]["url"], - ) + self.assertRegex( + activity["attachment"][0]["url"], + rf"^{settings.BASE_URL}/images/covers/test_[A-z0-9]+.jpg$", ) self.assertEqual(activity["attachment"][0]["name"], "Test Edition") @@ -448,11 +438,9 @@ class Status(TestCase): f'rated {self.book.title}: 3 stars', ) self.assertEqual(activity["attachment"][0]["type"], "Document") - self.assertTrue( - re.match( - r"https:\/\/your.domain.here\/images\/covers\/test_[A-z0-9]+.jpg", - activity["attachment"][0]["url"], - ) + self.assertRegex( + activity["attachment"][0]["url"], + rf"^{settings.BASE_URL}/images/covers/test_[A-z0-9]+.jpg$", ) self.assertEqual(activity["attachment"][0]["name"], "Test Edition") diff --git a/bookwyrm/tests/test_utils.py b/bookwyrm/tests/test_utils.py index ed62050a8..438eb1dd3 100644 --- a/bookwyrm/tests/test_utils.py +++ b/bookwyrm/tests/test_utils.py @@ -2,6 +2,7 @@ import re from django.test import TestCase +from bookwyrm.settings import BASE_URL from bookwyrm.utils import regex from bookwyrm.utils.validate import validate_url_domain @@ -15,10 +16,8 @@ class TestUtils(TestCase): def test_valid_url_domain(self): """Check with a valid URL""" - self.assertEqual( - validate_url_domain("https://your.domain.here/legit-book-url/"), - "https://your.domain.here/legit-book-url/", - ) + legit = f"{BASE_URL}/legit-book-url/" + self.assertEqual(validate_url_domain(legit), legit) def test_invalid_url_domain(self): """Check with an invalid URL""" diff --git a/bookwyrm/tests/views/test_helpers.py b/bookwyrm/tests/views/test_helpers.py index 818647db1..a1c06bede 100644 --- a/bookwyrm/tests/views/test_helpers.py +++ b/bookwyrm/tests/views/test_helpers.py @@ -8,7 +8,7 @@ from django.test.client import RequestFactory import responses from bookwyrm import models, views -from bookwyrm.settings import USER_AGENT, DOMAIN +from bookwyrm.settings import USER_AGENT, BASE_URL @patch("bookwyrm.activitystreams.add_status_task.delay") @@ -288,13 +288,13 @@ class ViewsHelpers(TestCase): # pylint: disable=too-many-public-methods def test_redirect_to_referer_valid_domain(self, *_): """redirect to within the app""" request = self.factory.get("/path") - request.META = {"HTTP_REFERER": f"https://{DOMAIN}/and/a/path"} + request.META = {"HTTP_REFERER": f"{BASE_URL}/and/a/path"} result = views.helpers.redirect_to_referer(request) - self.assertEqual(result.url, f"https://{DOMAIN}/and/a/path") + self.assertEqual(result.url, f"{BASE_URL}/and/a/path") def test_redirect_to_referer_with_get_args(self, *_): """if the path has get params (like sort) they are preserved""" request = self.factory.get("/path") - request.META = {"HTTP_REFERER": f"https://{DOMAIN}/and/a/path?sort=hello"} + request.META = {"HTTP_REFERER": f"{BASE_URL}/and/a/path?sort=hello"} result = views.helpers.redirect_to_referer(request) - self.assertEqual(result.url, f"https://{DOMAIN}/and/a/path?sort=hello") + self.assertEqual(result.url, f"{BASE_URL}/and/a/path?sort=hello") diff --git a/bookwyrm/utils/validate.py b/bookwyrm/utils/validate.py index 459bc70a6..962d51a4e 100644 --- a/bookwyrm/utils/validate.py +++ b/bookwyrm/utils/validate.py @@ -1,7 +1,7 @@ """Validations""" from typing import Optional -from bookwyrm.settings import DOMAIN, USE_HTTPS +from bookwyrm.settings import BASE_URL def validate_url_domain(url: Optional[str]) -> Optional[str]: @@ -9,10 +9,7 @@ def validate_url_domain(url: Optional[str]) -> Optional[str]: if url is None: return None - protocol = "https://" if USE_HTTPS else "http://" - origin = f"{protocol}{DOMAIN}" + if not url.startswith(BASE_URL): + return None - if url.startswith(origin): - return url - - return None + return url diff --git a/bookwyrm/views/wellknown.py b/bookwyrm/views/wellknown.py index 0f2805ff2..e640c1c72 100644 --- a/bookwyrm/views/wellknown.py +++ b/bookwyrm/views/wellknown.py @@ -9,7 +9,7 @@ from django.utils import timezone from django.views.decorators.http import require_GET from bookwyrm import models -from bookwyrm.settings import DOMAIN, VERSION, LANGUAGE_CODE +from bookwyrm.settings import BASE_URL, DOMAIN, VERSION, LANGUAGE_CODE @require_GET @@ -34,7 +34,7 @@ def webfinger(request): }, { "rel": "http://ostatus.org/schema/1.0/subscribe", - "template": f"https://{DOMAIN}/ostatus_subscribe?acct={{uri}}", + "template": f"{BASE_URL}/ostatus_subscribe?acct={{uri}}", }, ], }