Compare commits

...

15 Commits
v1.3.1 ... main

Author SHA1 Message Date
3a7fb92b52 Merge pull request 'blacklist update' (#2) from dev into main
Reviewed-on: #2
2026-01-15 22:26:59 +01:00
211174c798 blacklist update 2026-01-15 22:22:15 +01:00
14d51c26fc Merge pull request 'Lua 5.4, Luarocks 3.12.2 and Prosody 0.12.5' (#1) from dev into main
Reviewed-on: #1
2026-01-02 16:54:32 +01:00
c859ea8aeb Lua 5.4, Luarocks 3.12.2 and Prosody 0.12.5 2026-01-02 16:51:53 +01:00
bce1639d25 bats 2024-05-05 17:12:45 +02:00
0de34e5f74 2024-05-05 eguneraketa 2024-05-05 16:47:07 +02:00
4857ee42e9 2024-05-05 eguneraketa 2024-05-05 16:45:21 +02:00
da5371f30f 2024-05-05 eguneraketa 2024-05-05 16:40:57 +02:00
73838d1aa5 fixed firewall scripts 2024-03-04 09:09:14 +01:00
917824e3a9 v1.3.2 2024-03-01 23:17:00 +01:00
c55a135d24 readme 2024-03-01 21:12:20 +01:00
38674d073b readme 2024-03-01 19:08:03 +01:00
cedeabd6a8 v1.3.2 2024-03-01 17:21:11 +01:00
95b4b5da6e v1.3.2 2024-03-01 17:16:00 +01:00
e7fa66e938 v1.3.2 2024-03-01 17:09:43 +01:00
17 changed files with 107 additions and 97 deletions

View File

@ -1,5 +1,27 @@
# Changelog # Changelog
## Unreleased 2024-05-05
### Adjust config
* Replace deprecated legacy_ssl with c2s_direct_tls.
* Removed use_libevent = true. This means the default is now used which is epoll.
### Test
Added a test to check that no deprecated config settings are used.
## v 1.3.3
* Updated to LuaRocks 3.12.2
* Updated to Lua 5.4
* Updated to Prosody 0.12.5
* Removed unused luarocks
## v1.3.2
* Added Firewall module with optional custom blacklist
## v1.3.1 ## v1.3.1
* Added optional Firewall module for testing * Added optional Firewall module for testing

View File

@ -4,11 +4,11 @@ ARG BUILD_DATE
ARG VCS_REF ARG VCS_REF
ARG VERSION ARG VERSION
ARG LUAROCKS_VERSION=3.9.2 ARG LUAROCKS_VERSION=3.12.2
ARG PROSODY_VERSION=0.12.4 ARG PROSODY_VERSION=0.12.5
ARG LUAROCKS_SHA256="bca6e4ecc02c203e070acdb5f586045d45c078896f6236eb46aa33ccd9b94edb" ARG LUAROCKS_SHA256="b0e0c85205841ddd7be485f53d6125766d18a81d226588d2366931e9a1484492"
ARG PROSODY_DOWNLOAD_SHA256="47d712273c2f29558c412f6cdaec073260bbc26b7dda243db580330183d65856" ARG PROSODY_DOWNLOAD_SHA256="778fb7707a0f10399595ba7ab9c66dd2a2288c0ae3a7fe4ab78f97d462bd399f"
LABEL luarocks.version="${LUAROCKS_VERSION}" LABEL luarocks.version="${LUAROCKS_VERSION}"
LABEL org.opencontainers.image.authors="Wproject Garapenak" LABEL org.opencontainers.image.authors="Wproject Garapenak"
@ -30,7 +30,8 @@ RUN apt-get update \
libidn2-0 \ libidn2-0 \
libpq-dev \ libpq-dev \
libsqlite3-0 \ libsqlite3-0 \
lua5.2 \ lua5.4 \
liblua5.4-dev \
lua-bitop \ lua-bitop \
lua-dbi-mysql \ lua-dbi-mysql \
lua-dbi-postgresql \ lua-dbi-postgresql \
@ -73,11 +74,11 @@ RUN buildDeps='gcc git libc6-dev libidn2-dev liblua5.2-dev libsqlite3-dev libssl
&& make bootstrap \ && make bootstrap \
&& cd / && rm -r /usr/src/luarocks \ && cd / && rm -r /usr/src/luarocks \
\ \
&& luarocks install luaevent \ # && luarocks install luaevent \
&& luarocks install luadbi \ && luarocks install luadbi \
`#&& luarocks install luadbi-mysql MYSQL_INCDIR=/usr/include/mariadb/` \ `#&& luarocks install luadbi-mysql MYSQL_INCDIR=/usr/include/mariadb/` \
&& luarocks install luadbi-sqlite3 \ && luarocks install luadbi-sqlite3 \
&& luarocks install stringy \ # && luarocks install stringy \
\ \
&& apt-get purge -y --auto-remove $buildDeps && apt-get purge -y --auto-remove $buildDeps
@ -90,7 +91,7 @@ RUN groupadd -r prosody \
RUN mkdir -p /var/run/prosody/ \ RUN mkdir -p /var/run/prosody/ \
&& chown prosody:prosody /var/run/prosody/ && chown prosody:prosody /var/run/prosody/
ENV __FLUSH_LOG yes ENV __FLUSH_LOG=yes
VOLUME ["/usr/local/var/lib/prosody"] VOLUME ["/usr/local/var/lib/prosody"]
@ -111,7 +112,7 @@ RUN download-prosody-modules.bash \
smacks `# stream management (XEP-0198)` \ smacks `# stream management (XEP-0198)` \
throttle_presence `# presence throttling in CSI` \ throttle_presence `# presence throttling in CSI` \
vcard_muc `# XEP-0153: vCard-Based Avatar (MUC)` \ vcard_muc `# XEP-0153: vCard-Based Avatar (MUC)` \
&& docker-prosody-module-pre-install.bash \ #&& docker-prosody-module-pre-install.bash \
firewall `# anti-spam firewall` \ firewall `# anti-spam firewall` \
&& rm -rf "/usr/src/prosody-modules" && rm -rf "/usr/src/prosody-modules"
RUN echo "TLS_REQCERT allow" >> /etc/ldap/ldap.conf RUN echo "TLS_REQCERT allow" >> /etc/ldap/ldap.conf

View File

@ -1,7 +1,8 @@
plugin_paths = { "/usr/local/lib/prosody/custom-modules/" }; plugin_paths = { "/usr/local/lib/prosody/custom-modules/" };
-- table of enabled modules -- table of enabled modules
local mods_enabled = { -- local mods_enabled = {
modules_enabled = {
-- Generally required -- Generally required
"roster"; -- Allow users to have a roster. Recommended ;) "roster"; -- Allow users to have a roster. Recommended ;)
"saslauth"; -- Authentication for clients and servers. Recommended if you want to log in. "saslauth"; -- Authentication for clients and servers. Recommended if you want to log in.
@ -48,19 +49,7 @@ local mods_enabled = {
"server_contact_info"; -- This module lets you advertise various contact addresses for your XMPP service via XEP-0157. "server_contact_info"; -- This module lets you advertise various contact addresses for your XMPP service via XEP-0157.
}; };
local enabled = os.getenv("ENABLE_FIREWALL") or "false" -- modules_enabled = mods_enabled;
local spam_blocklist = os.getenv("SPAM_BLOCKLIST") and "/usr/local/etc/prosody/firewall/" .. os.getenv("SPAM_BLOCKLIST") or "module:scripts/spam-blocklists.pfw"
if(enabled == "true")
then
table.insert(mods_enabled, "firewall");
firewall_scripts = {
spam_blocklist;
}
end
modules_enabled = mods_enabled;
-- These modules are auto-loaded, but should you want -- These modules are auto-loaded, but should you want
-- to disable them then uncomment them here: -- to disable them then uncomment them here:
@ -69,4 +58,3 @@ modules_disabled = {
-- "c2s"; -- Handle client connections -- "c2s"; -- Handle client connections
-- "s2s"; -- Handle server-to-server connections -- "s2s"; -- Handle server-to-server connections
}; };

View File

@ -1,8 +1,8 @@
default_storage = "sql" default_storage = "sql"
sql = { sql = {
driver = os.getenv("DB_DRIVER"); driver = os.getenv("DB_DRIVER") or "SQLite3";
database = os.getenv("DB_DATABASE"); database = os.getenv("DB_DATABASE") or "prosody.sqlite";
host = os.getenv("DB_HOST"); host = os.getenv("DB_HOST");
port = os.getenv("DB_PORT"); port = os.getenv("DB_PORT");
username = os.getenv("DB_USERNAME"); username = os.getenv("DB_USERNAME");

View File

@ -1,8 +1,16 @@
local stringy = require "stringy" local function _split(s, sep)
if not s then return nil; end
sep = sep or ",";
local parts = {};
for part in s:gmatch("[^"..sep.."]+") do
parts[#parts+1] = part;
end
return parts;
end
e2e_policy_chat = os.getenv("E2E_POLICY_CHAT") e2e_policy_chat = os.getenv("E2E_POLICY_CHAT")
e2e_policy_muc = os.getenv("E2E_POLICY_MUC") e2e_policy_muc = os.getenv("E2E_POLICY_MUC")
e2e_policy_whitelist = stringy.split(os.getenv("E2E_POLICY_WHITELIST"), ", ") e2e_policy_whitelist = _split(os.getenv("E2E_POLICY_WHITELIST"), ", ")
e2e_policy_message_optional_chat = "For security reasons, OMEMO, OTR or PGP encryption is STRONGLY recommended for conversations on this server." e2e_policy_message_optional_chat = "For security reasons, OMEMO, OTR or PGP encryption is STRONGLY recommended for conversations on this server."
e2e_policy_message_required_chat = "For security reasons, OMEMO, OTR or PGP encryption is required for conversations on this server." e2e_policy_message_required_chat = "For security reasons, OMEMO, OTR or PGP encryption is required for conversations on this server."
e2e_policy_message_optional_muc = "For security reasons, OMEMO, OTR or PGP encryption is STRONGLY recommended for MUC on this server." e2e_policy_message_optional_muc = "For security reasons, OMEMO, OTR or PGP encryption is STRONGLY recommended for MUC on this server."

View File

@ -1,12 +1,28 @@
local stringy = require "stringy" local function _split(s, sep)
if not s then return nil; end
sep = sep or ",";
local parts = {};
for part in s:gmatch("[^"..sep.."]+") do
parts[#parts+1] = part;
end
return parts;
end
local domain = os.getenv("DOMAIN")
local abuse = os.getenv("SERVER_CONTACT_INFO_ABUSE") or "xmpp:abuse@" .. domain
local admin = os.getenv("SERVER_CONTACT_INFO_ADMIN") or "xmpp:admin@" .. domain
local feedback = os.getenv("SERVER_CONTACT_INFO_FEEDBACK") or "xmpp:feedback@" .. domain
local sales = os.getenv("SERVER_CONTACT_INFO_SALES") or "xmpp:sales@" .. domain
local security = os.getenv("SERVER_CONTACT_INFO_SECURITY") or "xmpp:security@" .. domain
local support = os.getenv("SERVER_CONTACT_INFO_SUPPORT") or "xmpp:support@" .. domain
contact_info = { contact_info = {
abuse = stringy.split(os.getenv("SERVER_CONTACT_INFO_ABUSE"), ", "); abuse = _split(abuse, ", ");
admin = stringy.split(os.getenv("SERVER_CONTACT_INFO_ADMIN"), ", "); admin = _split(admin, ", ");
feedback = stringy.split(os.getenv("SERVER_CONTACT_INFO_FEEDBACK"), ", "); feedback = _split(feedback, ", ");
sales = stringy.split(os.getenv("SERVER_CONTACT_INFO_SALES"), ", "); sales = _split(sales, ", ");
security = stringy.split(os.getenv("SERVER_CONTACT_INFO_SECURITY"), ", "); security = _split(security, ", ");
support = stringy.split(os.getenv("SERVER_CONTACT_INFO_SUPPORT"), ", "); support = _split(support, ", ");
} }
welcome_message = "Kaixo $username, ongi etorri $host IM zerbitzura! Mesedez irakurri itzazu ondorengo <a href='https://lainoa.eus/terms/tos.html'>Erabilpen baldintzak</a>." welcome_message = "Kaixo $username, ongi etorri $host IM zerbitzura! Mesedez irakurri itzazu ondorengo <a href='https://lainoa.eus/terms/tos.html'>Erabilpen baldintzak</a>."

View File

@ -6,11 +6,11 @@ local domain_pubsub = os.getenv("DOMAIN_PUBSUB")
-- XEP-0368: SRV records for XMPP over TLS -- XEP-0368: SRV records for XMPP over TLS
-- https://compliance.conversations.im/test/xep0368/ -- https://compliance.conversations.im/test/xep0368/
legacy_ssl_ssl = { c2s_direct_tls_ssl = {
certificate = "certs/" .. domain .. "/fullchain.pem"; certificate = "certs/" .. domain .. "/fullchain.pem";
key = "certs/" .. domain .. "/privkey.pem"; key = "certs/" .. domain .. "/privkey.pem";
} }
legacy_ssl_ports = { 5223 } c2s_direct_tls_ports = { 5223 }
-- https://prosody.im/doc/certificates#service_certificates -- https://prosody.im/doc/certificates#service_certificates
-- https://prosody.im/doc/ports#ssl_configuration -- https://prosody.im/doc/ports#ssl_configuration

View File

@ -43,7 +43,13 @@ for ext in $exts; do
# Skip this if the modules should not be added to modules_enabled. # Skip this if the modules should not be added to modules_enabled.
if [ "$ext" != "http_upload" ] && [ "$ext" != "vcard_muc" ] ; then if [ "$ext" != "http_upload" ] && [ "$ext" != "vcard_muc" ] ; then
echo " - enabling within ${config}" echo " - enabling within ${config}"
new_config=$(cat "${config}" | module="${ext}" perl -0pe 's/(mods_enabled[ ]*=[ ]*{[^}]*)};/$1\n\t"$ENV{module}";\n};/') new_config=$(cat "${config}" | module="${ext}" perl -0pe 's/(modules_enabled[ ]*=[ ]*{[^}]*)};/$1\n\t"$ENV{module}";\n};/')
echo "${new_config}" > "${config}" echo "${new_config}" > "${config}"
fi fi
# firewall module configuration
if [ "$ext" == "firewall" ] ; then
echo " - setting up mod_${ext}"
new_config=$(cat "${config}" | echo -e "\nlocal spam_blocklist = os.getenv(\"SPAM_BLOCKLIST\") and \"/usr/local/etc/prosody/firewall/\" .. os.getenv(\"SPAM_BLOCKLIST\") or \"module:scripts/spam-blocklists.pfw\"\n\nfirewall_scripts = {\n\t\"module:scripts/spam-blocking.pfw\";\n\tspam_blocklist;\n};")
echo "${new_config}" >> "${config}"
fi
done done

View File

@ -1,42 +0,0 @@
#!/bin/bash
set -e
source="/usr/src/prosody-modules"
target="/usr/local/lib/prosody/custom-modules"
cd ${source}
usage() {
echo "usage: $0 ext-name [ext-name ...]"
echo " ie: $0 carbons e2e_policy proxy65"
echo
echo 'Possible values for ext-name:'
find . -mindepth 1 -maxdepth 1 -type d | sort | sed s/\.\\/mod_//g | xargs
}
exts=
for ext; do
if [ -z "mod_$ext" ]; then
continue
fi
if [ ! -d "mod_$ext" ]; then
echo >&2 "error: $PWD/mod_$ext does not exist"
echo >&2
usage >&2
exit 1
fi
exts="$exts $ext"
done
if [ -z "$exts" ]; then
usage >&2
exit 1
fi
for ext in $exts; do
echo "Installing mod_${ext}"
echo " - copying to ${target}"
cp -r "${source}/mod_${ext}" "${target}/"
done

View File

@ -2,17 +2,21 @@ bashtel.ru
creep.im creep.im
darkengine.biz darkengine.biz
default.rs default.rs
exploit.im
hiddenlizard.org hiddenlizard.org
jabber.bitactive.com jabber.bitactive.com
jabber.cd jabber.cd
jabber.cz
jabber.freenet.de jabber.freenet.de
jabber.ipredator.se jabber.ipredator.se
jabber.npw.net jabber.npw.net
jabber.sampo.ru jabber.sampo.ru
jabbim.pl
labas.biz labas.biz
otr.chat otr.chat
paranoid.scarab.name paranoid.scarab.name
rassnet.org rassnet.org
safetyjabber.com safetyjabber.com
sj.ms sj.ms
trashserver.net
xmpp.bytesund.biz xmpp.bytesund.biz

View File

@ -1,14 +1,12 @@
-- see example config at https://hg.prosody.im/-1.9/file/0.9.10/prosody.cfg.lua.dist -- see example config at https://hg.prosody.im/-1.9/file/0.9.10/prosody.cfg.lua.dist
-- easily extendable by putting into different config files within conf.d folder -- easily extendable by putting into different config files within conf.d folder
local stringy = require "stringy" local stringy = require "stringy"
admins = stringy.split(os.getenv("PROSODY_ADMINS"), ", "); admins = stringy.split(os.getenv("PROSODY_ADMINS"), ", ");
pidfile = "/var/run/prosody/prosody.pid" pidfile = "/var/run/prosody/prosody.pid"
use_libevent = true; -- improves performance
allow_registration = os.getenv("ALLOW_REGISTRATION"); allow_registration = os.getenv("ALLOW_REGISTRATION");
c2s_require_encryption = os.getenv("C2S_REQUIRE_ENCRYPTION"); c2s_require_encryption = os.getenv("C2S_REQUIRE_ENCRYPTION");

View File

@ -158,11 +158,9 @@ docker build -t prosody/xmpp .
Next I recommend using a ```docker-compose.yml``` file: Next I recommend using a ```docker-compose.yml``` file:
```yaml ```yaml
version: '3.7'
services: services:
server: server:
image: sarasmiseth/prosody:latest image: prosody/xmpp:latest
restart: unless-stopped restart: unless-stopped
ports: ports:
- "5000:5000" - "5000:5000"
@ -177,9 +175,9 @@ services:
- ./data:/usr/local/var/lib/prosody - ./data:/usr/local/var/lib/prosody
``` ```
Boot it via: ```docker-compose up -d```. Boot it via: ```docker compose up -d```.
Inspect logs: ```docker-compose logs -f```. Inspect logs: ```docker compose logs -f```.
### Volumes permissions ### Volumes permissions

@ -0,0 +1 @@
Subproject commit e2d855bc78619ee15b0c702b5c30fb074101159f

1
tests/bats/bats-core Submodule

@ -0,0 +1 @@
Subproject commit a751f3d3da4b7db830612322a068a18379c78d09

@ -0,0 +1 @@
Subproject commit 9bf10e876dd6b624fe44423f0b35e064225f7556

View File

@ -1,8 +1,6 @@
version: "3.9"
services: services:
prosody: prosody:
image: prosody image: prosody/xmpp:latest
restart: unless-stopped restart: unless-stopped
ports: ports:
- "5000:5000" - "5000:5000"
@ -19,7 +17,7 @@ services:
- ./certs:/usr/local/etc/prosody/certs - ./certs:/usr/local/etc/prosody/certs
prosody_postgres: prosody_postgres:
image: prosody image: prosody/xmpp:latest
restart: unless-stopped restart: unless-stopped
ports: ports:
- "5000:5000" - "5000:5000"
@ -53,7 +51,7 @@ services:
POSTGRES_PASSWORD: prosody POSTGRES_PASSWORD: prosody
prosody_ldap: prosody_ldap:
image: prosody image: prosody/xmpp:latest
restart: unless-stopped restart: unless-stopped
ports: ports:
- "5000:5000" - "5000:5000"

View File

@ -57,8 +57,8 @@ load 'bats/bats-assert/load'
assert_output assert_output
} }
@test "Should activate legacy_ssl" { @test "Should activate c2s_direct_tls" {
run bash -c "sudo docker-compose logs $batsContainerName | grep -E \"Activated service 'legacy_ssl' on (\[::\]:5223|\[\*\]:5223), (\[::\]:5223|\[\*\]:5223)\"" run bash -c "sudo docker-compose logs $batsContainerName | grep -E \"Activated service 'c2s_direct_tls' on (\[::\]:5223|\[\*\]:5223), (\[::\]:5223|\[\*\]:5223)\""
assert_success assert_success
assert_output assert_output
} }
@ -82,7 +82,17 @@ load 'bats/bats-assert/load'
} }
@test "Should show upload URL" { @test "Should show upload URL" {
run bash -c "sudo docker-compose logs $batsContainerName | grep \"URL: <https:\/\/upload.example.com:5281\/upload> - Ensure this can be reached by users\"" run bash -c "sudo docker-compose logs $batsContainerName | grep \"Serving 'file_share' at https:\/\/upload.example.com:5281\/file_share\""
assert_success assert_success
assert_output assert_output
} }
@test "Should not use deprecated config" {
run bash -c "sudo docker-compose exec $batsContainerName /bin/bash -c \"/entrypoint.bash check\" | grep 'deprecated' -A 3"
assert_failure
}
@test "Should not have warnings in log" {
run bash -c "sudo docker-compose logs $batsContainerName | grep -E \"warn\""
assert_failure
}