1
0
2024-06-25 08:47:56 +00:00
committed by Git OBS Bridge
commit 125e500740
17 changed files with 1511 additions and 0 deletions

23
.gitattributes vendored Normal file
View File

@@ -0,0 +1,23 @@
## Default LFS
*.7z filter=lfs diff=lfs merge=lfs -text
*.bsp filter=lfs diff=lfs merge=lfs -text
*.bz2 filter=lfs diff=lfs merge=lfs -text
*.gem filter=lfs diff=lfs merge=lfs -text
*.gz filter=lfs diff=lfs merge=lfs -text
*.jar filter=lfs diff=lfs merge=lfs -text
*.lz filter=lfs diff=lfs merge=lfs -text
*.lzma filter=lfs diff=lfs merge=lfs -text
*.obscpio filter=lfs diff=lfs merge=lfs -text
*.oxt filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.rpm filter=lfs diff=lfs merge=lfs -text
*.tbz filter=lfs diff=lfs merge=lfs -text
*.tbz2 filter=lfs diff=lfs merge=lfs -text
*.tgz filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.txz filter=lfs diff=lfs merge=lfs -text
*.whl filter=lfs diff=lfs merge=lfs -text
*.xz filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
.osc

114
README.SUSE.md Normal file
View File

@@ -0,0 +1,114 @@
HyperKitty
==========
## Configuration
The web application is configured in `/etc/hyperkitty/settings_local.py` which
is included by the default configuration in
/srv/www/webapps/mailman/hyperkitty/settings.py.
1. Optional: Change the default secret for the application:
We already created one, but feel free to replace with a stronger
alternative.
`/etc/hyperkitty/settings_local.py`:
SECRET_KEY = 'something-very-secret'
2. Make sure to disable debugging when running in production:
`/etc/hyperkitty/settings_local.py`:
DEBUG = False
3. The valid hosts or domain names for the application need to be defined:
`/etc/hyperkitty/settings_local.py`:
ALLOWED_HOSTS = [
'localhost',
'lists.example.com'
]
4. Add a valid email configuration
`/etc/hyperkitty/settings_local.py`:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_PORT = 25
EMAIL_HOST_USER = <username>
EMAIL_HOST_PASSWORD = <password>
5. To connect with a running mailman instance's REST API, configuration options
have to be added to hyperkitty's configuration.
`/etc/hyperkitty/settings_local.py`:
MAILMAN_REST_API_URL = 'http://localhost:8001'
MAILMAN_REST_API_USER = 'rest_admin'
MAILMAN_REST_API_PASS = 'rest_admin_password'
6. To configure the archive integration with a mailman instance first setup the
integration with hyperkitty on mailman's side and then configure hyperkitty
to accept those connections:
`/etc/hyperkitty/settings_local.py`:
MAILMAN_ARCHIVER_KEY = 'SecretArchiverAPIKey'
MAILMAN_ARCHIVER_FROM = ('127.0.0.1', '::1')
7. Optional: Configure postgres or another database (default: sqlite3)
8. Create and setup the database
hyperkitty-manage migrate
9. Populate the database with default data (when setting up for the first time):
hyperkitty-manage loaddata first_start
10. Create admin user
hyperkitty-manage createsuperuser
11. Enable HyperKitty async tasks runner
systemctl enable --now hyperkitty-qcluster.service
12. Enable HyperKitty runjob timers
systemctl enable hyperkitty-runjob-minutely.timer
systemctl enable hyperkitty-runjob-quarter-hourly.timer
systemctl enable hyperkitty-runjob-hourly.timer
systemctl enable hyperkitty-runjob-daily.timer
systemctl enable hyperkitty-runjob-weekly.timer
systemctl enable hyperkitty-runjob-monthly.timer
systemctl enable hyperkitty-runjob-yearly.timer
## Apache2
To configure hyperkitty with Apache and uwsgi, just add the follwing lines to a vhost:
ProxyPassMatch ^/static !
ProxyPass / unix:/run/uwsgi/uwsgi-hyperkitty.sock|uwsgi://localhost/
<Directory /srv/www/webapps/mailman/hyperkitty>
Require all granted
</Directory>
## Xapian search backend
Hyperkitty can make use of a Xapian based search backend.
`/etc/hyperkitty/settings_local.py`:
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'xapian_backend.XapianEngine',
'PATH': "/var/lib/hyperkitty/data/xapian_index",
},
}
Make sure to create the search index for all lists afterwards.
hyperkitty-manage update_index

View File

@@ -0,0 +1,302 @@
# Rewritten from upstream .patch to avoid fuzzing
Index: HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/base.html
===================================================================
--- HyperKitty-1.3.8.orig/hyperkitty/templates/hyperkitty/base.html
+++ HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/base.html
@@ -24,6 +24,11 @@
{% block additional_stylesheets %} {% endblock %}
{% block head_feed %}{% endblock %}
{% include 'hyperkitty/headers.html' %}
+ <meta property="og:site_name" content="{{ site_name }}">
+ {% block additional_og %}{% endblock %}
+ <meta property="og:url" content="{{ request.get_full_path }}">
+ <meta name="twitter:card" content="summary">
+ <meta name="twitter:url" content="{{ request.get_full_path }}">
</head>
<body>
Index: HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/errors/notimplemented.html
===================================================================
--- HyperKitty-1.3.8.orig/hyperkitty/templates/hyperkitty/errors/notimplemented.html
+++ HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/errors/notimplemented.html
@@ -7,6 +7,11 @@
{% trans "Not implemented yet" %} - {{ block.super }}
{% endblock %}
+{% block additional_og %}
+<meta property="og:title" content="{% trans "Not implemented yet" %}">
+<meta name="twitter:title" content="{% trans "Not implemented yet" %}">
+{% endblock %}
+
{% block content %}
<h1>{% trans "Not implemented" %}</h1>
Index: HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/errors/private.html
===================================================================
--- HyperKitty-1.3.8.orig/hyperkitty/templates/hyperkitty/errors/private.html
+++ HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/errors/private.html
@@ -7,6 +7,11 @@
{% trans "Error: private list" %} - {{ mlist.display_name|default:mlist.name }} - {{ block.super }}
{% endblock %}
+{% block additional_og %}
+<meta property="og:title" content="{% trans "Error: private list" %} - {{ mlist.display_name|default:mlist.name }}">
+<meta name="twitter:title" content="{% trans "Error: private list" %} - {{ mlist.display_name|default:mlist.name }}">
+{% endblock %}
+
{% block content %}
<div class="row">
Index: HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/index.html
===================================================================
--- HyperKitty-1.3.8.orig/hyperkitty/templates/hyperkitty/index.html
+++ HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/index.html
@@ -9,6 +9,11 @@
{% trans 'Available lists' %} - {{ block.super }}
{% endblock %}
+{% block additional_og %}
+<meta property="og:title" content="{% trans 'Available lists' %}">
+<meta name="twitter:title" content="{% trans 'Available lists' %}">
+{% endblock %}
+
{% block content %}
<div class="all-lists">
Index: HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/message.html
===================================================================
--- HyperKitty-1.3.8.orig/hyperkitty/templates/hyperkitty/message.html
+++ HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/message.html
@@ -1,12 +1,29 @@
{% extends "hyperkitty/base.html" %}
{% load i18n %}
{% load hk_generic %}
+{% load gravatar %}
{% block head_title %}
{{ message.subject }} - {{ mlist.display_name|default:mlist.name }} - {{ block.super }}
{% endblock %}
+{% block additional_og %}
+<meta property="og:title" content="{{ message.subject }} - {{ mlist.display_name|default:mlist.name }}">
+<meta property="og:type" content="article">
+<meta property="og:image" content="{% gravatar_url message.sender.address 200 %}">
+<meta property="og:description" content="{{ message.content|escapeemail|truncatechars:199 }}…">
+<meta property="og:article:author" content="{{ message.sender_name|default:message.sender.address|escapeemail }}">
+<meta property="og:article:published_time" content="{{ message.date|date:'c' }}">
+<meta property="og:article:section" content="{{ mlist.display_name|default:mlist.name }}">
+{% for tag in message.thread.tags.distinct %}
+<meta property="og:article:tag" content="{{ tag.name }}">
+{% endfor %}
+<meta name="twitter:title" content="{{ message.subject }} - {{ mlist.display_name|default:mlist.name }}">
+<meta name="twitter:description" content="{{ message.content|escapeemail|truncatechars:199 }}…">
+<meta name="twitter:image" content="{% gravatar_url message.sender.address 200 %}">
+{% endblock %}
+
{% block content %}
<div class="row">
Index: HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/message_new.html
===================================================================
--- HyperKitty-1.3.8.orig/hyperkitty/templates/hyperkitty/message_new.html
+++ HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/message_new.html
@@ -8,6 +8,11 @@
{% trans "Create a new thread" %} - {{ mlist.display_name|default:mlist.name }} - {{ block.super }}
{% endblock %}
+{% block additional_og %}
+<meta property="og:title" content="{% trans "Create a new thread" %} - {{ mlist.display_name|default:mlist.name }}">
+<meta name="twitter:title" content="{% trans "Create a new thread" %} - {{ mlist.display_name|default:mlist.name }}">
+{% endblock %}
+
{% block content %}
<div class="row">
Index: HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/overview.html
===================================================================
--- HyperKitty-1.3.8.orig/hyperkitty/templates/hyperkitty/overview.html
+++ HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/overview.html
@@ -4,6 +4,13 @@
{% load static %}
{% load cache %}
+{% block additional_og %}
+<meta property="og:title" content="{{ mlist.display_name|default:mlist.name }}">
+<meta property="og:description" content="{{ mlist.description|default_if_none:''|truncatechars:199 }}…">
+<meta name="twitter:title" content="{{ mlist.display_name|default:mlist.name }}">
+<meta name="twitter:description" content="{{ mlist.description|default_if_none:''|truncatechars:199 }}…">
+{% endblock %}
+
{% block head_title %}
{{ mlist.display_name|default:mlist.name }} - {{ block.super }}
{% endblock %}
Index: HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/reattach.html
===================================================================
--- HyperKitty-1.3.8.orig/hyperkitty/templates/hyperkitty/reattach.html
+++ HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/reattach.html
@@ -9,6 +9,11 @@
{% trans "Reattach a thread" %} - {{ mlist.display_name|default:mlist.name }} - {{ block.super }}
{% endblock %}
+{% block additional_og %}
+<meta property="og:title" content="{% trans "Reattach a thread" %} - {{ mlist.display_name|default:mlist.name }}">
+<meta name="twitter:title" content="{% trans "Reattach a thread" %} - {{ mlist.display_name|default:mlist.name }}">
+{% endblock %}
+
{% block content %}
<div class="row reattach-thread">
Index: HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/search_results.html
===================================================================
--- HyperKitty-1.3.8.orig/hyperkitty/templates/hyperkitty/search_results.html
+++ HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/search_results.html
@@ -8,6 +8,11 @@
{% trans "Search results for" %} "{{ query }}"{% if mlist %} - {{ mlist.display_name|default:mlist.name }} {% endif %} - {{ block.super }}
{% endblock %}
+{% block additional_og %}
+<meta property="og:title" content="{% trans "Search results for" %} "{{ query }}"{% if mlist %} - {{ mlist.display_name|default:mlist.name }} {% endif %}">
+<meta name="twitter:title" content="{% trans "Search results for" %} "{{ query }}"{% if mlist %} - {{ mlist.display_name|default:mlist.name }} {% endif %}">
+{% endblock %}
+
{% block content %}
<div class="row">
Index: HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/thread.html
===================================================================
--- HyperKitty-1.3.8.orig/hyperkitty/templates/hyperkitty/thread.html
+++ HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/thread.html
@@ -3,12 +3,29 @@
{% load i18n %}
{% load hk_generic %}
{% load static %}
+{% load gravatar %}
{% block head_title %}
{{ subject }} - {{ mlist.display_name|default:mlist.name }} - {{ block.super }}
{% endblock %}
+{% block additional_og %}
+<meta property="og:title" content="{{ subject }} - {{ mlist.display_name|default:mlist.name }}">
+<meta property="og:type" content="article">
+<meta property="og:image" content="{% gravatar_url starting_email.sender.address 200 %}">
+<meta property="og:description" content="{{ starting_email.content|escapeemail|truncatechars:199 }}…">
+<meta property="og:article:author" content="{{ starting_email.sender_name|default:starting_email.sender.address|escapeemail }}">
+<meta property="og:article:published_time" content="{{ starting_email.date|date:'c' }}">
+<meta property="og:article:section" content="{{ mlist.display_name|default:mlist.name }}">
+{% for tag in thread.tags.distinct %}
+<meta property="og:article:tag" content="{{ tag.name }}">
+{% endfor %}
+<meta name="twitter:title" content="{{ subject }} - {{ mlist.display_name|default:mlist.name }}">
+<meta name="twitter:description" content="{{ starting_email.content|escapeemail|truncatechars:199 }}…">
+<meta name="twitter:image" content="{% gravatar_url starting_email.sender.address 200 %}">
+{% endblock %}
+
{% block content %}
<div class="row view-thread d-flex">
Index: HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/thread_list.html
===================================================================
--- HyperKitty-1.3.8.orig/hyperkitty/templates/hyperkitty/thread_list.html
+++ HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/thread_list.html
@@ -13,6 +13,13 @@
<link rel="alternate" type="application/rss+xml" title="{{ mlist.display_name }}" href="{% url 'hk_list_feed' mlist_fqdn=mlist.name %}"/>
{% endblock %}
+{% block additional_og %}
+<meta property="og:title" content="{{ list_title }} - {{ mlist.display_name|default:mlist.name }}">
+<meta property="og:description" content="{{ mlist.description|default_if_none:''|truncatechars:199 }}…">
+<meta name="twitter:title" content="{{ list_title }} - {{ mlist.display_name|default:mlist.name }}">
+<meta name="twitter:description" content="{{ mlist.description|default_if_none:''|truncatechars:199 }}…">
+{% endblock %}
+
{% block content %}
<div class="row">
Index: HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/user_posts.html
===================================================================
--- HyperKitty-1.3.8.orig/hyperkitty/templates/hyperkitty/user_posts.html
+++ HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/user_posts.html
@@ -8,6 +8,11 @@
{% trans "Messages by" %} {{ fullname }}{% if mlist %} - {{ mlist.display_name|default:mlist.name }} {% endif %} - {{ block.super }}
{% endblock %}
+{% block additional_og %}
+<meta property="og:title" content="{% trans "Messages by" %} {{ fullname }}{% if mlist %} - {{ mlist.display_name|default:mlist.name }} {% endif %}">
+<meta name="twitter:title" content="{% trans "Messages by" %} {{ fullname }}{% if mlist %} - {{ mlist.display_name|default:mlist.name }} {% endif %}">
+{% endblock %}
+
{% block content %}
<div class="row">
Index: HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/user_profile/base.html
===================================================================
--- HyperKitty-1.3.8.orig/hyperkitty/templates/hyperkitty/user_profile/base.html
+++ HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/user_profile/base.html
@@ -5,6 +5,11 @@
{% trans "User posting activity" %} - {{ block.super }}
{% endblock %}
+{% block additional_og %}
+<meta property="og:title" content="{% trans "User posting activity" %}">
+<meta name="twitter:title" content="{% trans "User posting activity" %}">
+{% endblock %}
+
{% block content %}
<div class="user-profile">
Index: HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/user_public_profile.html
===================================================================
--- HyperKitty-1.3.8.orig/hyperkitty/templates/hyperkitty/user_public_profile.html
+++ HyperKitty-1.3.8/hyperkitty/templates/hyperkitty/user_public_profile.html
@@ -1,12 +1,20 @@
{% extends "hyperkitty/base.html" %}
{% load i18n %}
{% load hk_generic %}
+{% load gravatar %}
{% block head_title %}
{% trans 'User Profile' %} {% trans "for" %} {{ fullname }} - {{ block.super }}
{% endblock %}
+{% block additional_og %}
+<meta property="og:title" content="{% trans 'User Profile' %} {% trans "for" %} {{ fullname }}">
+<meta property="og:image" content="{% gravatar_url addresses.0 200 %}">
+<meta name="twitter:title" content="{% trans 'User Profile' %} {% trans "for" %} {{ fullname }}">
+<meta name="twitter:image" content="{% gravatar_url addresses.0 200 %}">
+{% endblock %}
+
{% block content %}
<div class="user-profile user-public-profile">
Index: HyperKitty-1.3.8/hyperkitty/tests/views/test_accounts.py
===================================================================
--- HyperKitty-1.3.8.orig/hyperkitty/tests/views/test_accounts.py
+++ HyperKitty-1.3.8/hyperkitty/tests/views/test_accounts.py
@@ -197,7 +197,7 @@ class AccountViewsTestCase(TestCase):
"?list=list@example.com")
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Dummy content", count=1, html=False)
- self.assertContains(response, "Dummy Sender", count=5, html=False)
+ self.assertContains(response, "Dummy Sender", count=7, html=False)
self.assertContains(
response,
'<a name="{}" href="{}">Dummy message</a>'.format(
Index: HyperKitty-1.3.8/hyperkitty/tests/views/test_message.py
===================================================================
--- HyperKitty-1.3.8.orig/hyperkitty/tests/views/test_message.py
+++ HyperKitty-1.3.8/hyperkitty/tests/views/test_message.py
@@ -124,8 +124,8 @@ class MessageViewsTestCase(TestCase):
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Dummy message")
- self.assertContains(response, "Dummy Sender", count=1)
- self.assertContains(response, "Dummy Subject", count=2)
+ self.assertContains(response, "Dummy Sender", count=2)
+ self.assertContains(response, "Dummy Subject", count=4)
self.assertNotContains(response, "dummy@example.com")
self.assertContains(
response,

View File

@@ -0,0 +1,51 @@
diff --git a/hyperkitty/feed.py b/hyperkitty/feed.py
index 8242662c2158be7b34527cf933565588892ce25f..a9bd9ae546aa51f717b07b6c270b769e9e8c775f 100644
--- a/hyperkitty/feed.py
+++ b/hyperkitty/feed.py
@@ -16,7 +16,7 @@
# You should have received a copy of the GNU General Public License along with
# HyperKitty. If not, see <http://www.gnu.org/licenses/>.
#
-# Author: Stasiek Michalski <stasiek@michalski.cc>
+# Author: Jacob Michalskie <jacob@michalskie.cc>
#
import re
@@ -43,20 +43,32 @@ def sanitize(x):
class MailingListFeed(Feed):
def get_object(self, request, mlist_fqdn):
- return get_object_or_404(MailingList, name=mlist_fqdn)
+ return {'mlist': get_object_or_404(MailingList, name=mlist_fqdn),
+ 'params': request.GET}
def title(self, obj):
- return sanitize(obj.display_name)
+ return sanitize(obj['mlist'].display_name)
def link(self, obj):
- return reverse("hk_list_overview", kwargs={"mlist_fqdn": obj.name})
+ return reverse("hk_list_overview",
+ kwargs={"mlist_fqdn": obj['mlist'].name})
def description(self, obj):
- return sanitize(obj.description)
+ return sanitize(obj['mlist'].description)
def items(self, obj):
len = getattr(settings, 'HYPERKITTY_MLIST_FEED_LENGTH', 30)
- return Email.objects.filter(mailinglist=obj).order_by('-date')[:len]
+ emails = Email.objects.filter(mailinglist=obj['mlist'])
+ if 'subject' in obj['params']:
+ emails = emails.filter(subject__regex=obj['params']['subject'])
+ if 'sender' in obj['params']:
+ emails = emails.filter(sender_name__regex=obj['params']['email'])
+ if 'threads' in obj['params']:
+ emails = emails.filter(thread_depth=0)
+ if 'limit' in obj['params']:
+ if int(obj['params']['limit']) < len:
+ len = int(obj['params']['limit'])
+ return emails.order_by('-date')[:len]
def item_title(self, item):
return sanitize(item.subject)

3
hyperkitty-1.3.10.tar.gz Normal file
View File

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7cb1a021c5813d92ec3d174482f70f1b46174364f7d9b423586ee4f347f71e7b
size 2204682

View File

@@ -0,0 +1,16 @@
-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEEVB6gRIRTOU/3eg7MnZsroGHQpnwFAmZ2g7oACgkQnZsroGHQ
pnxfTQ/+J5TIlLOZ7XNrBhprfZYp0zhU5TmLkHhCTLbm/06SyvGNspEcqqQicLSJ
YZEkKF4CPByLMCTDvVLiEjjiaaq9S+MJ+FVkASZKPrvogRDxVmB//whIJWjhWYfQ
VPMqj8fflZiuLNLqmfFf7AU2mZbn/y6+ODS2+vDeNISydze5pFEUyLTfk+VXf+X3
9btHzvRjCXC8s7Buj9GaDID0hYU3aYyyLoVMSqnQ0ESqd4YHpSX5+q0PpkTmFuhH
DR/I1vCDsbj4HMvzPJx1dFFEKysMjOmRPqVSTaGGj51EiFZJReraNZ6zSKh4uclx
dO1rE4yqD5l7HkrTCBd7n+Lr3jefJDaTtUjHwTDC2EAC4Z3JfrvB0rczPcTKpzFp
s61fePie43JU/aXfhvObHs/++FZKmLC7B2Q4OpWRQpAIikDcQimLCYOXqpc8WAqo
13CrpRIQXUh5oQuUH69WHDgw/U0QTWtbpYEIDJZ4Ls9MrEeLwJIaM9JZnuBCPUm7
o358JVdBwL/w65BxK4Csk4Y32W8sJM5XF0JtJ+Yzf4PAd6gk2gUetLkRikphih24
2TFzR4Upvc5DJWIM8uitmxFpxo4dmnctbg7bLrWMsvs9Yw4M8kuEVR9QdrNr1ZYS
Thzg/WkYKi0x+BtXE0JxtJ66y+h+hWXQ0ARN9h4XZP7V41UWR+o=
=6rnT
-----END PGP SIGNATURE-----

3
hyperkitty-manage.sh Normal file
View File

@@ -0,0 +1,3 @@
#!/bin/bash
sudo -u hyperkitty /usr/bin/python3 /srv/www/webapps/mailman/hyperkitty/manage.py "$@"

View File

@@ -0,0 +1,12 @@
[Unit]
Description=HyperKitty async tasks runner
After=network.target remote-fs.target
[Service]
ExecStart=/usr/bin/python3 /srv/www/webapps/mailman/hyperkitty/manage.py qcluster --pythonpath /srv/www/webapps/mailman/hyperkitty/ --settings settings
User=hyperkitty
Restart=always
[Install]
WantedBy=multi-user.target

View File

@@ -0,0 +1,8 @@
[Unit]
Description=HyperKitty runjob @HYPERKITTY_RUNJOB@
[Service]
Type=oneshot
ExecStart=/usr/bin/python3 /srv/www/webapps/mailman/hyperkitty/manage.py runjob @HYPERKITTY_RUNJOB@ --pythonpath /srv/www/webapps/mailman/hyperkitty/ --settings settings
User=hyperkitty
Group=hyperkitty

10
hyperkitty-runjob.timer Normal file
View File

@@ -0,0 +1,10 @@
[Unit]
Description=HyperKitty runjob @HYPERKITTY_RUNJOB@
[Timer]
@HYPERKITTY_RUNJOB_CALENDAR@
@HYPERKITTY_RUNJOB_DELAY@
Persistent=true
[Install]
WantedBy=basic.target

31
hyperkitty-settings.patch Normal file
View File

@@ -0,0 +1,31 @@
Index: HyperKitty-1.3.6/example_project/settings.py
===================================================================
--- HyperKitty-1.3.6.orig/example_project/settings.py 2022-05-19 03:16:49.000000000 +0200
+++ HyperKitty-1.3.6/example_project/settings.py 2022-11-21 10:36:26.670671874 +0100
@@ -134,7 +134,7 @@ DATABASES = {
# Use 'sqlite3', 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'ENGINE': 'django.db.backends.sqlite3',
# DB name or path to database file if using sqlite3.
- 'NAME': os.path.join(BASE_DIR, 'hyperkitty.db'),
+ 'NAME': '/var/lib/hyperkitty/data/hyperkitty.db',
# The following settings are not used with sqlite3:
'USER': 'hyperkitty',
'PASSWORD': 'hkpass',
@@ -205,7 +205,7 @@ USE_TZ = True
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/var/www/example.com/static/"
-STATIC_ROOT = os.path.join(BASE_DIR, 'static')
+STATIC_ROOT = '/srv/www/webapps/mailman/hyperkitty/static'
# URL prefix for static files.
# Example: "http://example.com/static/", "http://static.example.com/"
@@ -386,7 +386,7 @@ LOGGING = {
'level': 'INFO',
#'class': 'logging.handlers.RotatingFileHandler',
'class': 'logging.handlers.WatchedFileHandler',
- 'filename': os.path.join(BASE_DIR, 'hyperkitty.log'),
+ 'filename': '/var/log/hyperkitty/hyperkitty.log',
'formatter': 'verbose',
},
'console': {

17
hyperkitty.uwsgi Normal file
View File

@@ -0,0 +1,17 @@
[uwsgi]
#plugin = apparmor
#apparmor-hat = hyperkitty
uid = hyperkitty
gid = hyperkitty
processes = 1
threads = 25
socket = /run/uwsgi/uwsgi-hyperkitty.sock
chmod-socket = 660
chown-socket = wwwrun:www
plugin = python3
chdir = /srv/www/webapps/mailman/hyperkitty
module = wsgi

View File

@@ -0,0 +1,6 @@
addFilter("zero-length")
addFilter("non-standard-gid")
addFilter("non-standard-uid")
addFilter("spurious-executable-perm .*example_project/wsgi.py")
addFilter("hidden-file-or-dir .*example_project/logs/.keep")
addFilter("obsolete-not-provided python3-HyperKitty")

401
python-HyperKitty.changes Normal file
View File

@@ -0,0 +1,401 @@
-------------------------------------------------------------------
Sun Jun 23 08:37:43 UTC 2024 - Andreas Schneider <asn@cryptomilk.org>
- Update to version 1.3.10
* https://gitlab.com/mailman/hyperkitty/-/releases/1.3.10
-------------------------------------------------------------------
Sat Mar 2 07:57:47 UTC 2024 - Andreas Schneider <asn@cryptomilk.org>
- Update to version 1.3.9
* https://gitlab.com/mailman/hyperkitty/-/releases/1.3.9
- Removed mistune3.patch
-------------------------------------------------------------------
Thu Feb 29 19:57:33 UTC 2024 - Ben Greiner <code@bnavigator.de>
- Simplify python flavor selection
* Go back to primary python3 on Tumbleweed
* Use SLE15 python module pythons on 15.x
- Build PEP517 wheel
-------------------------------------------------------------------
Wed Feb 28 06:46:36 UTC 2024 - Andreas Schneider <asn@cryptomilk.org>
- Fix building on SLE15 based distributions
-------------------------------------------------------------------
Sat Feb 24 20:34:06 UTC 2024 - Georg Pfuetzenreuter <mail+rpm@georg-pfuetzenreuter.net>
- Split out system user
-------------------------------------------------------------------
Fri Feb 23 22:20:00 UTC 2024 - Georg Pfuetzenreuter <mail+rpm@georg-pfuetzenreuter.net>
- Build for Python 3.12
-------------------------------------------------------------------
Mon Nov 6 12:05:07 UTC 2023 - Marcus Rueckert <mrueckert@suse.de>
- forgot to use 2 defined variables:
%{django_haystack_min_version}
%{django_extensions_min_version}
-------------------------------------------------------------------
Mon Nov 6 11:47:26 UTC 2023 - Marcus Rueckert <mrueckert@suse.de>
- make it easy to run a build without testsuite
osc build --without=testsuite
-------------------------------------------------------------------
Mon Nov 6 01:20:05 UTC 2023 - Marcus Rueckert <mrueckert@suse.de>
- ensure that we can create the user and group
-------------------------------------------------------------------
Mon Nov 6 01:10:25 UTC 2023 - Marcus Rueckert <mrueckert@suse.de>
- make user and group creation verbose so we actually see errors
-------------------------------------------------------------------
Mon Nov 6 00:05:35 UTC 2023 - Marcus Rueckert <mrueckert@suse.de>
- make it easier to notice to keep buildrequires and runtime
requires version limits in sync. This will also help us to notice
early when the version of other libraries do not match the
requires encoded in the source code.
-------------------------------------------------------------------
Sun Nov 5 23:32:56 UTC 2023 - Marcus Rueckert <mrueckert@suse.de>
- refresh gl-mr300-add-opengraph-metadata.patch for version update
-------------------------------------------------------------------
Thu Nov 2 09:27:37 UTC 2023 - Andreas Schneider <asn@cryptomilk.org>
- Update to version 1.3.8
* See https://gitlab.com/mailman/hyperkitty/-/blob/v1.3.8/doc/news.rst
or the file news.ret included in this package
- Removed fix-elasticsearch8.patch
- Updated mistune3.patch
-------------------------------------------------------------------
Thu Oct 5 08:21:08 UTC 2023 - Markéta Machová <mmachova@suse.com>
- Add mistune3.patch to fix compatibility with mistune 3.0
-------------------------------------------------------------------
Sun Jul 30 03:50:42 UTC 2023 - Georg Pfuetzenreuter <georg.pfuetzenreuter@suse.com>
- Add upstream patch gl-mr300-add-opengraph-metadata.patch:
* Add OpenGraph Metadata (https://gitlab.com/mailman/hyperkitty/-/merge_requests/300)
- Add upstream patch gl-mr470-introduce-feed-filtering.patch:
* Introduce feed filtering (https://gitlab.com/mailman/hyperkitty/-/merge_requests/470)
-------------------------------------------------------------------
Thu Jul 6 09:33:42 UTC 2023 - Andreas Schneider <asn@cryptomilk.org>
- Add missing dependency to whoosh
-------------------------------------------------------------------
Sun Jul 2 06:29:45 UTC 2023 - Andreas Schneider <asn@cryptomilk.org>
- Fix uwsgi requirement
-------------------------------------------------------------------
Sat Jul 1 10:03:57 UTC 2023 - Andreas Schneider <asn@cryptomilk.org>
- Use sle15_python_module_pythons
- Some spec file fixes
-------------------------------------------------------------------
Sat Jul 1 09:13:51 UTC 2023 - Andreas Schneider <asn@cryptomilk.org>
- Add BuildRequires for sassc
-------------------------------------------------------------------
Sun Jun 18 16:12:47 UTC 2023 - Andreas Schneider <asn@cryptomilk.org>
- Update to version 1.3.7
* ``hyperkitty_import`` will now import messages to a list with archiving
disabled. (Closes #451)
* Add support for Python 3.11.
- Use sle15_python_module_pythons
-------------------------------------------------------------------
Wed Apr 5 09:44:44 UTC 2023 - Andreas Schneider <asn@cryptomilk.org>
- Add missing requires for sassc used by manage.py
-------------------------------------------------------------------
Mon Nov 21 09:34:53 UTC 2022 - Andreas Schneider <asn@cryptomilk.org>
- Update to version 1.3.6
* Fixed an issue in hyperkitty_import with an empty Message-ID. (Closes #396)
* Set Q_CLUSTER retry > timeout in example_project. (Closes #402)
* Set DEFAULT_AUTO_FIELD to silence errors with Django >= 3.2.
* Require mistune >= 2.0.0 and fix a problem with importing from it. (Closes
#395)
* Adapt parsing of emails to be compatible with python 3.10. (Closes #401)
* Add gitlab-ci integration for python 3.10.
* Skip lists with private archives in the find list search. (Closes #237)
* Add a new setting HYPERKITTY_MBOX_EXPORT which, when set to false, removes
the :guilabel:`Download` button and disables the export view. ( Fixes #386)
* Return 400 instead of 500 when the sort mode is invalid. (Fixes #270)
* Allow HyperKitty to find attachments in either the database or the
HYPERKITTY_ATTACHMENT_FOLDER. (Closes #213)
* Implemented a new attachments_to_file management command to move attachment
content to the file system after setting HYPERKITTY_ATTACHMENT_FOLDER.
(Closes #413)
* Handle exception when a banned address tries to post. (Fixes #325)
* Add an index on the 'name' column (fqdn)for the MailingList table since it
is most frequently used to query the MailingList object.
* Add the ability to view a thread without Javascript enabled. This uses the
same mechanism we use with bot-detection and rendering of the entire page
at once, which will be slow to load but allow reading. (See #422)
* Improve the performance of the thread view for logged-in users by
optimizing the total database calls made. (See !409)
* Add support for Django <= 4.1
* Remove support for Django < 3.2
* Remove support for Python 3.6
* Fix tests to be compatible with Python 3.10
* Replace use of mock with unittest.mock in all tests. (Closes #429)
* The check for writability of HYPERKITTY_ATTACHMENT_FOLDER when set has been
improved to avoid a potential race condition. (Closes #389)
- Run complete testsuite with pytest
- Removed hyperkitty-django4.patch
- Removed hyperkitty-fix-mistune-2.0-imports.patch
- Removed python-HyperKitty-no-mock.patch
- Removed hyperkitty-fix-qcluster-timeout.patch
- Removed hyperkitty-fix-py310-tests.patch
- Removed fix-django41.patch
-------------------------------------------------------------------
Thu Oct 6 12:07:43 UTC 2022 - Daniel Garcia <daniel.garcia@suse.com>
- Add fix-django41.patch to fix issues with django4.1
- Add fix-elasticsearch8.patch to fix issues with elasticsearch 8.0.0
-------------------------------------------------------------------
Mon Jul 4 11:02:04 UTC 2022 - Ben Greiner <code@bnavigator.de>
- Rename the built package to python prefixless HyperKitty
* Doesn't imply any false impression of multiflavor
- Go back to python39 -- highest supported Python by mailman
-------------------------------------------------------------------
Sun Jul 3 20:46:20 UTC 2022 - Ben Greiner <code@bnavigator.de>
- Add hyperkitty-fix-py310-tests.patch
* Fix test failures on Python 3.10 (and Python 3.9.13)
* https://gitlab.com/mailman/hyperkitty/-/issues/401
* https://gitlab.com/mailman/hyperkitty/-/merge_requests/381
* https://gitlab.com/mailman/hyperkitty/-/merge_requests/449
-------------------------------------------------------------------
Sat Jul 2 06:12:09 UTC 2022 - Andreas Schneider <asn@cryptomilk.org>
- Fix django warning that timeout is bigger than retry
* Added hyperkitty-fix-qcluster-timeout.patch
-------------------------------------------------------------------
Fri Jun 10 08:14:18 UTC 2022 - Andreas Schneider <asn@cryptomilk.org>
- First Make migrations on update, then call migrate
-------------------------------------------------------------------
Thu May 26 09:19:37 UTC 2022 - pgajdos@suse.com
- do not require python-mock for build
- added patches
fix https://gitlab.com/mailman/hyperkitty/-/issues/429
+ python-HyperKitty-no-mock.patch
-------------------------------------------------------------------
Tue Dec 28 07:02:11 UTC 2021 - John Vandenberg <jayvdb@gmail.com>
- Add hyperkitty-django4.patch to support Django 4
-------------------------------------------------------------------
Fri Dec 17 10:25:31 UTC 2021 - Matej Cepl <mcepl@suse.com>
- Add hyperkitty-fix-mistune-2.0-imports.patch ... two function
moved in mistune 2.0 (gl#mailman/hyperkitty#379).
-------------------------------------------------------------------
Thu Dec 16 15:11:02 UTC 2021 - Sasi Olin <hel@lcp.world>
- Add a patch that fixes compatibility with the full release of mistune 2.0
-------------------------------------------------------------------
Wed Nov 17 08:30:52 UTC 2021 - Andreas Schneider <asn@cryptomilk.org>
- Update to version 1.3.5
* https://gitlab.com/mailman/hyperkitty/-/blob/1.3.5/doc/news.rst
- Fixes CVE-2021-35057
- Removed obsolete python-HyperKitty-CVE-2021-33038.patch
-------------------------------------------------------------------
Wed Jun 2 18:33:55 UTC 2021 - Andreas Schneider <asn@cryptomilk.org>
- Fix log dir permissions
-------------------------------------------------------------------
Wed Jun 2 12:25:48 UTC 2021 - pgajdos@suse.com
- security update
- added patches
fix CVE-2021-33038 [bsc#1186575], information disclosure when importing a private mailing list
+ python-HyperKitty-CVE-2021-33038.patch
-------------------------------------------------------------------
Wed May 26 14:04:05 UTC 2021 - Andreas Schneider <asn@cryptomilk.org>
- Remove the hyperkitty-admin user
-------------------------------------------------------------------
Tue May 25 18:55:19 UTC 2021 - Andreas Schneider <asn@cryptomilk.org>
- Create static files as part of the build process
- Fixed CVE-2021-25322
-------------------------------------------------------------------
Tue May 4 09:31:59 UTC 2021 - Ben Greiner <code@bnavigator.de>
- restrict to primary python3 flavor due to mailman
-------------------------------------------------------------------
Wed Feb 3 12:29:57 UTC 2021 - Andreas Schneider <asn@cryptomilk.org>
- Update to version 1.3.4
* Sync owners and moderators from Mailman Core for MailingList. (Fixes #302)
* Implemented a new HYPERKITTY_JOBS_UPDATE_INDEX_LOCK_LIFE setting to set the
lock lifetime for the update_and_clean_index job. (Closes #300)
* Implemented a new HYPERKITTY_ALLOW_WEB_POSTING that allows disabling the
web posting feature. (Closes #264)
* Add the ability to disable Gravatar using HYPERKITTY_ENABLE_GRAVATAR
settings. (Closes #303)
* Replaced deprecated ugettext functions with gettext. (Closes #310)
* Fix export of Email message where the In-Reply-To header doesnt include
the <> brackets. (Closes #331)
* We now catch a few more exceptions in hyperkitty_import when getting
messages from a mbox. (Closes #313 and #314)
* Added a new contrib/check_hk_import script to check mboxes before running
hyperkitty_import.
* We now ignore a ValueError in hyperkitty_import when trying to replace a
Subject: header. (Closes #317)
* hyperkitty_import now includes the mbox name in error messages when
importing multiple mboxes. (Closes #318)
* `` at `` is now only replaced with @ in From: header values when necessary
and not unconditionally. (Closes #320)
* The wildcard notation for any host '*' is now supported into
MAILMAN_ARCHVER_FROM to disable Hyperkitty clients IP checking.
* Join the searchbar and search button like it was before bootstrap 4
migration. (See !301)
* Use the umd builds for popper.js instead of the regular ones. (See !309)
* Exceptions thrown by smtplib in sending replies are now caught and give an
appropriate error message. (Closes #309)
- Removed hyperkitty-fix-tests.patch
- Fixed build on tumbleweed
-------------------------------------------------------------------
Mon Dec 28 08:32:51 UTC 2020 - Andreas Schneider <asn@cryptomilk.org>
- Fix quarter hourly timer
-------------------------------------------------------------------
Sun Dec 20 14:37:27 UTC 2020 - Andreas Schneider <asn@cryptomilk.org>
- Fix access to CACHE dir
- Improve documentation (README.SUSE.md)
- Fix quaterly timer and service
-------------------------------------------------------------------
Sun Dec 13 11:16:18 UTC 2020 - Andreas Schneider <asn@cryptomilk.org>
- Added hyperkitty-qcluster.service
- Added hyperkitty-runjob.service and hyperkitty-runjob.timer
-------------------------------------------------------------------
Sat Dec 12 19:43:44 UTC 2020 - Andreas Schneider <asn@cryptomilk.org>
- Create a HyperKitty-web package with webroot files
- Create a HyperKitty-web-uwsgi with uwsgi configuration
- Added hyperkitty-settings.patch
* Sets the FHS default paths
- Added hyperkitty-fix-tests.patch
* Make migration compatible with django >= 3.1
- Added rpmlint config
-------------------------------------------------------------------
Tue Aug 4 01:35:17 UTC 2020 - Stasiek Michalski <stasiek@michalski.cc>
- Version update to 1.3.3
* Allow SHOW_INACTIVE_LISTS_DEFAULT setting to be configurable. (Closes #276)
* Fix a bug where the user couldnt chose the address to send reply or new post as. (Closes #288)
* Improve the Django admin command reference from hyperkitty_import. (Closes #281)
* Fix FILTER_VHOST to work with web hosts other than the email host. (Closes #254)
* Fixed a bug where export can fail if certain headers are wrapped. (Closes #292)
* Fixed hyperkitty_import to allow odd line endings in a folded message subject. (Closes #280)
* Fixed a bug that could throw an IndexError when exporting messages. (Closes #293)
* Use errors='replace' when encoding attachments. (Closes #294)
- Drop merged python-HyperKitty-remove-legacy-use-of-available_attrs.patch
-------------------------------------------------------------------
Thu May 14 12:57:07 UTC 2020 - pgajdos@suse.com
- version update to 1.3.2
- Remove support for Django 1.11. (Closes #273)
- Skip ``Thread.DoesNotExist`` exception when raised within
``rebuild_thread_cache_votes``. (Closes #245)
- Send 400 status code for ``ValueError`` when archiving. (Closes #271)
- Fix a bug where exception for elasticsearch backend would not be caught. (Closes #263)
- added patches
https://gitlab.com/mailman/hyperkitty/-/commit/03c99ad5beefeac4474b5a00c840fd9debccba02
+ python-HyperKitty-remove-legacy-use-of-available_attrs.patch
-------------------------------------------------------------------
Fri Jan 10 12:30:33 UTC 2020 - pgajdos@suse.com
- fix dependency (django_compressor -> django-compressor)
-------------------------------------------------------------------
Tue Dec 10 14:34:40 UTC 2019 - pgajdos@suse.com
- version update to 1.3.1
* Add support to delete mailing list. (Closes #3)
* Fix a bug where messages with attachments would skip adding the body when
exporting the email. (Closes #252)
* Fix a bug where exporting mbox with messages that have attachments saved
to disk would raise exception and return a corrupt mbox. (Closes #258)
* Fix a bug where downloaded attachments are returned as a memoryview object
instead of bytes and hence fail to download. (Closes #247)
* Fix a bug where migrations would fail with exceptions on postgresl. (Closes
#266)
* Add support for Django 3.0.
-------------------------------------------------------------------
Mon Dec 2 10:47:13 UTC 2019 - pgajdos@suse.com
- call spec-cleaner
-------------------------------------------------------------------
Wed Nov 27 13:38:35 UTC 2019 - pgajdos@suse.com
- package documentation
-------------------------------------------------------------------
Wed Nov 27 13:09:09 UTC 2019 - pgajdos@suse.com
- require python-libsass
-------------------------------------------------------------------
Thu Nov 14 20:58:30 UTC 2019 - pgajdos@suse.com
- run the testsuite correctly
-------------------------------------------------------------------
Tue Oct 1 09:06:27 UTC 2019 - pgajdos@suse.com
- initial version 1.3.0 [SLE-7686]

90
python-HyperKitty.keyring Normal file
View File

@@ -0,0 +1,90 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
13uS0qfwHEvxfNbR011PQGPf7eD4e4i0uh4IcTw=
=s7HB
-----END PGP PUBLIC KEY BLOCK-----

423
python-HyperKitty.spec Normal file
View File

@@ -0,0 +1,423 @@
#
# spec file for package python-HyperKitty
#
# Copyright (c) 2024 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
%bcond_without testsuite
# keep in sync with setup.py
%global django_min_version 3.2
%global django_max_version 4.3
%global django_mailman3_min_version 1.3.13
%global django_gravatar2_min_version 1.0.6
%global djangorestframework_min_version 3.0.0
%global robot_detection_min_version 0.3
%global pytz_min_version 2012
%global django_compressor_min_version 1.3
%global mailmanclient_min_version 3.3.3
# original this was >= 2.0.0, < 3.0 but overwritten by mistune3.patch
%global mistune_min_version 3.0
%global python_dateutil_min_version 2.0
%global networkx_min_version 2.0
%global django_haystack_min_version 2.8.0
%global django_extensions_min_version 1.3.7
%global flufl_lock_min_version 4.0
%global django_q_min_version 1.0.0
%global webapps_dir /srv/www/webapps
%global hyperkitty_pkgname HyperKitty
%global lowname hyperkitty
%global hyperkitty_basedir %{webapps_dir}/mailman/hyperkitty
%global hyperkitty_localedir %{hyperkitty_basedir}/locale
%global hyperkitty_staticdir %{hyperkitty_basedir}/static
%global hyperkitty_etcdir %{_sysconfdir}/hyperkitty
%global hyperkitty_libdir %{_localstatedir}/lib/hyperkitty
%global hyperkitty_logdir %{_localstatedir}/log/hyperkitty
%global hyperkitty_datadir %{hyperkitty_libdir}/data
%global hyperkitty_services hyperkitty-qcluster.service hyperkitty-runjob-daily.service hyperkitty-runjob-daily.timer hyperkitty-runjob-hourly.service hyperkitty-runjob-hourly.timer hyperkitty-runjob-minutely.service hyperkitty-runjob-minutely.timer hyperkitty-runjob-monthly.service hyperkitty-runjob-monthly.timer hyperkitty-runjob-quarter-hourly.service hyperkitty-runjob-quarter-hourly.timer hyperkitty-runjob-weekly.service hyperkitty-runjob-weekly.timer hyperkitty-runjob-yearly.service hyperkitty-runjob-yearly.timer
# keep in sync with python-postorius/python-mailman-web
# Always only build one flavor: primary python for TW, python311 from the SLE15 python module for 15.x
%if 0%{?suse_version} >= 1550
%define pythons python3
%else
%{?sle15_python_module_pythons}
%endif
%global mypython %pythons
%global mypython_sitelib %{expand:%%{%{mypython}_sitelib}}
%global __mypython %{expand:%%{__%{mypython}}}
%define plainpython python
Name: python-HyperKitty
Version: 1.3.10
Release: 0
Summary: A web interface to access GNU Mailman v3 archives
License: GPL-3.0-only
URL: https://gitlab.com/mailman/hyperkitty
#
Source0: https://gitlab.com/mailman/hyperkitty/-/releases/%{version}/downloads/hyperkitty-%{version}.tar.gz
Source1: https://gitlab.com/mailman/hyperkitty/-/releases/%{version}/downloads/hyperkitty-%{version}.tar.gz.asc
Source2: python-HyperKitty.keyring
Source3: python-HyperKitty-rpmlintrc
#
Source10: hyperkitty-manage.sh
Source12: hyperkitty.uwsgi
#
Source20: hyperkitty-qcluster.service
Source21: hyperkitty-runjob.service
Source22: hyperkitty-runjob.timer
#
Source30: README.SUSE.md
#
# PATCH-FIX-OPENSUSE hyperkitty-settings.patch mcepl@suse.com
# hard-code locations of configuration files
Patch0: hyperkitty-settings.patch
#
# PATCH-FIX-UPSTREAM gl-mr300-add-opengraph-metadata.patch gl#mailman/hyperkitty#300
Patch98: gl-mr300-add-opengraph-metadata.patch
# PATCH-FIX-UPSTREAM gl-mr470-introduce-feed-filtering.patch gl#mailman/hyperkitty#470
Patch99: gl-mr470-introduce-feed-filtering.patch
#
BuildRequires: %{python_module Django >= %{django_min_version} with %python-Django < %{django_max_version}}
BuildRequires: %{python_module Whoosh}
BuildRequires: %{python_module django-compressor >= %{django_compressor_min_version}}
BuildRequires: %{python_module django-debug-toolbar >= 2.2}
BuildRequires: %{python_module django-extensions >= %{django_extensions_min_version}}
BuildRequires: %{python_module django-gravatar2 >= %{django_gravatar2_min_version}}
BuildRequires: %{python_module isort}
BuildRequires: %{python_module mailmanclient >= %{mailmanclient_min_version}}
BuildRequires: %{python_module mistune >= %{mistune_min_version}}
BuildRequires: %{python_module pdm}
BuildRequires: %{python_module pip}
BuildRequires: %{python_module setuptools}
BuildRequires: %{python_module wheel}
BuildRequires: %{python_module xapian-haystack >= 2.1.0}
BuildRequires: acl
BuildRequires: fdupes
BuildRequires: openssl
BuildRequires: python-rpm-macros
BuildRequires: rsync
BuildRequires: sassc
BuildRequires: sudo
BuildArch: noarch
%if 0%{?suse_version} >= 1550
# use the real python3 primary for rpm pythondistdeps.py
BuildRequires: python3-packaging
%endif
# SECTION test requirements
BuildRequires: %{python_module Whoosh >= 2.5.7}
BuildRequires: %{python_module beautifulsoup4 >= 4.3.2}
BuildRequires: %{python_module django-haystack >= %{django_haystack_min_version}}
BuildRequires: %{python_module django-mailman3 >= %{django_mailman3_min_version}}
BuildRequires: %{python_module django-q >= %{django_q_min_version}}
BuildRequires: %{python_module djangorestframework >= %{djangorestframework_min_version}}
BuildRequires: %{python_module elasticsearch}
BuildRequires: %{python_module flufl.lock >= %{flufl_lock_min_version}}
BuildRequires: %{python_module lxml}
BuildRequires: %{python_module mistune >= %{mistune_min_version}}
BuildRequires: %{python_module networkx >= %{networkx_min_version}}
BuildRequires: %{python_module pytest-django}
BuildRequires: %{python_module pytest}
BuildRequires: %{python_module python-dateutil >= %{python_dateutil_min_version}}
BuildRequires: %{python_module pytz >= %{pytz_min_version}}
BuildRequires: %{python_module robot-detection >= %{robot_detection_min_version}}
# /SECTION
%description
A web interface to access GNU Mailman v3 archives.
%package -n %{hyperkitty_pkgname}
Summary: A web interface to access GNU Mailman v3 archives
# important sync with
Requires: (%{mypython}-Django >= %{django_min_version} with %{mypython}-Django < %{django_max_version})
Requires: %{mypython}-django-compressor >= %{django_compressor_min_version}
Requires: %{mypython}-django-debug-toolbar >= 2.2
Requires: %{mypython}-django-extensions >= %{django_extensions_min_version}
Requires: %{mypython}-django-gravatar2 >= %{django_gravatar2_min_version}
Requires: %{mypython}-django-haystack >= 2.8.0
Requires: %{mypython}-django-mailman3 >= %{django_mailman3_min_version}
Requires: %{mypython}-django-q >= %{django_q_min_version}
Requires: %{mypython}-djangorestframework >= %{djangorestframework_min_version}
Requires: %{mypython}-flufl.lock >= %{flufl_lock_min_version}
Requires: %{mypython}-mailmanclient >= %{mailmanclient_min_version}
Requires: %{mypython}-mistune >= %{mistune_min_version}
Requires: %{mypython}-networkx >= %{networkx_min_version}
Requires: %{mypython}-python-dateutil >= %{python_dateutil_min_version}
Requires: %{mypython}-pytz >= %{pytz_min_version}
Requires: %{mypython}-robot-detection >= %{robot_detection_min_version}
Requires: %{mypython}-xapian-haystack >= %{django_haystack_min_version}
# help in replacing any previously installed flavor package back to the unprefixed package
%if 0%{?suse_version} < 1550
Obsoletes: python3-%{hyperkitty_pkgname} < %{version}-%{release}
%endif
Provides: %{mypython}-%{hyperkitty_pkgname} = %{version}-%{release}
Obsoletes: %{mypython}-%{hyperkitty_pkgname} < %{version}-%{release}
%if 0%{?suse_version} >= 1550
Requires: sassc
%endif
%description -n %{hyperkitty_pkgname}
A web interface to access GNU Mailman v3 archives.
%package -n %{hyperkitty_pkgname}-web
Summary: The webroot for GNU Mailman
Requires: %{hyperkitty_pkgname}
Requires: acl
Requires: openssl
Requires: sudo
Requires: system-user-%{lowname}
%description -n %{hyperkitty_pkgname}-web
A web user interface for GNU Mailman.
This package holds the web interface.
%package -n %{hyperkitty_pkgname}-web-uwsgi
Summary: HyperKitty - uwsgi configuration
Requires: %{hyperkitty_pkgname}-web
%if 0%{suse_version} >= 1550 || 0%{?sle_version} >= 150500
Requires: %{mypython}-uwsgi-python3
%else
Requires: uwsgi-python3
%endif
%description -n %{hyperkitty_pkgname}-web-uwsgi
A web user interface for GNU Mailman.
This package holds the uwsgi configuration.
%package -n system-user-%{lowname}
Summary: System user for HyperKitty
BuildArch: noarch
BuildRequires: sysuser-tools
%sysusers_requires
%description -n system-user-%{lowname}
System user for HyperKitty.
%prep
%setup -n hyperkitty-%{version}
cp %{SOURCE30} .
touch settings_local.py
# Copy example_project to just build the static files
rsync -a example_project/* build_static_files
%autopatch -p1
tee > %{lowname}.sysuser <<EOF
u %{lowname} - "HyperKitty" %{hyperkitty_basedir} -
EOF
%build
sed -i 's|^#!/usr/bin/env.*|#!%{__mypython}|' \
example_project/manage.py
sed -i 's|/usr/bin/python3|%{__mypython}|' %{SOURCE10} %{SOURCE20} %{SOURCE21}
sed -i 's|python3|%{mypython}|' %{SOURCE12}
%pyproject_wheel
# Build static files
export PYTHONPATH=$(pwd)
%python_exec build_static_files/manage.py collectstatic --clear --noinput
%python_exec build_static_files/manage.py compress --force
%sysusers_generate_pre %{lowname}.sysuser %{lowname}
%install
install -d -m 0750 \
%{buildroot}%{hyperkitty_etcdir} \
%{buildroot}%{hyperkitty_libdir} \
%{buildroot}%{hyperkitty_datadir} \
%{buildroot}%{hyperkitty_datadir}/attachments \
%{buildroot}%{hyperkitty_logdir}
install -d -m 0755 \
%{buildroot}%{hyperkitty_basedir} \
%{buildroot}%{hyperkitty_localedir} \
%{buildroot}%{hyperkitty_staticdir} \
%{buildroot}%{hyperkitty_staticdir}/CACHE \
%{buildroot}%{_unitdir}
%pyproject_install
%python_expand %fdupes %{buildroot}%{$python_sitelib}
# Copy static files
rsync -a build_static_files/static %{buildroot}%{hyperkitty_basedir}
# Remove the directory
%python_expand rm -rf %{buildroot}%{$python_sitelib}/build_static_files
rsync -a example_project/* %{buildroot}%{hyperkitty_basedir}
chmod -x %{buildroot}%{hyperkitty_basedir}/wsgi.py
for f in \
README.rst \
apache.conf \
crontab \
qcluster.service \
; do
rm -f %{buildroot}%{hyperkitty_basedir}/$f
done
rm -f %{buildroot}%{hyperkitty_localedir}/.keep
rm -f %{buildroot}%{hyperkitty_basedir}/logs/.keep
%python_expand rm -rf %{buildroot}%{$python_sitelib}/example_project
# Create an empty settings_local.py. This will be filled with a SECRET_KEY in post
install -m 0644 settings_local.py %{buildroot}%{hyperkitty_etcdir}/settings_local.py
ln -svf %{hyperkitty_etcdir}/settings_local.py \
%{buildroot}/%{hyperkitty_basedir}/settings_local.py
%fdupes %{buildroot}%{hyperkitty_basedir}
# Manage script
install -d -m 0755 %{buildroot}%{_sbindir}
install -m 0755 %{SOURCE10} %{buildroot}%{_sbindir}/hyperkitty-manage
install -d -m 0755 %{buildroot}%{_sysconfdir}/uwsgi/vassals
install -m 0644 %{SOURCE12} %{buildroot}%{_sysconfdir}/uwsgi/vassals/hyperkitty.ini
install -m 0644 %{SOURCE20} %{buildroot}%{_unitdir}/hyperkitty-qcluster.service
ln -s /sbin/service %{buildroot}%{_sbindir}/rchyperkitty-qcluster
for job in \
minutely \
quarter-hourly \
hourly \
daily \
weekly \
monthly \
yearly \
; do
install -m 0644 %{SOURCE21} %{buildroot}%{_unitdir}/hyperkitty-runjob-${job}.service
sed -i "s/@HYPERKITTY_RUNJOB@/${job}/g" %{buildroot}%{_unitdir}/hyperkitty-runjob-${job}.service
ln -s /sbin/service %{buildroot}%{_sbindir}/rchyperkitty-runjob-${job}
install -m 0644 %{SOURCE22} %{buildroot}%{_unitdir}/hyperkitty-runjob-${job}.timer
hyperkitty_runjob_calendar="OnCalendar=${job}"
hyperkitty_runjob_delay="RandomizedDelaySec=15m"
hyperkitty_runjob_name="${job}"
if [ "${job}" = "minutely" ]; then
hyperkitty_runjob_delay="RandomizedDelaySec=15s"
elif [ "${job}" = "quarter-hourly" ]; then
hyperkitty_runjob_calendar="OnCalendar=*:0/15"
hyperkitty_runjob_delay="RandomizedDelaySec=2m"
# The real jobname is with an underscore
hyperkitty_runjob_name="quarter_hourly"
fi
sed -i "s#@HYPERKITTY_RUNJOB_CALENDAR@#${hyperkitty_runjob_calendar}#g" %{buildroot}%{_unitdir}/hyperkitty-runjob-${job}.timer
sed -i "s#@HYPERKITTY_RUNJOB_DELAY@#${hyperkitty_runjob_delay}#g" %{buildroot}%{_unitdir}/hyperkitty-runjob-${job}.timer
sed -i "s#@HYPERKITTY_RUNJOB@#${hyperkitty_runjob_name}#g" %{buildroot}%{_unitdir}/hyperkitty-runjob-${job}.timer
done
install -Dm644 %{lowname}.sysuser %{buildroot}%{_sysusersdir}/%{lowname}.conf
%if %{with testuite}
%check
export PYTHONPATH="$(pwd)"
export LANG=C.UTF-8
%pytest
%endif
%pre -n %{hyperkitty_pkgname}-web
%service_add_pre %{hyperkitty_services}
%pre -n system-user-%{lowname} -f %{lowname}.pre
%post -n %{hyperkitty_pkgname}-web
# We need a SECRET_KEY for manage to work
if ! grep -q "^SECRET_KEY.*" %{hyperkitty_etcdir}/settings_local.py; then
echo "SECRET_KEY='$(openssl rand -base64 48)'" >> %{hyperkitty_etcdir}/settings_local.py
fi
%{_sbindir}/hyperkitty-manage makemigrations --pythonpath /srv/www/webapps/mailman/hyperkitty/ --settings settings
%{_sbindir}/hyperkitty-manage migrate --pythonpath /srv/www/webapps/mailman/hyperkitty/ --settings settings
%service_add_post %{hyperkitty_services}
%preun -n %{hyperkitty_pkgname}-web
%service_del_preun %{hyperkitty_services}
%postun -n %{hyperkitty_pkgname}-web
%service_del_postun %{hyperkitty_services}
%files -n %{hyperkitty_pkgname}
%doc AUTHORS.txt README.rst example_project
%license COPYING.txt
%{mypython_sitelib}/hyperkitty
%{mypython_sitelib}/hyperkitty-%{version}*-info
%files -n %{hyperkitty_pkgname}-web
%doc README.SUSE.md
%{_sbindir}/hyperkitty-manage
%{_sbindir}/rchyperkitty-qcluster
%{_sbindir}/rchyperkitty-runjob-*
%dir %{webapps_dir}
%dir %{webapps_dir}/mailman
%{_unitdir}/hyperkitty-qcluster.service
%{_unitdir}/hyperkitty-runjob-*.service
%{_unitdir}/hyperkitty-runjob-*.timer
%defattr(-,root,hyperkitty)
%dir %{hyperkitty_basedir}
%{hyperkitty_basedir}/__init__.py
%{hyperkitty_basedir}/manage.py
%{hyperkitty_basedir}/settings.py
%{hyperkitty_basedir}/settings_local.py
%{hyperkitty_basedir}/urls.py
%{hyperkitty_basedir}/wsgi.py
%dir %{hyperkitty_basedir}/static
%{hyperkitty_basedir}/static/admin
%{hyperkitty_basedir}/static/debug_toolbar
%{hyperkitty_basedir}/static/django-mailman3
%{hyperkitty_basedir}/static/django_extensions
%{hyperkitty_basedir}/static/hyperkitty
%{hyperkitty_basedir}/static/rest_framework
# The wsgi needs to write to static/CACHE
%attr(755,hyperkitty,hyperkitty) %dir %{hyperkitty_basedir}/static/CACHE
%attr(644,hyperkitty,hyperkitty) %{hyperkitty_basedir}/static/CACHE/manifest.json
%attr(755,hyperkitty,hyperkitty) %dir %{hyperkitty_basedir}/static/CACHE/css
%attr(644,hyperkitty,hyperkitty) %{hyperkitty_basedir}/static/CACHE/css/output.*.css
%attr(755,hyperkitty,hyperkitty) %dir %{hyperkitty_basedir}/static/CACHE/js
%attr(644,hyperkitty,hyperkitty) %{hyperkitty_basedir}/static/CACHE/js/output.*.js
%dir %{hyperkitty_localedir}
%attr(750,root,hyperkitty) %dir %{hyperkitty_etcdir}
%attr(640,root,hyperkitty) %config(noreplace) %{hyperkitty_etcdir}/settings_local.py
%attr(750,root,hyperkitty) %dir %{hyperkitty_libdir}
%attr(750,hyperkitty,hyperkitty) %dir %{hyperkitty_datadir}
%attr(770,hyperkitty,hyperkitty) %dir %{hyperkitty_logdir}
%files -n %{hyperkitty_pkgname}-web-uwsgi
%dir %{_sysconfdir}/uwsgi
%dir %{_sysconfdir}/uwsgi/vassals
%config (noreplace) %{_sysconfdir}/uwsgi/vassals/hyperkitty.ini
%files -n system-user-%{lowname}
%{_sysusersdir}/%{lowname}.conf
%changelog