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 @@
-

+
@@ -18,9 +18,9 @@
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}}",
},
],
}