mirror of
https://github.com/processone/ejabberd.git
synced 2024-06-02 21:17:12 +02:00
Compare commits
704 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
7ba9f2e4e8 | ||
|
52abe8016b | ||
|
b840ab9907 | ||
|
b977eb7193 | ||
|
a179d5e34b | ||
|
ab274147d8 | ||
|
d81a844e1c | ||
|
b288d5c763 | ||
|
1b81af00b2 | ||
|
d04f92d44e | ||
|
80dc95fc03 | ||
|
a8e36e7b1b | ||
|
ec13350b24 | ||
|
1076f8bfc2 | ||
|
599cddfb67 | ||
|
034af6aefd | ||
|
5d2a111b9c | ||
|
ca9ca7f5af | ||
|
677d66d818 | ||
|
750bf07e13 | ||
|
2cd53410bc | ||
|
ad7008a545 | ||
|
bedfc2e188 | ||
|
83b1a40f8b | ||
|
a05dbcc2b2 | ||
|
01f2697faf | ||
|
fba915e04e | ||
|
0d1cbc62d4 | ||
|
f72cb1b5c8 | ||
|
cb49fcf459 | ||
|
66a08b6f18 | ||
|
2554b51173 | ||
|
d2e7b5ffa0 | ||
|
38fd9a3ed2 | ||
|
4ec236966a | ||
|
696e42b5b4 | ||
|
0ad1d315e8 | ||
|
4697a9295a | ||
|
9fbc7b96e4 | ||
|
392d7ee30b | ||
|
025e2a5760 | ||
|
f7dc4fa2ac | ||
|
13ebe89fdc | ||
|
c7c3cc10c5 | ||
|
e9b9159d23 | ||
|
f15d5d073e | ||
|
b461657407 | ||
|
0da767f568 | ||
|
395a73bbe0 | ||
|
5870e2e378 | ||
|
94a0aa6967 | ||
|
2bfc4b0f5d | ||
|
374f6b8e7d | ||
|
33c6b3700e | ||
|
eb975268f4 | ||
|
b0afe4946d | ||
|
5c6a399f5b | ||
|
e744665171 | ||
|
0b16cbddde | ||
|
7ea2c6eabf | ||
|
45ca11ecd0 | ||
|
d8cdd82bf8 | ||
|
345af5a535 | ||
|
6e5895ce45 | ||
|
b70a2fe4cf | ||
|
da01d932ea | ||
|
7cd5808766 | ||
|
c98302b3c0 | ||
|
cd7eedf589 | ||
|
27bd8852a1 | ||
|
effcf0b7cf | ||
|
71b9db688a | ||
|
8be6dc7758 | ||
|
569f0b303b | ||
|
15e3add909 | ||
|
68c0c4d94f | ||
|
a550a1c55c | ||
|
832588f861 | ||
|
73bcabd2fa | ||
|
da8c9f3357 | ||
|
6cfef4f476 | ||
|
e9fbfaf536 | ||
|
0407c56605 | ||
|
1a63443e02 | ||
|
0345f798bd | ||
|
ee9d4d56a9 | ||
|
44bafa478e | ||
|
ce57e02769 | ||
|
64cd794c02 | ||
|
9c8ae96f25 | ||
|
e973360aa7 | ||
|
697e5b8b6c | ||
|
017f609a51 | ||
|
22f0d44fed | ||
|
0fdf58b1ec | ||
|
051bf2968a | ||
|
4fd83631ec | ||
|
a29d54c497 | ||
|
ed6762b8ee | ||
|
b6a0c7e57f | ||
|
ba0be28d45 | ||
|
ef5a435480 | ||
|
61ad808d26 | ||
|
426e33d3a6 | ||
|
d6d8bce0e4 | ||
|
7c76f2b764 | ||
|
735516ed37 | ||
|
dbf0fb8e86 | ||
|
f50b5e1a58 | ||
|
50c74ab821 | ||
|
a1b76ac0a9 | ||
|
49ca325845 | ||
|
703e98ec45 | ||
|
208f798b07 | ||
|
059a028c0c | ||
|
7269d171a7 | ||
|
3ca2d99a47 | ||
|
9ab60935a4 | ||
|
c5437235f3 | ||
|
537aac24f7 | ||
|
8f20dd8425 | ||
|
1639471250 | ||
|
fcc5f00e75 | ||
|
80b06da56b | ||
|
2c1b0bb77b | ||
|
f5c8406353 | ||
|
c7f76944f3 | ||
|
6542a70c05 | ||
|
5bb94f1d9e | ||
|
2378ea9c07 | ||
|
cd30538130 | ||
|
356ee22cc5 | ||
|
281515cd9f | ||
|
c0055b7a7f | ||
|
6bdbafcd5c | ||
|
a29955ff96 | ||
|
91cca3cff3 | ||
|
716f5de517 | ||
|
aac0e782d0 | ||
|
c69884fa3f | ||
|
06675e4fb2 | ||
|
ad67710f7e | ||
|
654601ff23 | ||
|
d29ef59514 | ||
|
e3e8b9afb4 | ||
|
a8e3af3586 | ||
|
11ff7d1ff9 | ||
|
b04b16825f | ||
|
0f43a7f36b | ||
|
95e9a63dcb | ||
|
146d958fc0 | ||
|
bb349d6085 | ||
|
cb9053cd79 | ||
|
4146f19814 | ||
|
79eca7c098 | ||
|
723c53e1df | ||
|
daca3b558b | ||
|
2075480b14 | ||
|
e43194d59b | ||
|
8bbc27fd39 | ||
|
9a9a466bd4 | ||
|
92c533f42a | ||
|
863b7eee8b | ||
|
417294339d | ||
|
6aaefc663b | ||
|
a6b10ac4c0 | ||
|
2b7b92edee | ||
|
f4de0cef26 | ||
|
1b5a9c1a1f | ||
|
a09f222b4c | ||
|
5fb76b4918 | ||
|
27d5a1d5bb | ||
|
ba1917d23c | ||
|
0b37d50dac | ||
|
9275bf40b2 | ||
|
4431fbbe5a | ||
|
8c64ce67fc | ||
|
1ddc4a5c5d | ||
|
081cab821b | ||
|
efe5c76469 | ||
|
16c9b169f2 | ||
|
73f20a8f1e | ||
|
70e430cff1 | ||
|
aa21aee14b | ||
|
59ff77e171 | ||
|
045170a67e | ||
|
c9deea1f6f | ||
|
c10f2a22b6 | ||
|
45f24c63cb | ||
|
18cb0bca19 | ||
|
071dc08405 | ||
|
b8181974ec | ||
|
816900a6cf | ||
|
2438fc8b31 | ||
|
8b84f991e1 | ||
|
3c98ec5b48 | ||
|
e1f863afa4 | ||
|
f40a036d97 | ||
|
3f07e232aa | ||
|
f44e23b8cc | ||
|
67a6776fba | ||
|
cdaf45f91c | ||
|
e1b94487ef | ||
|
2531ebf685 | ||
|
01909b07ce | ||
|
39ea08b7cb | ||
|
413ffd7470 | ||
|
66645baa75 | ||
|
021f0be119 | ||
|
1962fc88d6 | ||
|
fa12301e08 | ||
|
9f934abd48 | ||
|
4680954112 | ||
|
7e6ffc34fb | ||
|
95135af6b3 | ||
|
c81a47a692 | ||
|
3bd9fc9f43 | ||
|
c664d6dc32 | ||
|
a182ec12cf | ||
|
70bf316f9d | ||
|
2979fb4a9b | ||
|
a33be2d67a | ||
|
c6878f9c9d | ||
|
1d65f4471b | ||
|
e9de3748bd | ||
|
ea40afbe03 | ||
|
01c70868ef | ||
|
66d701e788 | ||
|
6eff14a71d | ||
|
506152d4e7 | ||
|
6e9c96a0e5 | ||
|
e58be4d57e | ||
|
e94edbdb8f | ||
|
0c8d2ea557 | ||
|
07e3456631 | ||
|
e65d554309 | ||
|
f5652cf946 | ||
|
399d0a5bf0 | ||
|
589521bfd8 | ||
|
d802b6ab44 | ||
|
45863b4651 | ||
|
f34c2b1714 | ||
|
78750bf753 | ||
|
65d585496c | ||
|
194d3b9e17 | ||
|
b4b85e569e | ||
|
daabfeb0e2 | ||
|
c61b57f7ab | ||
|
7cae0920b8 | ||
|
920e4ba6b1 | ||
|
16e58a1911 | ||
|
ec7570f93e | ||
|
ae2993ecae | ||
|
ee778ca8f9 | ||
|
a2ff5fbfdb | ||
|
eeb4be6e4b | ||
|
aad3306bdf | ||
|
35b727ac39 | ||
|
abf07966be | ||
|
a1c81955d3 | ||
|
ad7538f394 | ||
|
c0a909296e | ||
|
7186cd09bf | ||
|
db8583b1c6 | ||
|
07be61585c | ||
|
8bdd811a16 | ||
|
c69d88c45a | ||
|
b18fa2ebc2 | ||
|
f838319455 | ||
|
0d852474be | ||
|
dd5a198222 | ||
|
2d067f7498 | ||
|
a6c1e42c0a | ||
|
ff783d15e8 | ||
|
e1f14aca9b | ||
|
65ff45e202 | ||
|
f330267361 | ||
|
1de28fa566 | ||
|
b08001183e | ||
|
0121adec03 | ||
|
4daeb41f0e | ||
|
b2df22469b | ||
|
1bf80e861d | ||
|
5bb2beb179 | ||
|
852a540cb0 | ||
|
8b38aebbc7 | ||
|
fa3c25ab66 | ||
|
30df1dbe3f | ||
|
6d61e3590d | ||
|
e71650e6ab | ||
|
d81b3805e3 | ||
|
416253496d | ||
|
29ec5bff60 | ||
|
6c691a73bd | ||
|
74cb2e054f | ||
|
5b6329a12e | ||
|
973ba58744 | ||
|
1f60bcb2d0 | ||
|
8e8354caec | ||
|
e26c547afc | ||
|
fc13fdceca | ||
|
d585b1fcb6 | ||
|
57bd0ef4f5 | ||
|
d140f99b68 | ||
|
90766685ae | ||
|
d65638efe1 | ||
|
b34572e7ce | ||
|
c4c0cd1b77 | ||
|
9f42f17088 | ||
|
d570870be5 | ||
|
8671bf70ab | ||
|
e26729b483 | ||
|
d4113d9569 | ||
|
c5a5dd859e | ||
|
0961fa1830 | ||
|
f18b8d464d | ||
|
98d7519274 | ||
|
1326a7764a | ||
|
97568195d6 | ||
|
8d2d3a6540 | ||
|
4f6730621a | ||
|
a4bb695fc3 | ||
|
a57bdfffb7 | ||
|
bdb513a660 | ||
|
b5ce53c907 | ||
|
b556fae08f | ||
|
f87ab9a99f | ||
|
a5c973f86b | ||
|
6b2b89da78 | ||
|
7d4330b57a | ||
|
225d14cbbe | ||
|
d2a84c96a4 | ||
|
48f0d9c15e | ||
|
9c7e91a1e9 | ||
|
91e74204b2 | ||
|
fdee4efe98 | ||
|
59bb6dae14 | ||
|
3300f8bafb | ||
|
c61e56d8a6 | ||
|
ad15659fb2 | ||
|
efffc3142a | ||
|
b0a9b58958 | ||
|
4ea46c5765 | ||
|
7de0ba95d0 | ||
|
3ad30c3ff5 | ||
|
3ed2b41a5a | ||
|
3bf4cf5c3f | ||
|
52e7c166fc | ||
|
08a78a1654 | ||
|
81ceefe2f1 | ||
|
c2d04bc478 | ||
|
36fffa5b23 | ||
|
841d5c0299 | ||
|
0bdca8fd9e | ||
|
f48275bc11 | ||
|
aa369de280 | ||
|
543404bcb8 | ||
|
b7166d7da0 | ||
|
cf54608c71 | ||
|
ec20691188 | ||
|
c1af36ac20 | ||
|
f6e8eb52f0 | ||
|
ad7db90c80 | ||
|
cbfb8eb805 | ||
|
df60818883 | ||
|
d5de93b8fa | ||
|
ab6da9530d | ||
|
ca82376657 | ||
|
87f18aa8d7 | ||
|
6340d61397 | ||
|
80d1e36542 | ||
|
f75909db4c | ||
|
12d47455ba | ||
|
9acf591242 | ||
|
bab8673055 | ||
|
3851a77134 | ||
|
8e324e67a4 | ||
|
10245b40ee | ||
|
9534ca2da1 | ||
|
f9d11265d0 | ||
|
d85c125bef | ||
|
62d3d7a32d | ||
|
a3f4a05b0c | ||
|
86465c418d | ||
|
a63d3bf0d6 | ||
|
762e4951f2 | ||
|
d4fc54be18 | ||
|
f327f4cc67 | ||
|
9ba645503b | ||
|
5406693a1e | ||
|
d55955f7d8 | ||
|
765770aaa5 | ||
|
c3e0b746d7 | ||
|
accb0bc35a | ||
|
b16530bb6a | ||
|
ad00553bf8 | ||
|
b70bef77cb | ||
|
ac47b7b8cb | ||
|
abe0817553 | ||
|
ab431b378a | ||
|
a534196315 | ||
|
cd421f98d7 | ||
|
b33d660f88 | ||
|
245c9ae446 | ||
|
8d39431d68 | ||
|
739a231259 | ||
|
426fd14b11 | ||
|
4735372682 | ||
|
4b3fa13163 | ||
|
d40250c3d6 | ||
|
7d2cfd2aaa | ||
|
11fdd417dd | ||
|
1b7b23fab6 | ||
|
10882af7c8 | ||
|
6c573cc9fd | ||
|
2782430887 | ||
|
7522c29f25 | ||
|
706424f0d2 | ||
|
57d404a99b | ||
|
19e2e169b1 | ||
|
2a6ea79260 | ||
|
40333066d6 | ||
|
6d596063de | ||
|
a7c3c9b77d | ||
|
a01de8d944 | ||
|
c0e7774937 | ||
|
00c76003cb | ||
|
b29f87a978 | ||
|
2dc843cddd | ||
|
9f08b4aa15 | ||
|
a84fbd6a74 | ||
|
f8af3a0005 | ||
|
83e51c815d | ||
|
ff24700156 | ||
|
7683691f5a | ||
|
3479f88dab | ||
|
86fc2f157e | ||
|
ffa07c649b | ||
|
2bd61abd71 | ||
|
66df953da1 | ||
|
550a586d2a | ||
|
16473ab691 | ||
|
c5afd0322e | ||
|
c4563c429c | ||
|
eeacace02a | ||
|
caf3807bcc | ||
|
6c7e85d3d8 | ||
|
f0db7623d1 | ||
|
26ed6539ba | ||
|
a9347cd248 | ||
|
60002fc145 | ||
|
20a8654be2 | ||
|
25411333da | ||
|
07d4282603 | ||
|
4bd77797fc | ||
|
03ffbe00c1 | ||
|
5a9099f49c | ||
|
b501ee2b8d | ||
|
a7c3368635 | ||
|
84ee724aa3 | ||
|
da7fe59834 | ||
|
3710dc1e3b | ||
|
db03c7428c | ||
|
9c6fe98f76 | ||
|
c03af0afb3 | ||
|
d109d7f0c5 | ||
|
bf9b257eab | ||
|
11dc0c1774 | ||
|
0a5eda0777 | ||
|
a657a6d2f6 | ||
|
121acd1da7 | ||
|
ec86079747 | ||
|
f1b0a9cb32 | ||
|
0b6cb77b3c | ||
|
8a740d5087 | ||
|
8288774787 | ||
|
d349e3a88e | ||
|
2ef9fbc111 | ||
|
78f81de252 | ||
|
8d9ee8e35b | ||
|
e66ba2e424 | ||
|
fafb48e88f | ||
|
6272c0e901 | ||
|
54314e5bb9 | ||
|
ffbcf19156 | ||
|
dcc8149f58 | ||
|
d2c54fd5fe | ||
|
f40a7b1c77 | ||
|
16f758e13f | ||
|
c333cc0776 | ||
|
3263e81972 | ||
|
397a08afca | ||
|
19070e4b04 | ||
|
0bbc255814 | ||
|
1b06f4ca4f | ||
|
b3eeac637f | ||
|
480b42b36d | ||
|
436074c67a | ||
|
c9a2117570 | ||
|
6155b001b4 | ||
|
8f05af7810 | ||
|
33ac7916d3 | ||
|
461c1ddf3d | ||
|
2428f74fbd | ||
|
bb8e892323 | ||
|
3eecf4ae8a | ||
|
4a53d4cb56 | ||
|
1818a29c29 | ||
|
dd2efc360b | ||
|
8e64992f47 | ||
|
040c72f1c8 | ||
|
d95a1bac3e | ||
|
c6b295b5a0 | ||
|
2a4a6bec18 | ||
|
0d3f8c7b9f | ||
|
d299b97261 | ||
|
5b8ebed81b | ||
|
bb28265261 | ||
|
46f33e5051 | ||
|
06669b12e8 | ||
|
1ca126381b | ||
|
bf5de81b24 | ||
|
d717ffd1a0 | ||
|
c271d73dbd | ||
|
e1a8980d6c | ||
|
ec7ff88dda | ||
|
5b695766ae | ||
|
f5b6909cca | ||
|
98d348893b | ||
|
c942c31e38 | ||
|
70cbdd1117 | ||
|
1114a35e0a | ||
|
d12e5a44b8 | ||
|
34420444db | ||
|
38eb50bf5c | ||
|
6705679cf3 | ||
|
10635bccc9 | ||
|
dee0ec50b9 | ||
|
401bdedae8 | ||
|
99e51a2123 | ||
|
d43ce53f9a | ||
|
f6385fae50 | ||
|
6da1bb5b22 | ||
|
64e1cfcbba | ||
|
fbfcebf417 | ||
|
d15cf994a2 | ||
|
c71887db43 | ||
|
7c634f3615 | ||
|
874b961680 | ||
|
2c1ee698cc | ||
|
b0f0dd3227 | ||
|
de477f7b6c | ||
|
440ede313b | ||
|
976c6c5e41 | ||
|
7e6d25314d | ||
|
cc5c3f7b2c | ||
|
1d62dc4621 | ||
|
e2496562f9 | ||
|
c4a2f8d64f | ||
|
6c620f6f43 | ||
|
af29adb558 | ||
|
3c97775573 | ||
|
f953dc3f5e | ||
|
04b431f191 | ||
|
5cd6c524ea | ||
|
37676757e3 | ||
|
1c82daacb2 | ||
|
9f0a5c5ef0 | ||
|
9bb86132c6 | ||
|
2137a4f663 | ||
|
c9143dd3d8 | ||
|
66d58504d0 | ||
|
0def333550 | ||
|
dea452bdfd | ||
|
d504ed8a9b | ||
|
9503beca6c | ||
|
dfe4884d16 | ||
|
f10f6d176f | ||
|
4e7aa41e3f | ||
|
d91812730b | ||
|
54cf37e917 | ||
|
3de803be2f | ||
|
5ca59807d9 | ||
|
5c3b43cd63 | ||
|
1a6baf223c | ||
|
74c9aa8ac0 | ||
|
fb16727180 | ||
|
9842b035e3 | ||
|
f6b5a52104 | ||
|
f650b1e83c | ||
|
03cbc9b004 | ||
|
43cae922f3 | ||
|
c5c7e7fc4d | ||
|
0c1cf43519 | ||
|
cbbf85c555 | ||
|
56e974ab80 | ||
|
9398052b65 | ||
|
6a8899677d | ||
|
3b34538038 | ||
|
6cf1e05993 | ||
|
baf1336761 | ||
|
4f0e426a12 | ||
|
d5bf051e79 | ||
|
c7c982b67b | ||
|
f7f0d3b1fb | ||
|
d4ab4d16e8 | ||
|
aeed1679d8 | ||
|
6fc67d83f4 | ||
|
06ffe995e1 | ||
|
93bf4d5411 | ||
|
19f2f1fa86 | ||
|
5e94fdcfd5 | ||
|
ec6f5c17c8 | ||
|
758c87f564 | ||
|
b6dde41000 | ||
|
648c83ea03 | ||
|
cc4cacdb5e | ||
|
c84cdb6bfb | ||
|
a7ea8ecc29 | ||
|
24839ad4be | ||
|
e11b89efd2 | ||
|
4566c82a85 | ||
|
024f3be13a | ||
|
af2dae2ff3 | ||
|
d92372af70 | ||
|
a70381e7c1 | ||
|
21c0aaf417 | ||
|
ce10bed5d8 | ||
|
eb12c1db1b | ||
|
276c11b04a | ||
|
0255562d93 | ||
|
26a7107cd5 | ||
|
89918865b0 | ||
|
f2cbe7f3c2 | ||
|
83418c3195 | ||
|
5592f8df1a | ||
|
4311a5646f | ||
|
c103182bc7 | ||
|
243697e25a | ||
|
dfc6e7833c | ||
|
e0b4ea6652 | ||
|
503ad8e905 | ||
|
d26a9d583f | ||
|
0b1800fc10 | ||
|
92d7be4338 | ||
|
ce89ff07e7 | ||
|
5c1b72853f | ||
|
5d38143c3f | ||
|
353c68cfa6 | ||
|
9087e72f0e | ||
|
4ad4a3bf24 | ||
|
17160e9379 | ||
|
ed84fee2bf | ||
|
25ddd7b152 | ||
|
5ad709a2e2 | ||
|
32ace140df | ||
|
bc063b8f97 | ||
|
03681cd68d | ||
|
fe8b98a1f3 | ||
|
a193128543 | ||
|
6a10048339 | ||
|
9087dd9210 | ||
|
a08c038c9c | ||
|
e191bc253d | ||
|
c8d866d01a | ||
|
01d25c5c37 | ||
|
25d6b3d1c8 | ||
|
639183a783 | ||
|
80477f71b3 | ||
|
d49b50a055 | ||
|
54592202ef | ||
|
be60263d47 | ||
|
441eca75b2 | ||
|
266dd98521 | ||
|
b0e74464b1 | ||
|
daaaf221cb | ||
|
e2779e1155 | ||
|
514bab47a2 | ||
|
fbea49dbab | ||
|
5cf9b052dd | ||
|
3b50cd36ba | ||
|
ed678f58d3 | ||
|
aa8d800577 | ||
|
a1cfae8c98 | ||
|
c6513fcfc6 | ||
|
d3d50b456e | ||
|
196eca2dc4 | ||
|
6fcfe80a65 | ||
|
992d998695 | ||
|
e58920b2c6 | ||
|
0804f46095 | ||
|
662d9a0ed0 | ||
|
d957404adc | ||
|
779c98e314 | ||
|
8de270cdaf | ||
|
b71a481e63 | ||
|
5a5e5bbdc6 | ||
|
3b3d3eaa04 | ||
|
811fea14d8 | ||
|
9794b4f778 | ||
|
b73a9234d9 | ||
|
c9b3d32031 | ||
|
4542bcb57f | ||
|
1072f593f1 |
|
@ -1,4 +1 @@
|
|||
# Update the VARIANT arg to pick an Elixir version: latest, 1.11.4, etc.
|
||||
ARG VARIANT=latest
|
||||
|
||||
FROM ghcr.io/processone/elixir:${VARIANT}
|
||||
FROM ghcr.io/processone/devcontainer:latest
|
||||
|
|
|
@ -1,48 +1,7 @@
|
|||
{
|
||||
"name": "ejabberd",
|
||||
// "dockerComposeFile": "docker-compose.yml",
|
||||
"build": {
|
||||
"dockerfile": "Dockerfile",
|
||||
"args": {
|
||||
"VARIANT": "latest" // 1.11.4
|
||||
}
|
||||
},
|
||||
"workspaceFolder": "/workspace",
|
||||
|
||||
// Set *default* container specific settings.json values on container create.
|
||||
"settings": {
|
||||
"terminal.integrated.defaultProfile.linux": "/bin/zsh",
|
||||
},
|
||||
|
||||
// Add the IDs of extensions you want installed when the container is created.
|
||||
"extensions": ["pgourlain.erlang", "jakebecker.elixir-ls"],
|
||||
|
||||
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||
"forwardPorts": [5222, 5280, 5269],
|
||||
|
||||
// Use 'postCreateCommand' to run commands after the container is created.
|
||||
// "postCreateCommand": "sh .devcontainer/post-create.sh",
|
||||
|
||||
// Uncomment to connect as a non-root user. See https://aka.ms/vscode-remote/containers/non-root.
|
||||
"remoteUser": "vscode",
|
||||
"portsAttributes": {
|
||||
"1883": {
|
||||
"label": "MQTT"
|
||||
},
|
||||
"5222": {
|
||||
"label": "XMPP C2S"
|
||||
},
|
||||
"5223": {
|
||||
"label": "Legacy XMPP C2S"
|
||||
},
|
||||
"5269": {
|
||||
"label": "XMPP S2S"
|
||||
},
|
||||
"5280": {
|
||||
"label": "ejabberd HTTP"
|
||||
},
|
||||
"5443": {
|
||||
"label": "ejabberd HTTPS"
|
||||
}
|
||||
}
|
||||
"build": {"dockerfile": "Dockerfile"},
|
||||
"extensions": ["erlang-ls.erlang-ls"],
|
||||
"postCreateCommand": ".devcontainer/prepare-container.sh",
|
||||
"remoteUser": "vscode"
|
||||
}
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
ejabberd:
|
||||
image: ejabberd/ecs
|
||||
ports:
|
||||
- 5222:5222
|
||||
- 5223:5223
|
||||
- 5269:5269
|
||||
- 5280:5280
|
||||
- 1883:1883
|
3
.devcontainer/prepare-container.sh
Executable file
3
.devcontainer/prepare-container.sh
Executable file
|
@ -0,0 +1,3 @@
|
|||
echo "export PATH=/workspaces/ejabberd/_build/relive:$PATH" >>$HOME/.bashrc
|
||||
echo "COOKIE" >$HOME/.erlang.cookie
|
||||
chmod 400 $HOME/.erlang.cookie
|
|
@ -43,4 +43,4 @@ Mnesia.nonode@nohost/
|
|||
/ejabberd-*.rpm
|
||||
/ejabberd-*.run
|
||||
/ejabberd-*.tar.gz
|
||||
|
||||
/.github/container/Dockerfile
|
||||
|
|
3
.github/ISSUE_TEMPLATE/bug_report.md
vendored
3
.github/ISSUE_TEMPLATE/bug_report.md
vendored
|
@ -6,8 +6,7 @@ assignees: ''
|
|||
|
||||
---
|
||||
|
||||
Before creating a ticket, please consider if this should fit the discussion forum better:
|
||||
https://github.com/processone/ejabberd/discussions
|
||||
Before creating a ticket, please consider if this should fit the [discussion forum](https://github.com/processone/ejabberd/discussions) better.
|
||||
|
||||
## Environment
|
||||
|
||||
|
|
9
.github/ISSUE_TEMPLATE/feature_request.md
vendored
9
.github/ISSUE_TEMPLATE/feature_request.md
vendored
|
@ -7,17 +7,20 @@ assignees: ''
|
|||
|
||||
---
|
||||
|
||||
Before creating a ticket, please consider if this should fit the discussion forum better:
|
||||
https://github.com/processone/ejabberd/discussions
|
||||
Before creating a ticket, please consider if this should fit the [discussion forum](https://github.com/processone/ejabberd/discussions) better.
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when...
|
||||
|
||||
**Describe the solution you'd like**
|
||||
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
|
||||
Add any other context or screenshots about the feature request here.
|
||||
|
|
205
.github/container/Dockerfile
vendored
205
.github/container/Dockerfile
vendored
|
@ -1,16 +1,27 @@
|
|||
FROM alpine:3.15.4 AS build
|
||||
ARG VERSION=master
|
||||
#' Define default build variables
|
||||
## specifc ARGs for METHOD='direct'
|
||||
ARG OTP_VSN='26.2'
|
||||
ARG ELIXIR_VSN='1.16.2'
|
||||
## specifc ARGs for METHOD='package'
|
||||
ARG ALPINE_VSN='3.19'
|
||||
## general ARGs
|
||||
ARG UID='9000'
|
||||
ARG USER='ejabberd'
|
||||
ARG HOME="opt/$USER"
|
||||
ARG METHOD='direct'
|
||||
ARG BUILD_DIR="/$USER"
|
||||
ARG VERSION='master'
|
||||
|
||||
RUN apk upgrade --update musl \
|
||||
&& apk add \
|
||||
################################################################################
|
||||
#' METHOD='direct' - build and install ejabberd directly from source
|
||||
FROM docker.io/erlang:${OTP_VSN}-alpine AS direct
|
||||
|
||||
RUN apk -U add --no-cache \
|
||||
autoconf \
|
||||
automake \
|
||||
bash \
|
||||
build-base \
|
||||
curl \
|
||||
elixir \
|
||||
erlang-odbc \
|
||||
erlang-reltool \
|
||||
expat-dev \
|
||||
file \
|
||||
gd-dev \
|
||||
|
@ -19,37 +30,83 @@ RUN apk upgrade --update musl \
|
|||
libpng-dev \
|
||||
libwebp-dev \
|
||||
linux-pam-dev \
|
||||
openssl \
|
||||
openssl-dev \
|
||||
sqlite-dev \
|
||||
yaml-dev \
|
||||
zlib-dev
|
||||
|
||||
ARG ELIXIR_VSN
|
||||
RUN wget -O - https://github.com/elixir-lang/elixir/archive/v$ELIXIR_VSN.tar.gz \
|
||||
| tar -xzf -
|
||||
|
||||
WORKDIR elixir-$ELIXIR_VSN
|
||||
RUN make install clean
|
||||
|
||||
RUN mix local.hex --force \
|
||||
&& mix local.rebar --force
|
||||
|
||||
COPY . ./ejabberd
|
||||
|
||||
WORKDIR ejabberd
|
||||
ARG BUILD_DIR
|
||||
COPY / $BUILD_DIR/
|
||||
|
||||
WORKDIR $BUILD_DIR
|
||||
RUN mv .github/container/ejabberdctl.template . \
|
||||
&& ./autogen.sh \
|
||||
&& ./configure --with-rebar=mix --enable-all \
|
||||
&& make deps \
|
||||
&& make rel
|
||||
|
||||
RUN cp -r _build/prod/rel/ejabberd/ /opt/ejabberd-$VERSION \
|
||||
&& mkdir -p /opt/ejabberd \
|
||||
&& mv /opt/ejabberd-$VERSION/conf /opt/ejabberd/conf
|
||||
WORKDIR /rootfs
|
||||
ARG VERSION
|
||||
ARG HOME
|
||||
RUN mkdir -p $HOME $HOME-$VERSION \
|
||||
&& cp -r $BUILD_DIR/_build/prod/rel/ejabberd/* $HOME-$VERSION \
|
||||
&& mv $HOME-$VERSION/conf $HOME/conf
|
||||
|
||||
RUN BINPATH=$(dirname $(find /opt -name msgs))/bin/ \
|
||||
&& mkdir -p $BINPATH \
|
||||
&& cp tools/captcha*.sh $BINPATH
|
||||
RUN cp -p $BUILD_DIR/tools/captcha*.sh $HOME-$VERSION/lib
|
||||
|
||||
RUN [ ! -d .ejabberd-modules ] || cp -r .ejabberd-modules /opt/ejabberd/
|
||||
RUN find "$HOME-$VERSION/bin" -name 'ejabberd' -delete \
|
||||
&& find "$HOME-$VERSION/releases" -name 'COOKIE' -delete
|
||||
|
||||
RUN export PEM=/opt/ejabberd/conf/server.pem \
|
||||
&& curl -o "/opt/ejabberd/conf/cacert.pem" 'https://curl.se/ca/cacert.pem' \
|
||||
RUN wget -O "$HOME/conf/cacert.pem" 'https://curl.se/ca/cacert.pem' \
|
||||
&& sed -i '/^loglevel:/a \ \
|
||||
\nca_file: /opt/ejabberd/conf/cacert.pem \
|
||||
\ncertfiles: \
|
||||
\n - /opt/ejabberd/conf/server.pem' "$HOME/conf/ejabberd.yml"
|
||||
|
||||
################################################################################
|
||||
#' METHOD='package' - install ejabberd from binary tarball package
|
||||
FROM docker.io/alpine:${ALPINE_VSN} AS package
|
||||
COPY tarballs/ejabberd-*-linux-musl-*.tar.gz /tmp/
|
||||
WORKDIR /rootfs
|
||||
ARG HOME
|
||||
RUN home_root_dir=$(echo $HOME | sed 's|\(.*\)/.*|\1 |') \
|
||||
&& mkdir -p $home_root_dir \
|
||||
&& ARCH=$(uname -m | sed -e 's/x86_64/x64/;s/aarch64/arm64/') \
|
||||
&& tar -xzf /tmp/ejabberd-*-linux-musl-$ARCH.tar.gz -C $home_root_dir
|
||||
|
||||
################################################################################
|
||||
#' Prepare ejabberd for runtime
|
||||
FROM ${METHOD} AS ejabberd
|
||||
RUN apk -U add --no-cache \
|
||||
git \
|
||||
libcap \
|
||||
openssl
|
||||
|
||||
WORKDIR /rootfs
|
||||
ARG HOME
|
||||
RUN mkdir -p usr/local/bin $HOME/conf $HOME/database $HOME/logs $HOME/upload
|
||||
|
||||
ARG BUILD_DIR
|
||||
RUN if [ ! -d $HOME/.ejabberd-modules ]; \
|
||||
then \
|
||||
if [ -d $BUILD_DIR/.ejabberd-modules ]; \
|
||||
then cp -r $BUILD_DIR/.ejabberd-modules $HOME; \
|
||||
else git clone https://github.com/processone/ejabberd-contrib --depth 1 \
|
||||
$HOME/.ejabberd-modules/sources/ejabberd-contrib; \
|
||||
fi \
|
||||
fi
|
||||
|
||||
RUN export PEM=$HOME/conf/server.pem \
|
||||
&& openssl req -x509 \
|
||||
-batch \
|
||||
-nodes \
|
||||
|
@ -57,63 +114,79 @@ RUN export PEM=/opt/ejabberd/conf/server.pem \
|
|||
-keyout $PEM \
|
||||
-out $PEM \
|
||||
-days 3650 \
|
||||
-subj "/CN=localhost" \
|
||||
&& sed -i '/^loglevel:/a \ \
|
||||
\nca_file: /opt/ejabberd/conf/cacert.pem \
|
||||
\ncertfiles: \
|
||||
\n - /opt/ejabberd/conf/server.pem' "/opt/ejabberd/conf/ejabberd.yml"
|
||||
-subj "/CN=localhost"
|
||||
|
||||
FROM alpine:3.15.4
|
||||
ENV HOME=/opt/ejabberd
|
||||
ARG VERSION=master
|
||||
|
||||
RUN apk upgrade --update musl \
|
||||
&& apk add \
|
||||
expat \
|
||||
freetds \
|
||||
gd \
|
||||
jpeg \
|
||||
libgd \
|
||||
libpng \
|
||||
libstdc++ \
|
||||
libwebp \
|
||||
linux-pam \
|
||||
ncurses-libs \
|
||||
openssl \
|
||||
sqlite \
|
||||
sqlite-libs \
|
||||
unixodbc \
|
||||
yaml \
|
||||
zlib \
|
||||
&& ln -fs /usr/lib/libtdsodbc.so.0 /usr/lib/libtdsodbc.so \
|
||||
&& rm -rf /var/cache/apk/*
|
||||
|
||||
COPY --from=build /opt /opt
|
||||
RUN echo -e \
|
||||
RUN home_root_dir=$(echo $HOME | sed 's|\(.*\)/.*|\1 |') \
|
||||
&& setcap 'cap_net_bind_service=+ep' $(find $home_root_dir -name beam.smp) \
|
||||
&& echo -e \
|
||||
"#!/bin/sh \
|
||||
\n[ -z \$ERLANG_NODE_ARG ] && export ERLANG_NODE_ARG=ejabberd@localhost \
|
||||
\nexport CONFIG_DIR=/opt/ejabberd/conf \
|
||||
\nexport LOGS_DIR=/opt/ejabberd/logs \
|
||||
\nexport SPOOL_DIR=/opt/ejabberd/database \
|
||||
\nexec /opt/ejabberd-$VERSION/bin/ejabberdctl \"\$@\"" > /usr/local/bin/ejabberdctl \
|
||||
&& chmod +x /usr/local/bin/ejabberdctl
|
||||
\nexport CONFIG_DIR=/$HOME/conf \
|
||||
\nexport LOGS_DIR=/$HOME/logs \
|
||||
\nexport SPOOL_DIR=/$HOME/database \
|
||||
\nexec /$(find $home_root_dir -name ejabberdctl) \"\$@\"" \
|
||||
> usr/local/bin/ejabberdctl \
|
||||
&& chmod +x usr/local/bin/* \
|
||||
&& scanelf --needed --nobanner --format '%n#p' --recursive $home_root_dir \
|
||||
| tr ',' '\n' \
|
||||
| sort -u \
|
||||
| awk 'system("[ -e $home_root_dir" $1 " ]") == 0 { next } { print "so:" $1 }' \
|
||||
| sed -e "s|so:libc.so|so:libc.musl-$(uname -m).so.1|" \
|
||||
> /tmp/runDeps
|
||||
|
||||
RUN addgroup ejabberd -g 9000 \
|
||||
&& adduser -s /bin/sh -D -G ejabberd ejabberd -u 9000 \
|
||||
&& mkdir -p $HOME/conf $HOME/database $HOME/logs $HOME/upload \
|
||||
&& chown -R ejabberd:ejabberd $HOME
|
||||
ARG UID
|
||||
RUN chown -R $UID:$UID $HOME
|
||||
|
||||
################################################################################
|
||||
#' METHOD='direct' - Remove erlang/OTP & rebar3
|
||||
FROM docker.io/erlang:${OTP_VSN}-alpine AS runtime-direct
|
||||
RUN apk del .erlang-rundeps \
|
||||
&& rm -f $(which rebar3) \
|
||||
&& find /usr -type d -name 'erlang' -exec rm -rf {} + \
|
||||
&& find /usr -type l -exec test ! -e {} \; -delete
|
||||
|
||||
################################################################################
|
||||
#' METHOD='package' - define runtime base image
|
||||
FROM docker.io/alpine:${ALPINE_VSN} AS runtime-package
|
||||
|
||||
################################################################################
|
||||
#' Update alpine, finalize runtime environment
|
||||
FROM runtime-${METHOD} AS runtime
|
||||
COPY --from=ejabberd /tmp/runDeps /tmp/runDeps
|
||||
RUN apk -U upgrade --available --no-cache \
|
||||
&& apk add --no-cache \
|
||||
$(cat /tmp/runDeps) \
|
||||
so:libcap.so.2 \
|
||||
so:libtdsodbc.so.0 \
|
||||
tini \
|
||||
&& ln -fs /usr/lib/libtdsodbc.so.0 /usr/lib/libtdsodbc.so
|
||||
|
||||
ARG USER
|
||||
ARG UID
|
||||
ARG HOME
|
||||
RUN addgroup $USER -g $UID \
|
||||
&& adduser -s /sbin/nologin -D -u $UID -h /$HOME -G $USER $USER
|
||||
|
||||
################################################################################
|
||||
#' Build together production image
|
||||
FROM scratch AS prod
|
||||
ARG USER
|
||||
ARG HOME
|
||||
|
||||
COPY --from=runtime / /
|
||||
COPY --from=ejabberd /rootfs /
|
||||
|
||||
HEALTHCHECK \
|
||||
--interval=1m \
|
||||
--timeout=5s \
|
||||
--start-period=5s \
|
||||
--retries=10 \
|
||||
CMD /usr/local/bin/ejabberdctl status
|
||||
CMD ejabberdctl status
|
||||
|
||||
WORKDIR $HOME
|
||||
USER ejabberd
|
||||
VOLUME ["$HOME/conf", "$HOME/database", "$HOME/logs", "$HOME/upload"]
|
||||
WORKDIR /$HOME
|
||||
USER $USER
|
||||
VOLUME ["/$HOME"]
|
||||
EXPOSE 1883 4369-4399 5210 5222 5269 5280 5443
|
||||
|
||||
ENTRYPOINT ["/usr/local/bin/ejabberdctl"]
|
||||
ENTRYPOINT ["/sbin/tini","--","ejabberdctl"]
|
||||
CMD ["foreground"]
|
||||
|
|
135
.github/container/ejabberdctl.template
vendored
135
.github/container/ejabberdctl.template
vendored
|
@ -15,10 +15,10 @@ SCRIPT_DIR="$(cd "$(dirname "$SCRIPT")" && pwd -P)"
|
|||
# shellcheck disable=SC2034
|
||||
ERTS_VSN="{{erts_vsn}}"
|
||||
ERL="{{erl}}"
|
||||
IEX="{{bindir}}/iex"
|
||||
EPMD="{{epmd}}"
|
||||
[ -z "$ERLANG_COOKIE" ] && ERL_OPTIONS="-setcookie $(cat "${SCRIPT_DIR%/*}/releases/COOKIE")"
|
||||
[ -n "$ERLANG_COOKIE" ] && [ ! -f "$HOME"/.erlang.cookie ] && echo "$ERLANG_COOKIE" > "$HOME"/.erlang.cookie && chmod 400 "$HOME"/.erlang.cookie
|
||||
IEX="{{iexpath}}"
|
||||
COOKIE_FILE="$HOME"/.erlang.cookie
|
||||
[ -n "$ERLANG_COOKIE" ] && [ ! -f "$COOKIE_FILE" ] && echo "$ERLANG_COOKIE" > "$COOKIE_FILE" && chmod 400 "$COOKIE_FILE"
|
||||
|
||||
# check the proper system user is used
|
||||
case $(id -un) in
|
||||
|
@ -60,7 +60,6 @@ done
|
|||
# define ejabberd variables if not already defined from the command line
|
||||
: "${CONFIG_DIR:="{{config_dir}}"}"
|
||||
: "${LOGS_DIR:="{{logs_dir}}"}"
|
||||
: "${SPOOL_DIR:="{{spool_dir}}"}"
|
||||
: "${EJABBERD_CONFIG_PATH:="$CONFIG_DIR/ejabberd.yml"}"
|
||||
: "${EJABBERDCTL_CONFIG_PATH:="$CONFIG_DIR/ejabberdctl.cfg"}"
|
||||
# Allows passing extra Erlang command-line arguments in vm.args file
|
||||
|
@ -69,6 +68,7 @@ done
|
|||
[ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH"
|
||||
[ -n "$ERLANG_NODE_ARG" ] && ERLANG_NODE="$ERLANG_NODE_ARG"
|
||||
[ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && S="-s"
|
||||
: "${SPOOL_DIR:="{{spool_dir}}"}"
|
||||
: "${EJABBERD_LOG_PATH:="$LOGS_DIR/ejabberd.log"}"
|
||||
|
||||
# define erl parameters
|
||||
|
@ -77,8 +77,11 @@ if [ -n "$FIREWALL_WINDOW" ] ; then
|
|||
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_listen_min ${FIREWALL_WINDOW%-*} inet_dist_listen_max ${FIREWALL_WINDOW#*-}"
|
||||
fi
|
||||
if [ -n "$INET_DIST_INTERFACE" ] ; then
|
||||
INET_DIST_INTERFACE2=$("$ERL" -noshell -eval 'case inet:parse_address("'$INET_DIST_INTERFACE'") of {ok,IP} -> io:format("~p",[IP]); _ -> ok end.' -s erlang halt)
|
||||
INET_DIST_INTERFACE2=$("$ERL" $ERLANG_OPTS -noshell -eval 'case inet:parse_address("'$INET_DIST_INTERFACE'") of {ok,IP} -> io:format("~p",[IP]); _ -> ok end.' -s erlang halt)
|
||||
if [ -n "$INET_DIST_INTERFACE2" ] ; then
|
||||
if [ "$(echo "$INET_DIST_INTERFACE2" | grep -o "," | wc -l)" -eq 7 ] ; then
|
||||
INET_DIST_INTERFACE2="$INET_DIST_INTERFACE2 -proto_dist inet6_tcp"
|
||||
fi
|
||||
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_use_interface $INET_DIST_INTERFACE2"
|
||||
fi
|
||||
fi
|
||||
|
@ -90,11 +93,12 @@ ERL_CRASH_DUMP="$LOGS_DIR"/erl_crash_$(date "+%Y%m%d-%H%M%S").dump
|
|||
ERL_INETRC="$CONFIG_DIR"/inetrc
|
||||
|
||||
# define ejabberd parameters
|
||||
EJABBERD_OPTS="$EJABBERD_OPTS\
|
||||
EJABBERD_OPTS="\
|
||||
$(sed '/^log_rotate_size/!d;s/:[ \t]*\([0-9]\{1,\}\).*/ \1/;s/:[ \t]*\(infinity\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
|
||||
$(sed '/^log_rotate_count/!d;s/:[ \t]*\([0-9]*\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
|
||||
$(sed '/^log_burst_limit_count/!d;s/:[ \t]*\([0-9]*\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
|
||||
$(sed '/^log_burst_limit_window_time/!d;s/:[ \t]*\([0-9]*[a-z]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")"
|
||||
$(sed '/^log_burst_limit_window_time/!d;s/:[ \t]*\([0-9]*[a-z]*\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
|
||||
$EJABBERD_OPTS"
|
||||
[ -n "$EJABBERD_OPTS" ] && EJABBERD_OPTS="-ejabberd $EJABBERD_OPTS"
|
||||
EJABBERD_OPTS="-mnesia dir \"$SPOOL_DIR\" $MNESIA_OPTIONS $EJABBERD_OPTS -s ejabberd"
|
||||
|
||||
|
@ -129,8 +133,8 @@ run_cmd()
|
|||
exec_cmd()
|
||||
{
|
||||
case $EXEC_CMD in
|
||||
as_install_user) su -s /bin/sh -c '"$0" "$@"' "$INSTALLUSER" -- "$@" ;;
|
||||
as_current_user) exec "$@" ;;
|
||||
as_install_user) su -s /bin/sh -c 'exec "$0" "$@"' "$INSTALLUSER" -- "$@" ;;
|
||||
esac
|
||||
}
|
||||
run_erl()
|
||||
|
@ -162,9 +166,11 @@ debugwarning()
|
|||
echo "Please be extremely cautious with your actions,"
|
||||
echo "and exit immediately if you are not completely sure."
|
||||
echo ""
|
||||
echo "To detach this shell from ejabberd, press:"
|
||||
echo " control+c, control+c"
|
||||
echo "To exit and detach this shell from ejabberd, press:"
|
||||
echo " control+g and then q"
|
||||
echo ""
|
||||
#vt100 echo "Please do NOT use control+c in this debug shell !"
|
||||
#vt100 echo ""
|
||||
echo "--------------------------------------------------------------------"
|
||||
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
||||
echo " EJABBERD_BYPASS_WARNINGS=true"
|
||||
|
@ -185,8 +191,8 @@ livewarning()
|
|||
echo "Please be extremely cautious with your actions,"
|
||||
echo "and exit immediately if you are not completely sure."
|
||||
echo ""
|
||||
echo "To exit this LIVE mode and stop ejabberd, press:"
|
||||
echo " q(). and press the Enter key"
|
||||
echo "To exit and detach this shell from ejabberd, press:"
|
||||
echo " control+g and then q"
|
||||
echo ""
|
||||
echo "--------------------------------------------------------------------"
|
||||
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
||||
|
@ -197,6 +203,39 @@ livewarning()
|
|||
fi
|
||||
}
|
||||
|
||||
check_etop_result()
|
||||
{
|
||||
result=$?
|
||||
if [ $result -eq 1 ] ; then
|
||||
echo ""
|
||||
echo "It seems there was some problem running 'ejabberdctl etop'."
|
||||
echo "Is the error message something like this?"
|
||||
echo " Failed to load module 'etop' because it cannot be found..."
|
||||
echo "Then probably ejabberd was compiled with development tools disabled."
|
||||
echo "To use 'etop', recompile ejabberd with: ./configure --enable-tools"
|
||||
echo ""
|
||||
exit $result
|
||||
fi
|
||||
}
|
||||
|
||||
check_iex_result()
|
||||
{
|
||||
result=$?
|
||||
if [ $result -eq 127 ] ; then
|
||||
echo ""
|
||||
echo "It seems there was some problem finding 'iex' binary from Elixir."
|
||||
echo "Probably ejabberd was compiled with Rebar3 and Elixir disabled, like:"
|
||||
echo " ./configure"
|
||||
echo "which is equivalent to:"
|
||||
echo " ./configure --with-rebar=rebar3 --disable-elixir"
|
||||
echo "To use 'iex', recompile ejabberd enabling Elixir or using Mix:"
|
||||
echo " ./configure --enable-elixir"
|
||||
echo " ./configure --with-rebar=mix"
|
||||
echo ""
|
||||
exit $result
|
||||
fi
|
||||
}
|
||||
|
||||
help()
|
||||
{
|
||||
echo ""
|
||||
|
@ -225,16 +264,30 @@ help()
|
|||
}
|
||||
|
||||
# dynamic node name helper
|
||||
uid()
|
||||
{
|
||||
uuid=$(uuidgen 2>/dev/null)
|
||||
random=$(awk 'BEGIN { srand(); print int(rand()*32768) }' /dev/null)
|
||||
[ -z "$uuid" ] && [ -f /proc/sys/kernel/random/uuid ] && uuid=$(cat /proc/sys/kernel/random/uuid)
|
||||
[ -z "$uuid" ] && uuid=$(printf "%X" "${random:-$$}$(date +%M%S)")
|
||||
uuid=$(printf '%s' $uuid | sed 's/^\(...\).*$/\1/')
|
||||
[ $# -eq 0 ] && echo "${uuid}-${ERLANG_NODE}"
|
||||
[ $# -eq 1 ] && echo "${uuid}-${1}-${ERLANG_NODE}"
|
||||
[ $# -eq 2 ] && echo "${uuid}-${1}@${2}"
|
||||
uid() {
|
||||
ERTSVERSION="$("$ERL" -version 2>&1 | sed 's|.*\([0-9][0-9]\).*|\1|g')"
|
||||
if [ $ERTSVERSION -lt 11 ] ; then # otp 23.0 includes erts 11.0
|
||||
# Erlang/OTP lower than 23, which doesn's support dynamic node code
|
||||
N=1
|
||||
PF=$(( $$ % 97 ))
|
||||
while
|
||||
case $# in
|
||||
0) NN="${PF}-${N}-${ERLANG_NODE}"
|
||||
;;
|
||||
1) NN="${PF}-${N}-${1}-${ERLANG_NODE}"
|
||||
;;
|
||||
2) NN="${PF}-${N}-${1}@${2}"
|
||||
;;
|
||||
esac
|
||||
N=$(( N + 1 + ( $$ % 5 ) ))
|
||||
"$EPMD" -names 2>/dev/null | grep -q " ${NN%@*} "
|
||||
do :; done
|
||||
echo $NN
|
||||
else
|
||||
# Erlang/OTP 23 or higher: use native dynamic node code
|
||||
# https://www.erlang.org/patches/otp-23.0#OTP-13812
|
||||
echo undefined
|
||||
fi
|
||||
}
|
||||
|
||||
# stop epmd if there is no other running node
|
||||
|
@ -281,8 +334,19 @@ post_waiter_loop()
|
|||
LIST=$@
|
||||
HEAD=${LIST%% ; *}
|
||||
TAIL=${LIST#* ; }
|
||||
echo ":> ejabberdctl $HEAD"
|
||||
$0 $HEAD
|
||||
HEAD2=${HEAD#\! *}
|
||||
echo ":> ejabberdctl $HEAD2"
|
||||
$0 $HEAD2
|
||||
ctlstatus=$?
|
||||
if [ $ctlstatus -ne 0 ] ; then
|
||||
if [ "$HEAD" != "$HEAD2" ] ; then
|
||||
echo ":> FAILURE in command '$HEAD2' !!! Ignoring result"
|
||||
else
|
||||
echo ":> FAILURE in command '$HEAD' !!! Stopping ejabberd..."
|
||||
$0 halt > /dev/null
|
||||
exit $ctlstatus
|
||||
fi
|
||||
fi
|
||||
[ "$HEAD" = "$TAIL" ] || post_waiter_loop $TAIL
|
||||
}
|
||||
|
||||
|
@ -299,7 +363,9 @@ wait_status()
|
|||
if [ $timeout -eq 0 ] ; then
|
||||
status="$1"
|
||||
else
|
||||
run_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \
|
||||
run_erl "$(uid ctl)" -hidden -noinput \
|
||||
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
|
||||
-s ejabberd_ctl \
|
||||
-extra "$ERLANG_NODE" $NO_TIMEOUT status > /dev/null
|
||||
status="$?"
|
||||
fi
|
||||
|
@ -342,24 +408,31 @@ case $1 in
|
|||
;;
|
||||
etop)
|
||||
set_dist_client
|
||||
exec_erl "$(uid top)" -hidden -node "$ERLANG_NODE" -s etop \
|
||||
-s erlang halt -output text
|
||||
exec_erl "$(uid top)" -hidden -remsh "$ERLANG_NODE" \
|
||||
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
|
||||
-s etop \
|
||||
-output text
|
||||
check_etop_result
|
||||
;;
|
||||
iexdebug)
|
||||
debugwarning
|
||||
set_dist_client
|
||||
exec_iex "$(uid debug)" --remsh "$ERLANG_NODE"
|
||||
check_iex_result
|
||||
;;
|
||||
iexlive)
|
||||
livewarning
|
||||
exec_iex "$ERLANG_NODE" --erl "$EJABBERD_OPTS" --app ejabberd
|
||||
exec_iex "$ERLANG_NODE" --erl "$EJABBERD_OPTS"
|
||||
check_iex_result
|
||||
;;
|
||||
ping)
|
||||
PEER=${2:-$ERLANG_NODE}
|
||||
[ "$PEER" = "${PEER%.*}" ] && PS="-s"
|
||||
set_dist_client
|
||||
exec_cmd "$ERL" ${PS:--}name "$(uid ping "$(hostname $PS)")" $ERLANG_OPTS \
|
||||
-noinput -hidden -eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \
|
||||
-noinput -hidden \
|
||||
-eval 'net_kernel:connect_node('"'$PEER'"')' \
|
||||
-eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \
|
||||
-s erlang halt -output text
|
||||
;;
|
||||
started)
|
||||
|
@ -375,7 +448,9 @@ case $1 in
|
|||
;;
|
||||
*)
|
||||
set_dist_client
|
||||
run_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \
|
||||
run_erl "$(uid ctl)" -hidden -noinput \
|
||||
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
|
||||
-s ejabberd_ctl \
|
||||
-extra "$ERLANG_NODE" $NO_TIMEOUT "$@"
|
||||
result=$?
|
||||
case $result in
|
||||
|
|
229
.github/workflows/ci-19.3.yml
vendored
229
.github/workflows/ci-19.3.yml
vendored
|
@ -1,229 +0,0 @@
|
|||
name: CI (19.3)
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- '.devcontainer/**'
|
||||
- 'examples/**'
|
||||
- 'lib/**'
|
||||
- 'man/**'
|
||||
- 'priv/**'
|
||||
- '**.md'
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '.devcontainer/**'
|
||||
- 'examples/**'
|
||||
- 'lib/**'
|
||||
- 'man/**'
|
||||
- 'priv/**'
|
||||
- '**.md'
|
||||
|
||||
jobs:
|
||||
|
||||
tests:
|
||||
name: Tests
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
otp: ['19.3']
|
||||
runs-on: ubuntu-18.04
|
||||
services:
|
||||
redis:
|
||||
image: redis
|
||||
ports:
|
||||
- 6379:6379
|
||||
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Get specific Erlang/OTP
|
||||
uses: erlef/setup-beam@v1
|
||||
with:
|
||||
otp-version: ${{ matrix.otp }}
|
||||
|
||||
- name: Get a compatible Rebar3
|
||||
run: |
|
||||
rm rebar3
|
||||
wget https://github.com/processone/ejabberd/raw/21.12/rebar3
|
||||
chmod +x rebar3
|
||||
|
||||
- name: Prepare databases
|
||||
run: |
|
||||
sudo systemctl start mysql.service
|
||||
sudo systemctl start postgresql.service
|
||||
mysql -u root -proot -e "CREATE USER 'ejabberd_test'@'localhost'
|
||||
IDENTIFIED BY 'ejabberd_test';"
|
||||
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
|
||||
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
|
||||
TO 'ejabberd_test'@'localhost';"
|
||||
mysql -u root -proot ejabberd_test < sql/mysql.sql
|
||||
pg_isready
|
||||
sudo -u postgres psql -c "CREATE USER ejabberd_test
|
||||
WITH PASSWORD 'ejabberd_test';"
|
||||
sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -f sql/pg.sql
|
||||
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
|
||||
ON DATABASE ejabberd_test TO ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
|
||||
TABLES IN SCHEMA public
|
||||
TO ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
|
||||
SEQUENCES IN SCHEMA public
|
||||
TO ejabberd_test;"
|
||||
|
||||
- name: Prepare libraries
|
||||
run: |
|
||||
sudo apt-get -qq update
|
||||
sudo apt-get -y purge libgd3 nginx
|
||||
sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
||||
libsqlite3-dev libwebp-dev libyaml-dev
|
||||
|
||||
- name: Prepare rebar
|
||||
run: |
|
||||
echo '{xref_ignores, [{eldap_filter_yecc, return_error, 2}
|
||||
]}.' >>rebar.config
|
||||
echo '{xref_checks, [deprecated_function_calls, deprecated_functions,
|
||||
locals_not_used, undefined_function_calls, undefined_functions]}.
|
||||
% Disabled: exports_not_used,' >>rebar.config
|
||||
echo '{dialyzer, [{get_warnings, true}, {plt_extra_apps, [cache_tab,
|
||||
eimp, epam, esip, ezlib, fast_tls, fast_xml, fast_yaml,
|
||||
mqtree, p1_acme, p1_mysql, p1_oauth2, p1_pgsql, p1_utils, pkix,
|
||||
sqlite3, stringprep, stun, xmpp, yconf]} ]}.' >>rebar.config
|
||||
echo '{ct_extra_params, "-verbosity 20"}.' >>rebar.config
|
||||
echo "{ct_opts, [{verbosity, 20}, {keep_logs, 20}]}." >>rebar.config
|
||||
|
||||
- name: Remove syntax_tools from release
|
||||
run: sed -i 's|, syntax_tools||g' src/ejabberd.app.src.script
|
||||
|
||||
- name: Cache rebar
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
~/.cache/rebar3/
|
||||
key: ${{matrix.otp}}-${{hashFiles('rebar.config')}}
|
||||
|
||||
- name: Compile
|
||||
run: |
|
||||
./autogen.sh
|
||||
./configure --with-rebar=./rebar3 \
|
||||
--prefix=/tmp/ejabberd \
|
||||
--enable-all \
|
||||
--disable-elixir \
|
||||
--disable-mssql \
|
||||
--disable-odbc
|
||||
make update
|
||||
make
|
||||
|
||||
- run: make install -s
|
||||
- run: make hooks
|
||||
- run: make options
|
||||
- run: make xref
|
||||
- run: make dialyzer
|
||||
|
||||
- name: Check Production Release
|
||||
run: |
|
||||
make rel
|
||||
RE=_build/prod/rel/ejabberd
|
||||
$RE/bin/ejabberdctl start
|
||||
$RE/bin/ejabberdctl started
|
||||
$RE/bin/ejabberdctl stop
|
||||
$RE/bin/ejabberdctl stopped
|
||||
cat $RE/logs/ejabberd.log
|
||||
grep -q "is stopped in" $RE/logs/ejabberd.log
|
||||
|
||||
- name: Check Development Release
|
||||
run: |
|
||||
make dev
|
||||
RE=_build/dev/rel/ejabberd
|
||||
$RE/bin/ejabberdctl start
|
||||
$RE/bin/ejabberdctl started
|
||||
$RE/bin/ejabberdctl stop
|
||||
$RE/bin/ejabberdctl stopped
|
||||
cat $RE/logs/ejabberd.log
|
||||
grep -q "is stopped in" $RE/logs/ejabberd.log
|
||||
|
||||
- name: Run tests
|
||||
id: ct
|
||||
run: |
|
||||
(cd priv && ln -sf ../sql)
|
||||
COMMIT=`echo $GITHUB_SHA | cut -c 1-7`
|
||||
DATE=`date +%s`
|
||||
REF_NAME=`echo $GITHUB_REF_NAME | tr "/" "_"`
|
||||
NODENAME=$DATE@$GITHUB_RUN_NUMBER-$GITHUB_ACTOR-$REF_NAME-$COMMIT
|
||||
LABEL=`git show -s --format=%s | cut -c 1-30`
|
||||
./rebar3 ct --name $NODENAME --label "$LABEL"
|
||||
./rebar3 cover
|
||||
|
||||
- name: Check results
|
||||
if: always() && (steps.ct.outcome != 'skipped' || steps.ct2.outcome != 'skipped')
|
||||
id: ctresults
|
||||
run: |
|
||||
[[ -d _build ]] && ln -s _build/test/logs/last/ logs || true
|
||||
ln `find logs/ -name suite.log` logs/suite.log
|
||||
grep 'TEST COMPLETE' logs/suite.log
|
||||
grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log
|
||||
test $(find logs/ -empty -name error.log)
|
||||
|
||||
- name: View logs failures
|
||||
if: failure() && steps.ctresults.outcome == 'failure'
|
||||
run: |
|
||||
cat logs/suite.log | awk \
|
||||
'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
|
||||
find logs/ -name error.log -exec cat '{}' ';'
|
||||
find logs/ -name exunit.log -exec cat '{}' ';'
|
||||
|
||||
- name: Upload test logs
|
||||
if: always() && steps.ct.outcome == 'failure' && github.repository == 'processone/ejabberd'
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
with:
|
||||
publish_dir: _build/test
|
||||
exclude_assets: '.github,lib,plugins'
|
||||
external_repository: processone/ecil
|
||||
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
|
||||
keep_files: true
|
||||
|
||||
- name: View ECIL address
|
||||
if: always() && steps.ct.outcome == 'failure' && github.repository == 'processone/ejabberd'
|
||||
run: |
|
||||
CTRUN=`ls -la _build/test/logs/last | sed 's|.*-> ||'`
|
||||
echo "::notice::View CT results: https://processone.github.io/ecil/logs/$CTRUN/"
|
||||
|
||||
- name: Prepare new schema
|
||||
run: |
|
||||
[[ -d logs ]] && rm -rf logs
|
||||
[[ -d _build/test/logs ]] && rm -rf _build/test/logs || true
|
||||
mysql -u root -proot -e "DROP DATABASE ejabberd_test;"
|
||||
sudo -u postgres psql -c "DROP DATABASE ejabberd_test;"
|
||||
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
|
||||
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
|
||||
TO 'ejabberd_test'@'localhost';"
|
||||
mysql -u root -proot ejabberd_test < sql/mysql.new.sql
|
||||
sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -f sql/pg.new.sql
|
||||
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
|
||||
ON DATABASE ejabberd_test TO ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
|
||||
TABLES IN SCHEMA public
|
||||
TO ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
|
||||
SEQUENCES IN SCHEMA public
|
||||
TO ejabberd_test;"
|
||||
sed -i 's|new_schema, false|new_schema, true|g' test/suite.erl
|
||||
- run: CT_BACKENDS=mysql,pgsql make test
|
||||
id: ctnewschema
|
||||
- name: Check results
|
||||
if: always() && steps.ctnewschema.outcome != 'skipped'
|
||||
run: |
|
||||
[[ -d _build ]] && ln -s _build/test/logs/last/ logs || true
|
||||
ln `find logs/ -name suite.log` logs/suite.log
|
||||
grep 'TEST COMPLETE' logs/suite.log
|
||||
grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log
|
||||
test $(find logs/ -empty -name error.log)
|
||||
- name: View logs failures
|
||||
if: failure() && steps.ctnewschema.outcome != 'skipped'
|
||||
run: |
|
||||
cat logs/suite.log | awk \
|
||||
'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
|
||||
find logs/ -name error.log -exec cat '{}' ';'
|
||||
find logs/ -name exunit.log -exec cat '{}' ';'
|
109
.github/workflows/ci.yml
vendored
109
.github/workflows/ci.yml
vendored
|
@ -25,7 +25,7 @@ jobs:
|
|||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
otp: ['20.0', '21.3', '24.3', '25']
|
||||
otp: ['20.0', '25', '26', '27']
|
||||
runs-on: ubuntu-20.04
|
||||
services:
|
||||
redis:
|
||||
|
@ -35,10 +35,10 @@ jobs:
|
|||
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Test shell scripts
|
||||
if: matrix.otp == 25
|
||||
if: matrix.otp == '26'
|
||||
run: |
|
||||
shellcheck test/ejabberd_SUITE_data/gencerts.sh
|
||||
shellcheck tools/captcha.sh
|
||||
|
@ -46,33 +46,41 @@ jobs:
|
|||
shellcheck -x ejabberdctl.template
|
||||
|
||||
- name: Get specific Erlang/OTP
|
||||
if: matrix.otp != 25
|
||||
uses: erlef/setup-beam@v1
|
||||
with:
|
||||
otp-version: ${{ matrix.otp }}
|
||||
|
||||
- name: Get a compatible Rebar3
|
||||
if: matrix.otp <= '21.3'
|
||||
if: matrix.otp < 24
|
||||
run: |
|
||||
rm rebar3
|
||||
wget https://github.com/processone/ejabberd/raw/21.12/rebar3
|
||||
chmod +x rebar3
|
||||
|
||||
- name: Install MS SQL Server
|
||||
run: |
|
||||
docker run -d -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=ejabberd_Test1" \
|
||||
-v $(pwd)/test/docker/db/mssql/initdb/initdb_mssql.sql:/initdb_mssql.sql:ro \
|
||||
-v $(pwd)/sql/mssql.sql:/mssql.sql:ro \
|
||||
-v $(pwd)/sql/mssql.new.sql:/mssql.new.sql:ro \
|
||||
-p 1433:1433 --name ejabberd-mssql "mcr.microsoft.com/mssql/server:2019-latest"
|
||||
sleep 10
|
||||
|
||||
- name: Prepare databases
|
||||
run: |
|
||||
docker exec ejabberd-mssql /opt/mssql-tools/bin/sqlcmd -U SA -P ejabberd_Test1 -S localhost -i /initdb_mssql.sql
|
||||
docker exec ejabberd-mssql /opt/mssql-tools/bin/sqlcmd -U SA -P ejabberd_Test1 -S localhost -d ejabberd_test -i /mssql.sql
|
||||
sudo systemctl start mysql.service
|
||||
sudo systemctl start postgresql.service
|
||||
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
|
||||
mysql -u root -proot -e "CREATE USER 'ejabberd_test'@'localhost'
|
||||
IDENTIFIED BY 'ejabberd_test';"
|
||||
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
|
||||
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
|
||||
TO 'ejabberd_test'@'localhost';"
|
||||
mysql -u root -proot ejabberd_test < sql/mysql.sql
|
||||
pg_isready
|
||||
sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;"
|
||||
sudo -u postgres psql -c "CREATE USER ejabberd_test
|
||||
WITH PASSWORD 'ejabberd_test';"
|
||||
sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -f sql/pg.sql
|
||||
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
|
||||
ON DATABASE ejabberd_test TO ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
|
||||
|
@ -89,32 +97,18 @@ jobs:
|
|||
sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
||||
libsqlite3-dev libwebp-dev libyaml-dev
|
||||
|
||||
- name: Prepare rebar
|
||||
run: |
|
||||
echo '{xref_ignores, [{eldap_filter_yecc, return_error, 2}
|
||||
]}.' >>rebar.config
|
||||
echo '{xref_checks, [deprecated_function_calls, deprecated_functions,
|
||||
locals_not_used, undefined_function_calls, undefined_functions]}.
|
||||
% Disabled: exports_not_used,' >>rebar.config
|
||||
echo '{dialyzer, [{get_warnings, true}, {plt_extra_apps, [cache_tab,
|
||||
eimp, epam, esip, ezlib, fast_tls, fast_xml, fast_yaml,
|
||||
mqtree, p1_acme, p1_mysql, p1_oauth2, p1_pgsql, p1_utils, pkix,
|
||||
sqlite3, stringprep, stun, xmpp, yconf]} ]}.' >>rebar.config
|
||||
echo '{ct_extra_params, "-verbosity 20"}.' >>rebar.config
|
||||
echo "{ct_opts, [{verbosity, 20}, {keep_logs, 20}]}." >>rebar.config
|
||||
|
||||
- name: Remove syntax_tools from release
|
||||
run: sed -i 's|, syntax_tools||g' src/ejabberd.app.src.script
|
||||
|
||||
- name: Cache rebar
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
~/.cache/rebar3/
|
||||
key: ${{matrix.otp}}-${{hashFiles('rebar.config')}}
|
||||
|
||||
- name: Download test logs
|
||||
if: matrix.otp == 25 && github.repository == 'processone/ejabberd'
|
||||
if: matrix.otp == '26' && github.repository == 'processone/ejabberd'
|
||||
continue-on-error: true
|
||||
run: |
|
||||
mkdir -p _build/test
|
||||
|
@ -131,7 +125,6 @@ jobs:
|
|||
--disable-elixir \
|
||||
--disable-mssql \
|
||||
--disable-odbc
|
||||
make update
|
||||
make
|
||||
|
||||
- run: make install -s
|
||||
|
@ -166,6 +159,7 @@ jobs:
|
|||
id: ct
|
||||
run: |
|
||||
(cd priv && ln -sf ../sql)
|
||||
sed -i -e 's/ct:pal/ct:log/' test/suite.erl
|
||||
COMMIT=`echo $GITHUB_SHA | cut -c 1-7`
|
||||
DATE=`date +%s`
|
||||
REF_NAME=`echo $GITHUB_REF_NAME | tr "/" "_"`
|
||||
|
@ -193,7 +187,7 @@ jobs:
|
|||
find logs/ -name exunit.log -exec cat '{}' ';'
|
||||
|
||||
- name: Send to coveralls
|
||||
if: matrix.otp == 25
|
||||
if: matrix.otp == '26'
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
|
@ -207,7 +201,7 @@ jobs:
|
|||
|
||||
- name: Upload test logs
|
||||
if: always() && steps.ct.outcome == 'failure' && github.repository == 'processone/ejabberd'
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
uses: peaceiris/actions-gh-pages@v4
|
||||
with:
|
||||
publish_dir: _build/test
|
||||
exclude_assets: '.github,lib,plugins'
|
||||
|
@ -221,18 +215,56 @@ jobs:
|
|||
CTRUN=`ls -la _build/test/logs/last | sed 's|.*-> ||'`
|
||||
echo "::notice::View CT results: https://processone.github.io/ecil/logs/$CTRUN/"
|
||||
|
||||
- name: Check for changes to trigger schema upgrade test
|
||||
uses: dorny/paths-filter@v3
|
||||
id: filter
|
||||
with:
|
||||
filters: |
|
||||
sql:
|
||||
- 'sql/**'
|
||||
- 'src/mod_admin_update_sql.erl'
|
||||
|
||||
- name: Prepare for schema upgrade test
|
||||
id: prepupgradetest
|
||||
if: ${{ steps.filter.outputs.sql == 'true' }}
|
||||
run: |
|
||||
[[ -d logs ]] && rm -rf logs
|
||||
[[ -d _build/test/logs ]] && rm -rf _build/test/logs || true
|
||||
sed -i 's|update_sql, false|update_sql, true|g' test/suite.erl
|
||||
- name: Run DB tests on upgraded schema (mssql, mysql, pgsql)
|
||||
run: CT_BACKENDS=mssql,mysql,pgsql make test
|
||||
if: always() && steps.prepupgradetest.outcome != 'skipped'
|
||||
id: ctupgradedschema
|
||||
- name: Check results
|
||||
if: always() && steps.ctupgradedschema.outcome != 'skipped'
|
||||
run: |
|
||||
[[ -d _build ]] && ln -s _build/test/logs/last/ logs || true
|
||||
ln `find logs/ -name suite.log` logs/suite.log
|
||||
grep 'TEST COMPLETE' logs/suite.log
|
||||
grep -q 'TEST COMPLETE,.* 0 failed' logs/suite.log
|
||||
test $(find logs/ -empty -name error.log)
|
||||
- name: View logs failures
|
||||
if: failure() && steps.ctupgradedschema.outcome != 'skipped'
|
||||
run: |
|
||||
cat logs/suite.log | awk \
|
||||
'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
|
||||
find logs/ -name error.log -exec cat '{}' ';'
|
||||
find logs/ -name exunit.log -exec cat '{}' ';'
|
||||
|
||||
- name: Prepare new schema
|
||||
run: |
|
||||
[[ -d logs ]] && rm -rf logs
|
||||
[[ -d _build/test/logs ]] && rm -rf _build/test/logs || true
|
||||
docker exec ejabberd-mssql /opt/mssql-tools/bin/sqlcmd -U SA -P ejabberd_Test1 -S localhost -Q "drop database [ejabberd_test];"
|
||||
docker exec ejabberd-mssql /opt/mssql-tools/bin/sqlcmd -U SA -P ejabberd_Test1 -S localhost -Q "drop login [ejabberd_test];"
|
||||
mysql -u root -proot -e "DROP DATABASE ejabberd_test;"
|
||||
sudo -u postgres psql -c "DROP DATABASE ejabberd_test;"
|
||||
docker exec ejabberd-mssql /opt/mssql-tools/bin/sqlcmd -U SA -P ejabberd_Test1 -S localhost -i /initdb_mssql.sql
|
||||
docker exec ejabberd-mssql /opt/mssql-tools/bin/sqlcmd -U SA -P ejabberd_Test1 -S localhost -d ejabberd_test -i /mssql.new.sql
|
||||
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
|
||||
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
|
||||
TO 'ejabberd_test'@'localhost';"
|
||||
mysql -u root -proot ejabberd_test < sql/mysql.new.sql
|
||||
sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -f sql/pg.new.sql
|
||||
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
|
||||
ON DATABASE ejabberd_test TO ejabberd_test;"
|
||||
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
|
||||
|
@ -242,7 +274,8 @@ jobs:
|
|||
SEQUENCES IN SCHEMA public
|
||||
TO ejabberd_test;"
|
||||
sed -i 's|new_schema, false|new_schema, true|g' test/suite.erl
|
||||
- run: CT_BACKENDS=mysql,pgsql make test
|
||||
- name: Run DB tests on new schema (mssql, mysql, pgsql)
|
||||
run: CT_BACKENDS=mssql,mysql,pgsql make test
|
||||
id: ctnewschema
|
||||
- name: Check results
|
||||
if: always() && steps.ctnewschema.outcome != 'skipped'
|
||||
|
@ -259,3 +292,17 @@ jobs:
|
|||
'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
|
||||
find logs/ -name error.log -exec cat '{}' ';'
|
||||
find logs/ -name exunit.log -exec cat '{}' ';'
|
||||
|
||||
- name: Upload CT logs
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ejabberd-ct-logs-${{matrix.otp}}
|
||||
#
|
||||
# Appending the wildcard character ("*") is a trick to make
|
||||
# "ejabberd-packages" the root directory of the uploaded ZIP file:
|
||||
#
|
||||
# https://github.com/actions/upload-artifact#upload-using-multiple-paths-and-exclusions
|
||||
#
|
||||
path: _build/test/logs
|
||||
retention-days: 14
|
||||
|
|
68
.github/workflows/container.yml
vendored
68
.github/workflows/container.yml
vendored
|
@ -1,6 +1,8 @@
|
|||
name: Container
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '22 2 */6 * *' # every 6 days to avoid gha cache being evicted
|
||||
push:
|
||||
paths-ignore:
|
||||
- '.devcontainer/**'
|
||||
|
@ -17,24 +19,69 @@ env:
|
|||
jobs:
|
||||
container:
|
||||
name: Container
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-22.04
|
||||
permissions:
|
||||
packages: write
|
||||
steps:
|
||||
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Cache build directory
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/build/
|
||||
key: ${{runner.os}}-ctr-ct-ng-1.26.0
|
||||
|
||||
- name: Get erlang/OTP version for bootstrapping
|
||||
run: |
|
||||
echo "OTP_VSN=$(awk '/^otp_vsn=/ {{gsub(/[^0-9.rc-]/, ""); print}}' tools/make-binaries)" >> $GITHUB_ENV
|
||||
echo "ELIXIR_VSN=$(awk '/^elixir_vsn=/ {{gsub(/[^0-9.]/, ""); print}}' tools/make-binaries)" >> $GITHUB_ENV
|
||||
|
||||
- name: Install prerequisites
|
||||
run: |
|
||||
sudo apt-get -qq update
|
||||
sudo apt-get -qq install makeself
|
||||
# https://github.com/crosstool-ng/crosstool-ng/blob/master/testing/docker/ubuntu21.10/Dockerfile
|
||||
sudo apt-get -qq install build-essential autoconf bison flex gawk
|
||||
sudo apt-get -qq install help2man libncurses5-dev libtool libtool-bin
|
||||
sudo apt-get -qq install python3-dev texinfo unzip
|
||||
|
||||
- name: Install erlang/OTP
|
||||
uses: erlef/setup-beam@v1
|
||||
with:
|
||||
otp-version: ${{ env.OTP_VSN }}
|
||||
elixir-version: ${{ env.ELIXIR_VSN }}
|
||||
version-type: strict
|
||||
|
||||
- name: Remove Elixir Matchers
|
||||
run: |
|
||||
echo "::remove-matcher owner=elixir-mixCompileWarning::"
|
||||
echo "::remove-matcher owner=elixir-credoOutputDefault::"
|
||||
echo "::remove-matcher owner=elixir-mixCompileError::"
|
||||
echo "::remove-matcher owner=elixir-mixTestFailure::"
|
||||
echo "::remove-matcher owner=elixir-dialyzerOutputDefault::"
|
||||
|
||||
- name: Build musl-libc based binary archives
|
||||
run: |
|
||||
sed -i "s|targets='.*'|targets='x86_64-linux-musl aarch64-linux-musl'|" tools/make-binaries
|
||||
mv .github/container/ejabberdctl.template .
|
||||
CHECK_DEPS=false tools/make-binaries
|
||||
|
||||
- name: Collect packages
|
||||
run: |
|
||||
mkdir tarballs
|
||||
mv ejabberd-*.tar.gz tarballs
|
||||
|
||||
- name: Checkout ejabberd-contrib
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: processone/ejabberd-contrib
|
||||
path: .ejabberd-modules/sources/ejabberd-contrib
|
||||
|
||||
- name: Log in to the Container registry
|
||||
uses: docker/login-action@v1.14.1
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
|
@ -42,11 +89,11 @@ jobs:
|
|||
|
||||
- name: Get git describe
|
||||
id: gitdescribe
|
||||
run: echo "::set-output name=ver::$(git describe --tags)"
|
||||
run: echo "ver=$(git describe --tags)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Extract metadata (tags, labels) for Docker
|
||||
id: meta
|
||||
uses: docker/metadata-action@v3.8.0
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
labels: |
|
||||
|
@ -55,15 +102,16 @@ jobs:
|
|||
org.opencontainers.image.vendor=ProcessOne
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v1
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v1
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Build and push Docker image
|
||||
uses: docker/build-push-action@v2.10.0
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
build-args: |
|
||||
METHOD=package
|
||||
VERSION=${{ steps.gitdescribe.outputs.ver }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
|
|
18
.github/workflows/installers.yml
vendored
18
.github/workflows/installers.yml
vendored
|
@ -21,13 +21,13 @@ on:
|
|||
jobs:
|
||||
binaries:
|
||||
name: Binaries
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: Cache build directory
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/build/
|
||||
key: ${{runner.os}}-ct-ng-1.25.0
|
||||
key: ${{runner.os}}-ct-ng-1.26.0
|
||||
- name: Install prerequisites
|
||||
run: |
|
||||
sudo apt-get -qq update
|
||||
|
@ -39,9 +39,9 @@ jobs:
|
|||
- name: Install FPM
|
||||
run: |
|
||||
gem install --no-document --user-install fpm
|
||||
echo $HOME/.gem/ruby/*/bin >> $GITHUB_PATH
|
||||
echo $HOME/.local/share/gem/ruby/*/bin >> $GITHUB_PATH
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Build binary archives
|
||||
|
@ -55,7 +55,7 @@ jobs:
|
|||
mkdir ejabberd-packages
|
||||
mv ejabberd_*.deb ejabberd-*.rpm ejabberd-*.run ejabberd-packages
|
||||
- name: Upload packages
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ejabberd-packages
|
||||
#
|
||||
|
@ -70,15 +70,15 @@ jobs:
|
|||
release:
|
||||
name: Release
|
||||
needs: [binaries]
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-22.04
|
||||
if: github.ref_type == 'tag'
|
||||
steps:
|
||||
- name: Download packages
|
||||
uses: actions/download-artifact@v3
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: ejabberd-packages
|
||||
- name: Draft Release
|
||||
uses: softprops/action-gh-release@v1
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
draft: true
|
||||
files: ejabberd-packages/*
|
||||
|
|
343
.github/workflows/runtime.yml
vendored
343
.github/workflows/runtime.yml
vendored
|
@ -31,101 +31,148 @@ jobs:
|
|||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
otp: ['19.3', '20.3', '24.3', '25']
|
||||
otp: ['20', '25', '26', '27']
|
||||
rebar: ['rebar', 'rebar3']
|
||||
runs-on: ubuntu-latest
|
||||
exclude:
|
||||
- otp: '27'
|
||||
rebar: 'rebar'
|
||||
runs-on: ubuntu-22.04
|
||||
container:
|
||||
image: erlang:${{ matrix.otp }}
|
||||
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Get compatible Rebar binaries
|
||||
if: matrix.otp < 24
|
||||
run: |
|
||||
rm rebar
|
||||
rm rebar3
|
||||
wget https://github.com/processone/ejabberd/raw/21.12/rebar
|
||||
wget https://github.com/processone/ejabberd/raw/21.12/rebar3
|
||||
chmod +x rebar
|
||||
chmod +x rebar3
|
||||
|
||||
- name: Prepare libraries
|
||||
run: |
|
||||
apt-get -qq update
|
||||
apt-get purge -y libgd3
|
||||
apt-get purge -y libgd3 nginx
|
||||
apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
||||
libsqlite3-dev libwebp-dev libyaml-dev
|
||||
|
||||
- name: Compile
|
||||
run: |
|
||||
./autogen.sh
|
||||
./configure --with-rebar=`which ${{ matrix.rebar }}` \
|
||||
./configure --with-rebar=./${{ matrix.rebar }} \
|
||||
--prefix=/tmp/ejabberd \
|
||||
--enable-all \
|
||||
--disable-elixir \
|
||||
--disable-tools \
|
||||
--disable-odbc
|
||||
make update
|
||||
make
|
||||
|
||||
- name: Prepare rebar
|
||||
run: |
|
||||
echo '{xref_ignores, [{eldap_filter_yecc, return_error, 2}
|
||||
]}.' >>rebar.config
|
||||
echo '{xref_checks, [deprecated_function_calls, deprecated_functions,
|
||||
locals_not_used, undefined_function_calls, undefined_functions]}.
|
||||
% Disabled: exports_not_used,' >>rebar.config
|
||||
|
||||
- run: make xref
|
||||
|
||||
- name: Test rel (rebar2)
|
||||
- name: Prepare rel (rebar2)
|
||||
if: matrix.rebar == 'rebar'
|
||||
run: |
|
||||
make rel
|
||||
rel/ejabberd/bin/ejabberdctl start \
|
||||
&& rel/ejabberd/bin/ejabberdctl started
|
||||
rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
|
||||
rel/ejabberd/bin/ejabberdctl registered_users localhost
|
||||
cat rel/ejabberd/logs/*
|
||||
mkdir -p _build/prod && ln -s `pwd`/rel/ _build/prod/rel
|
||||
mkdir -p _build/dev && ln -s `pwd`/rel/ _build/dev/rel
|
||||
|
||||
- name: Test rel
|
||||
if: matrix.rebar != 'rebar'
|
||||
- name: Run rel
|
||||
run: |
|
||||
make rel
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl start \
|
||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl started
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl registered_users localhost
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl registered_users localhost > registered.log
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl stop \
|
||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl stopped
|
||||
cat _build/prod/rel/ejabberd/logs/*
|
||||
|
||||
- name: Test dev
|
||||
if: matrix.rebar != 'rebar'
|
||||
- name: Run dev
|
||||
run: |
|
||||
make dev
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl start \
|
||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl started
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl register user2 localhost s0mePass
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost >> registered.log
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl stop \
|
||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl stopped
|
||||
cat _build/dev/rel/ejabberd/logs/*
|
||||
|
||||
mix:
|
||||
name: Mix
|
||||
- name: Run install
|
||||
run: |
|
||||
make install
|
||||
/tmp/ejabberd/sbin/ejabberdctl start \
|
||||
&& /tmp/ejabberd/sbin/ejabberdctl started
|
||||
/tmp/ejabberd/sbin/ejabberdctl register user3 localhost s0mePass
|
||||
/tmp/ejabberd/sbin/ejabberdctl registered_users localhost >> registered.log
|
||||
/tmp/ejabberd/sbin/ejabberdctl stop \
|
||||
&& /tmp/ejabberd/sbin/ejabberdctl stopped
|
||||
|
||||
- name: View logs
|
||||
run: |
|
||||
echo "===> Registered:"
|
||||
cat registered.log
|
||||
echo "===> Prod:"
|
||||
cat _build/prod/rel/ejabberd/logs/*
|
||||
echo "===> Dev:"
|
||||
cat _build/dev/rel/ejabberd/logs/*
|
||||
echo "===> Install:"
|
||||
cat /tmp/ejabberd/var/log/ejabberd/*
|
||||
|
||||
- name: Check logs
|
||||
run: |
|
||||
grep -q '^user1$' registered.log
|
||||
grep -q '^user2$' registered.log
|
||||
grep -q '^user3$' registered.log
|
||||
grep -q 'is started' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'is stopped' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
test $(find _build/prod/rel/ -empty -name error.log)
|
||||
grep -q 'is started' _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'is stopped' _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
test $(find _build/dev/rel/ -empty -name error.log)
|
||||
grep -q 'is started' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
grep -q 'is stopped' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
test $(find /tmp/ejabberd/var/log/ejabberd/ -empty -name error.log)
|
||||
|
||||
- name: View logs failures
|
||||
if: always()
|
||||
run: |
|
||||
cat _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
cat _build/prod/rel/ejabberd/logs/error.log
|
||||
cat _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
cat _build/dev/rel/ejabberd/logs/error.log
|
||||
cat /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
cat /tmp/ejabberd/var/log/ejabberd/error.log
|
||||
|
||||
rebar3-elixir:
|
||||
name: Rebar3+Elixir
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
otp: ['21.3', '22.0', '25.0']
|
||||
elixir: ['1.10.3', '1.11.4', '1.12.3', '1.13.0']
|
||||
otp: ['23.0', '25', '26', '27']
|
||||
elixir: ['1.13', '1.15', '1.16', '1.17']
|
||||
exclude:
|
||||
- otp: '21.3'
|
||||
elixir: '1.12.3'
|
||||
- otp: '21.3'
|
||||
elixir: '1.13.0'
|
||||
- otp: '25.0'
|
||||
elixir: '1.10.3'
|
||||
- otp: '25.0'
|
||||
elixir: '1.11.4'
|
||||
- otp: '25.0'
|
||||
elixir: '1.12.3'
|
||||
runs-on: ubuntu-latest
|
||||
- otp: '23.0'
|
||||
elixir: '1.15'
|
||||
- otp: '23.0'
|
||||
elixir: '1.16'
|
||||
- otp: '23.0'
|
||||
elixir: '1.17'
|
||||
- otp: '26'
|
||||
elixir: '1.13'
|
||||
- otp: '27'
|
||||
elixir: '1.13'
|
||||
- otp: '27'
|
||||
elixir: '1.15'
|
||||
- otp: '27'
|
||||
elixir: '1.16'
|
||||
runs-on: ubuntu-20.04
|
||||
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Get specific Erlang/OTP
|
||||
uses: erlef/setup-beam@v1
|
||||
|
@ -133,6 +180,16 @@ jobs:
|
|||
otp-version: ${{matrix.otp}}
|
||||
elixir-version: ${{matrix.elixir}}
|
||||
|
||||
- name: Get compatible Rebar binaries
|
||||
if: matrix.otp < 24
|
||||
run: |
|
||||
rm rebar
|
||||
rm rebar3
|
||||
wget https://github.com/processone/ejabberd/raw/21.12/rebar
|
||||
wget https://github.com/processone/ejabberd/raw/21.12/rebar3
|
||||
chmod +x rebar
|
||||
chmod +x rebar3
|
||||
|
||||
- name: Prepare libraries
|
||||
run: |
|
||||
sudo apt-get -qq update
|
||||
|
@ -140,23 +197,20 @@ jobs:
|
|||
sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
||||
libsqlite3-dev libwebp-dev libyaml-dev
|
||||
|
||||
- name: Remove Elixir Matchers
|
||||
- name: Enable ModPresenceDemo and an Elixir dependency
|
||||
run: |
|
||||
echo "::remove-matcher owner=elixir-mixCompileWarning::"
|
||||
echo "::remove-matcher owner=elixir-credoOutputDefault::"
|
||||
echo "::remove-matcher owner=elixir-mixCompileError::"
|
||||
echo "::remove-matcher owner=elixir-mixTestFailure::"
|
||||
echo "::remove-matcher owner=elixir-dialyzerOutputDefault::"
|
||||
sed -i "s|^modules:|modules:\n 'ModPresenceDemo': {}|g" ejabberd.yml.example
|
||||
cat ejabberd.yml.example
|
||||
sed -i 's|^{deps, \[\(.*\)|{deps, [{decimal, ".*", {git, "https://github.com/ericmj/decimal", {branch, "main"}}},\n \1|g' rebar.config
|
||||
cat rebar.config
|
||||
|
||||
- name: Compile
|
||||
run: |
|
||||
./autogen.sh
|
||||
./configure --with-rebar=mix \
|
||||
./configure --with-rebar=./rebar3 \
|
||||
--prefix=/tmp/ejabberd \
|
||||
--enable-all \
|
||||
--disable-elixir \
|
||||
--disable-odbc
|
||||
mix deps.get
|
||||
make
|
||||
|
||||
- run: make xref
|
||||
|
@ -181,17 +235,46 @@ jobs:
|
|||
_build/dev/rel/ejabberd/bin/ejabberdctl stop \
|
||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl stopped
|
||||
|
||||
- name: Check rel
|
||||
- name: Run install
|
||||
run: |
|
||||
make install
|
||||
/tmp/ejabberd/sbin/ejabberdctl start \
|
||||
&& /tmp/ejabberd/sbin/ejabberdctl started
|
||||
/tmp/ejabberd/sbin/ejabberdctl register user3 localhost s0mePass
|
||||
/tmp/ejabberd/sbin/ejabberdctl registered_users localhost >> registered.log
|
||||
/tmp/ejabberd/sbin/ejabberdctl stop \
|
||||
&& /tmp/ejabberd/sbin/ejabberdctl stopped
|
||||
|
||||
- name: View logs
|
||||
if: always()
|
||||
run: |
|
||||
echo "===> Registered:"
|
||||
cat registered.log
|
||||
echo "===> Prod:"
|
||||
cat _build/prod/rel/ejabberd/logs/*
|
||||
echo "===> Dev:"
|
||||
cat _build/dev/rel/ejabberd/logs/*
|
||||
echo "===> Install:"
|
||||
cat /tmp/ejabberd/var/log/ejabberd/*
|
||||
|
||||
- name: Check logs
|
||||
if: always()
|
||||
run: |
|
||||
grep -q '^user1$' registered.log
|
||||
grep -q '^user2$' registered.log
|
||||
grep -q '^user3$' registered.log
|
||||
grep -q 'is started' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'is stopped' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'module Presence Demo' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
test $(find _build/prod/ -empty -name error.log)
|
||||
grep -q 'is started' _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'is stopped' _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'module Presence Demo' _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
test $(find _build/dev/ -empty -name error.log)
|
||||
grep -q 'is started' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
grep -q 'is stopped' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
grep -q 'module Presence Demo' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
test $(find /tmp/ejabberd/var/log/ejabberd/ -empty -name error.log)
|
||||
|
||||
- name: View logs failures
|
||||
if: failure()
|
||||
|
@ -200,3 +283,151 @@ jobs:
|
|||
cat _build/prod/rel/ejabberd/logs/error.log
|
||||
cat _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
cat _build/dev/rel/ejabberd/logs/error.log
|
||||
cat /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
cat /tmp/ejabberd/var/log/ejabberd/error.log
|
||||
|
||||
mix:
|
||||
name: Mix
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
otp: ['23.0', '25', '26', '27']
|
||||
elixir: ['1.13', '1.15', '1.16', '1.17']
|
||||
exclude:
|
||||
- otp: '23.0'
|
||||
elixir: '1.15'
|
||||
- otp: '23.0'
|
||||
elixir: '1.16'
|
||||
- otp: '23.0'
|
||||
elixir: '1.17'
|
||||
- otp: '26'
|
||||
elixir: '1.13'
|
||||
- otp: '27'
|
||||
elixir: '1.13'
|
||||
- otp: '27'
|
||||
elixir: '1.15'
|
||||
- otp: '27'
|
||||
elixir: '1.16'
|
||||
runs-on: ubuntu-20.04
|
||||
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Get specific Erlang/OTP
|
||||
uses: erlef/setup-beam@v1
|
||||
with:
|
||||
otp-version: ${{matrix.otp}}
|
||||
elixir-version: ${{matrix.elixir}}
|
||||
|
||||
- name: Prepare libraries
|
||||
run: |
|
||||
sudo apt-get -qq update
|
||||
sudo apt-get -y purge libgd3 nginx
|
||||
sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
||||
libsqlite3-dev libwebp-dev libyaml-dev
|
||||
|
||||
- name: Remove Elixir Matchers
|
||||
run: |
|
||||
echo "::remove-matcher owner=elixir-mixCompileWarning::"
|
||||
echo "::remove-matcher owner=elixir-credoOutputDefault::"
|
||||
echo "::remove-matcher owner=elixir-mixCompileError::"
|
||||
echo "::remove-matcher owner=elixir-mixTestFailure::"
|
||||
echo "::remove-matcher owner=elixir-dialyzerOutputDefault::"
|
||||
|
||||
- name: Enable ModPresenceDemo and an Elixir dependency
|
||||
run: |
|
||||
sed -i "s|^modules:|modules:\n 'ModPresenceDemo': {}|g" ejabberd.yml.example
|
||||
cat ejabberd.yml.example
|
||||
sed -i 's|^{deps, \(.*\)|{deps, \1\n {decimal, ".*", {git, "https://github.com/ericmj/decimal", {branch, "main"}}}, |g' rebar.config
|
||||
cat rebar.config
|
||||
|
||||
- name: Unlock Jose dependency on older Erlang
|
||||
if: matrix.otp < 24
|
||||
run: |
|
||||
mix deps.unlock jose
|
||||
|
||||
- name: Compile
|
||||
run: |
|
||||
./autogen.sh
|
||||
./configure --with-rebar=mix \
|
||||
--prefix=/tmp/ejabberd \
|
||||
--enable-all
|
||||
make
|
||||
|
||||
- run: make xref
|
||||
|
||||
- run: make dialyzer
|
||||
|
||||
- run: make edoc
|
||||
|
||||
- name: Run rel
|
||||
run: |
|
||||
make rel
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl start \
|
||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl started
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl registered_users localhost > registered.log
|
||||
_build/prod/rel/ejabberd/bin/ejabberdctl stop \
|
||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl stopped
|
||||
|
||||
- name: Run dev
|
||||
run: |
|
||||
make dev
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl start \
|
||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl started
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl register user2 localhost s0mePass
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost >> registered.log
|
||||
_build/dev/rel/ejabberd/bin/ejabberdctl stop \
|
||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl stopped
|
||||
|
||||
- name: Run install
|
||||
run: |
|
||||
make install
|
||||
/tmp/ejabberd/sbin/ejabberdctl start \
|
||||
&& /tmp/ejabberd/sbin/ejabberdctl started
|
||||
/tmp/ejabberd/sbin/ejabberdctl register user3 localhost s0mePass
|
||||
/tmp/ejabberd/sbin/ejabberdctl registered_users localhost >> registered.log
|
||||
/tmp/ejabberd/sbin/ejabberdctl stop \
|
||||
&& /tmp/ejabberd/sbin/ejabberdctl stopped
|
||||
|
||||
- name: View logs
|
||||
if: always()
|
||||
run: |
|
||||
echo "===> Registered:"
|
||||
cat registered.log
|
||||
echo "===> Prod:"
|
||||
cat _build/prod/rel/ejabberd/logs/*
|
||||
echo "===> Dev:"
|
||||
cat _build/dev/rel/ejabberd/logs/*
|
||||
echo "===> Install:"
|
||||
cat /tmp/ejabberd/var/log/ejabberd/*
|
||||
|
||||
- name: Check logs
|
||||
if: always()
|
||||
run: |
|
||||
grep -q '^user1$' registered.log
|
||||
grep -q '^user2$' registered.log
|
||||
grep -q '^user3$' registered.log
|
||||
grep -q 'is started' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'is stopped' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'module Presence Demo' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
test $(find _build/prod/ -empty -name error.log)
|
||||
grep -q 'is started' _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'is stopped' _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
grep -q 'module Presence Demo' _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
test $(find _build/dev/ -empty -name error.log)
|
||||
grep -q 'is started' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
grep -q 'is stopped' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
grep -q 'module Presence Demo' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
test $(find /tmp/ejabberd/var/log/ejabberd/ -empty -name error.log)
|
||||
|
||||
- name: View logs failures
|
||||
if: failure()
|
||||
run: |
|
||||
cat _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||
cat _build/prod/rel/ejabberd/logs/error.log
|
||||
cat _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||
cat _build/dev/rel/ejabberd/logs/error.log
|
||||
cat /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||
cat /tmp/ejabberd/var/log/ejabberd/error.log
|
||||
|
|
6
.gitignore
vendored
6
.gitignore
vendored
|
@ -5,8 +5,10 @@
|
|||
\#*#
|
||||
.#*
|
||||
.edts
|
||||
.tool-versions
|
||||
*.dump
|
||||
/Makefile
|
||||
/doc
|
||||
/config.log
|
||||
/config.status
|
||||
/config/releases.exs
|
||||
|
@ -32,12 +34,14 @@
|
|||
/priv/bin/captcha*sh
|
||||
/priv/sql
|
||||
/rel/ejabberd
|
||||
/recompile.log
|
||||
/_build
|
||||
/database/
|
||||
/.rebar
|
||||
/rebar.lock
|
||||
/log/
|
||||
Mnesia.nonode@nohost/
|
||||
/TAGS
|
||||
/tags
|
||||
# Binaries created with tools/make-{binaries,installers,packages}:
|
||||
/ejabberd_*.deb
|
||||
/ejabberd-*.rpm
|
||||
|
|
5
.vscode/extensions.json
vendored
Normal file
5
.vscode/extensions.json
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"recommendations": [
|
||||
"erlang-ls.erlang-ls"
|
||||
]
|
||||
}
|
49
.vscode/launch.json
vendored
Normal file
49
.vscode/launch.json
vendored
Normal file
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Relive",
|
||||
"type": "erlang",
|
||||
"request": "launch",
|
||||
"runinterminal": [
|
||||
".vscode/relive.sh"
|
||||
],
|
||||
"projectnode": "ejabberd@localhost",
|
||||
"cookie": "COOKIE",
|
||||
"timeout": 300,
|
||||
"cwd": "${workspaceRoot}"
|
||||
},
|
||||
{
|
||||
"name": "Relive (alternate)",
|
||||
"type": "erlang",
|
||||
"request": "launch",
|
||||
"runinterminal": [
|
||||
"./rebar3", "shell",
|
||||
"--apps", "ejabberd",
|
||||
"--config", "rel/relive.config",
|
||||
"--script", "rel/relive.escript",
|
||||
"--name", "ejabberd@localhost",
|
||||
"--setcookie", "COOKIE"
|
||||
],
|
||||
"projectnode": "ejabberd@localhost",
|
||||
"cookie": "COOKIE",
|
||||
"timeout": 300,
|
||||
"cwd": "${workspaceRoot}"
|
||||
},
|
||||
{
|
||||
"name": "Attach",
|
||||
"type": "erlang",
|
||||
"request": "attach",
|
||||
"runinterminal": [
|
||||
"./rebar3", "shell",
|
||||
"--sname", "clean@localhost",
|
||||
"--setcookie", "COOKIE",
|
||||
"--start-clean"
|
||||
],
|
||||
"projectnode": "ejabberd@localhost",
|
||||
"cookie": "COOKIE",
|
||||
"timeout": 300,
|
||||
"cwd": "${workspaceRoot}"
|
||||
}
|
||||
]
|
||||
}
|
6
.vscode/relive.sh
vendored
Executable file
6
.vscode/relive.sh
vendored
Executable file
|
@ -0,0 +1,6 @@
|
|||
[ ! -f Makefile ] \
|
||||
&& ./autogen.sh \
|
||||
&& ./configure --with-rebar=./rebar3 \
|
||||
&& make deps
|
||||
|
||||
make relive
|
13
.vscode/settings.json
vendored
Normal file
13
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"editor.tabSize": 8,
|
||||
"remote.portsAttributes": {
|
||||
"1883": {"label": "MQTT", "onAutoForward": "silent"},
|
||||
"4369": {"label": "EPMD", "onAutoForward": "silent"},
|
||||
"5222": {"label": "XMPP C2S", "onAutoForward": "silent"},
|
||||
"5223": {"label": "XMPP C2S (legacy)", "onAutoForward": "silent"},
|
||||
"5269": {"label": "XMPP S2S", "onAutoForward": "silent"},
|
||||
"5280": {"label": "HTTP", "onAutoForward": "silent"},
|
||||
"5443": {"label": "HTTPS", "onAutoForward": "silent"},
|
||||
"7777": {"label": "XMPP SOCKS5 (proxy65)", "onAutoForward": "silent"}
|
||||
}
|
||||
}
|
564
CHANGELOG.md
564
CHANGELOG.md
|
@ -1,6 +1,361 @@
|
|||
# Version 22.10
|
||||
## Version 24.02
|
||||
|
||||
#### Core:
|
||||
|
||||
- Added Matrix gateway in `mod_matrix_gw`
|
||||
- Support SASL2 and Bind2
|
||||
- Support tls-server-end-point channel binding and sasl2 codec
|
||||
- Support tls-exporter channel binding
|
||||
- Support XEP-0474: SASL SCRAM Downgrade Protection
|
||||
- Fix presenting features and returning results of inline bind2 elements
|
||||
- [`disable_sasl_scram_downgrade_protection`](https://docs.ejabberd.im/admin/configuration/toplevel/#disable-sasl-scram-downgrade-protection): New option to disable XEP-0474
|
||||
- [`negotiation_timeout`](https://docs.ejabberd.im/admin/configuration/toplevel/#negotiation-timeout): Increase default value from 30s to 2m
|
||||
- mod_carboncopy: Teach how to interact with bind2 inline requests
|
||||
|
||||
#### Other:
|
||||
|
||||
- ejabberdctl: Fix startup problem when having set `EJABBERD_OPTS` and logger options
|
||||
- ejabberdctl: Set EJABBERD_OPTS back to `""`, and use previous flags as example
|
||||
- eldap: Change logic for `eldap tls_verify=soft` and `false`
|
||||
- eldap: Don't set `fail_if_no_peer_cert` for eldap ssl client connections
|
||||
- Ignore hints when checking for chat states
|
||||
- mod_mam: Support XEP-0424 Message Retraction
|
||||
- mod_mam: Fix XEP-0425: Message Moderation with SQL storage
|
||||
- mod_ping: Support XEP-0198 pings when stream management is enabled
|
||||
- mod_pubsub: Normalize pubsub `max_items` node options on read
|
||||
- mod_pubsub: PEP nodetree: Fix reversed logic in node fixup function
|
||||
- mod_pubsub: Only care about PEP bookmarks options when creating node from scratch
|
||||
|
||||
#### SQL:
|
||||
|
||||
- MySQL: Support `sha256_password` auth plugin
|
||||
- ejabberd_sql_schema: Use the first unique index as a primary key
|
||||
- Update SQL schema files for MAM's XEP-0424
|
||||
- New option [`sql_flags`](https://docs.ejabberd.im/admin/configuration/toplevel/#sql-flags): right now only useful to enable `mysql_alternative_upsert`
|
||||
|
||||
#### Installers and Container:
|
||||
|
||||
- Container: Add ability to ignore failures in execution of `CTL_ON_*` commands
|
||||
- Container: Update to Erlang/OTP 26.2, Elixir 1.16.1 and Alpine 3.19
|
||||
- Container: Update this custom ejabberdctl to match the main one
|
||||
- make-binaries: Bump OpenSSL 3.2.1, Erlang/OTP 26.2.2, Elixir 1.16.1
|
||||
- make-binaries: Bump many dependency versions
|
||||
|
||||
#### Commands API:
|
||||
|
||||
- `print_sql_schema`: New command available in ejabberdctl command-line script
|
||||
- ejabberdctl: Rework temporary node name generation
|
||||
- ejabberdctl: Print argument description, examples and note in help
|
||||
- ejabberdctl: Document exclusive ejabberdctl commands like all the others
|
||||
- Commands: Add a new [`muc_sub`](https://docs.ejabberd.im/developer/ejabberd-api/admin-tags/#muc-sub) tag to all the relevant commands
|
||||
- Commands: Improve syntax of many commands documentation
|
||||
- Commands: Use list arguments in many commands that used separators
|
||||
- Commands: [`set_presence`](https://docs.ejabberd.im/developer/ejabberd-api/admin-api/#set-presence): switch priority argument from string to integer
|
||||
- ejabberd_commands: Add the command API version as [a tag `vX`](https://docs.ejabberd.im/developer/ejabberd-api/admin-tags/#v1)
|
||||
- ejabberd_ctl: Add support for list and tuple arguments
|
||||
- ejabberd_xmlrpc: Fix support for restuple error response
|
||||
- mod_http_api: When no specific API version is requested, use the latest
|
||||
|
||||
#### Compilation with Rebar3/Elixir/Mix:
|
||||
- Fix compilation with Erlang/OTP 27: don't use the reserved word 'maybe'
|
||||
- configure: Fix explanation of `--enable-group` option ([#4135](https://github.com/processone/ejabberd/issues/4135))
|
||||
- Add observer and runtime_tools in releases when `--enable-tools`
|
||||
- Update "make translations" to reduce build requirements
|
||||
- Use Luerl 1.0 for Erlang 20, 1.1.1 for 21-26, and temporary fork for 27
|
||||
- Makefile: Add `install-rel` and `uninstall-rel`
|
||||
- Makefile: Rename `make rel` to `make prod`
|
||||
- Makefile: Update `make edoc` to use ExDoc, requires mix
|
||||
- Makefile: No need to use `escript` to run rebar|rebar3|mix
|
||||
- configure: If `--with-rebar=rebar3` but rebar3 not system-installed, use local one
|
||||
- configure: Use Mix or Rebar3 by default instead of Rebar2 to compile ejabberd
|
||||
- ejabberdctl: Detect problem running iex or etop and show explanation
|
||||
- Rebar3: Include Elixir files when making a release
|
||||
- Rebar3: Workaround to fix protocol consolidation
|
||||
- Rebar3: Add support to compile Elixir dependencies
|
||||
- Rebar3: Compile explicitly our Elixir files when `--enable-elixir`
|
||||
- Rebar3: Provide proper path to `iex`
|
||||
- Rebar/Rebar3: Update binaries to work with Erlang/OTP 24-27
|
||||
- Rebar/Rebar3: Remove Elixir as a rebar dependency
|
||||
- Rebar3/Mix: If `dev` profile/environment, enable tools automatically
|
||||
- Elixir: Fix compiling ejabberd as a dependency ([#4128](https://github.com/processone/ejabberd/issues/4128))
|
||||
- Elixir: Fix ejabberdctl start/live when installed
|
||||
- Elixir: Fix: `FORMATTER ERROR: bad return value` ([#4087](https://github.com/processone/ejabberd/issues/4087))
|
||||
- Elixir: Fix: Couldn't find file `Elixir Hex API`
|
||||
- Mix: Enable stun by default when `vars.config` not found
|
||||
- Mix: New option `vars_config_path` to set path to `vars.config` ([#4128](https://github.com/processone/ejabberd/issues/4128))
|
||||
- Mix: Fix ejabberdctl iexlive problem locating iex in an OTP release
|
||||
|
||||
## Version 23.10
|
||||
|
||||
#### Compilation:
|
||||
|
||||
- Erlang/OTP: Raise the requirement to Erlang/OTP 20.0 as a minimum
|
||||
- CI: Update tests to Erlang/OTP 26 and recent Elixir
|
||||
- Move Xref and Dialyzer options from workflows to `rebar.config`
|
||||
- Add sections to `rebar.config` to organize its content
|
||||
- Dialyzer dirty workarounds because `re:mp()` is not an exported type
|
||||
- When installing module already configured, keep config as example
|
||||
- Elixir 1.15 removed support for `--app`
|
||||
- Elixir: Improve support to stop external modules written in Elixir
|
||||
- Elixir: Update syntax of function calls as recommended by Elixir compiler
|
||||
- Elixir: When building OTP release with mix, keep `ERLANG_NODE=ejabberd@localhost`
|
||||
- `ejabberdctl`: Pass `ERLANG_OPTS` when calling `erl` to parse the `INET_DIST_INTERFACE` ([#4066](https://github.com/processone/ejabberd/issues/#4066)
|
||||
|
||||
#### Commands:
|
||||
|
||||
- `create_room_with_opts`: Fix typo and move examples to `args_example` ([#4080](https://github.com/processone/ejabberd/issues/#4080))
|
||||
- `etop`: Let `ejabberdctl etop` work in a release (if `observer` application is available)
|
||||
- `get_roster`: Command now returns groups in a list instead of newlines ([#4088](https://github.com/processone/ejabberd/issues/#4088))
|
||||
- `halt`: New command to halt ejabberd abruptly with an error status code
|
||||
- `ejabberdctl`: Fix calling ejabberdctl command with wrong number of arguments with Erlang 26
|
||||
- `ejabberdctl`: Improve printing lists in results
|
||||
- `ejabberdctl`: Support `policy=user` in the help and return proper arguments
|
||||
- `ejabberdctl`: Document how to stop a debug shell: control+g
|
||||
|
||||
#### Container:
|
||||
|
||||
- Dockerfile: Add missing dependency for mssql databases
|
||||
- Dockerfile: Reorder stages and steps for consistency
|
||||
- Dockerfile: Use Alpine as base for `METHOD=package`
|
||||
- Dockerfile: Rename packages to improve compatibility
|
||||
- Dockerfile: Provide specific OTP and elixir vsn for direct compilation
|
||||
- Halt ejabberd if a command in `CTL_ON_` fails during ejabberd startup
|
||||
|
||||
#### Core:
|
||||
|
||||
- `auth_external_user_exists_check`: New option ([#3377](https://github.com/processone/ejabberd/issues/#3377))
|
||||
- `gen_mod`: Extend `gen_mod` API to simplify hooks and IQ handlers registration
|
||||
- `gen_mod`: Add shorter forms for `gen_mod` hook/`iq_handler` API
|
||||
- `gen_mod`: Update modules to the new `gen_mod` API
|
||||
- `install_contrib_modules`: New option to define contrib modules to install automatically
|
||||
- `unix_socket`: New listener option, useful when setting unix socket files ([#4059](https://github.com/processone/ejabberd/issues/#4059))
|
||||
- `ejabberd_systemd`: Add a few debug messages
|
||||
- `ejabberd_systemd`: Avoid using `gen_server` timeout ([#4054](https://github.com/processone/ejabberd/issues/#4054))([#4058](https://github.com/processone/ejabberd/issues/#4058))
|
||||
- `ejabberd_listener`: Increase default listen queue backlog value to 128, which is the default value on both Linux and FreeBSD ([#4025](https://github.com/processone/ejabberd/issues/#4025))
|
||||
- OAuth: Handle `badpass` error message
|
||||
- When sending message on behalf of user, trigger `user_send_packet` ([#3990](https://github.com/processone/ejabberd/issues/#3990))
|
||||
- Web Admin: In roster page move the `AddJID` textbox to top ([#4067](https://github.com/processone/ejabberd/issues/#4067))
|
||||
- Web Admin: Show a warning when visiting webadmin with non-privileged account ([#4089](https://github.com/processone/ejabberd/issues/#4089))
|
||||
|
||||
#### Docs:
|
||||
|
||||
- Example configuration: clarify 5223 tls options; specify s2s shaper
|
||||
- Make sure that `policy=user` commands have `host` instead of `server` arg in docs
|
||||
- Improve syntax of many command descriptions for the Docs site
|
||||
- Move example Perl extauth script from ejabberd git to Docs site
|
||||
- Remove obsolete example files, and add link in Docs to the archived copies
|
||||
|
||||
#### Installers (`make-binaries`):
|
||||
- Bump Erlang/OTP version to 26.1.1, and other dependencies
|
||||
- Remove outdated workaround
|
||||
- Don't build Linux-PAM examples
|
||||
- Fix check for current Expat version
|
||||
- Apply minor simplifications
|
||||
- Don't duplicate config entries
|
||||
- Don't hard-code musl version
|
||||
- Omit unnecessary glibc setting
|
||||
- Set kernel version for all builds
|
||||
- Let curl fail on HTTP errors
|
||||
|
||||
#### Modules:
|
||||
|
||||
- `mod_muc_log`: Add trailing backslash to URLs shown in disco info
|
||||
- `mod_muc_occupantid`: New module with support for XEP-0421 Occupant Id ([#3397](https://github.com/processone/ejabberd/issues/#3397))
|
||||
- `mod_muc_rtbl`: Better error handling in ([#4050](https://github.com/processone/ejabberd/issues/#4050))
|
||||
- `mod_private`: Add support for XEP-0402 PEP Native Bookmarks
|
||||
- `mod_privilege`: Don't fail to edit roster ([#3942](https://github.com/processone/ejabberd/issues/#3942))
|
||||
- `mod_pubsub`: Fix usage of `plugins` option, which produced `default_node_config` ignore ([#4070](https://github.com/processone/ejabberd/issues/#4070))
|
||||
- `mod_pubsub`: Add `pubsub_delete_item` hook
|
||||
- `mod_pubsub`: Report support of `config-node-max` in pep
|
||||
- `mod_pubsub`: Relay pubsub iq queries to muc members without using bare jid ([#4093](https://github.com/processone/ejabberd/issues/#4093))
|
||||
- `mod_pubsub`: Allow pubsub node owner to overwrite items published by other persons
|
||||
- `mod_push_keepalive`: Delay `wake_on_start`
|
||||
- `mod_push_keepalive`: Don't let hook crash
|
||||
- `mod_push`: Add `notify_on` option
|
||||
- `mod_push`: Set `last-message-sender` to bare JID
|
||||
- `mod_register_web`: Make redirect to page that end with `/` ([#3177](https://github.com/processone/ejabberd/issues/#3177))
|
||||
- `mod_shared_roster_ldap`: Don't crash in `get_member_jid` on empty output ([#3614](https://github.com/processone/ejabberd/issues/#3614))
|
||||
|
||||
#### MUC:
|
||||
|
||||
- Add support to register nick in a room ([#3455](https://github.com/processone/ejabberd/issues/#3455))
|
||||
- Convert `allow_private_message` MUC room option to `allowpm` ([#3736](https://github.com/processone/ejabberd/issues/#3736))
|
||||
- Update xmpp version to send `roomconfig_changesubject` in disco#info ([#4085](https://github.com/processone/ejabberd/issues/#4085))
|
||||
- Fix crash when loading room from DB older than ffa07c6, 23.04
|
||||
- Fix support to retract a MUC room message
|
||||
- Don't always store messages passed through `muc_filter_message` ([#4083](https://github.com/processone/ejabberd/issues/#4083))
|
||||
- Pass also MUC room retract messages over the `muc_filter_message` ([#3397](https://github.com/processone/ejabberd/issues/#3397))
|
||||
- Pass MUC room private messages over the `muc_filter_message` too ([#3397](https://github.com/processone/ejabberd/issues/#3397))
|
||||
- Store the subject author JID, and run `muc_filter_message` when sending subject ([#3397](https://github.com/processone/ejabberd/issues/#3397))
|
||||
- Remove existing role information for users that are kicked from room ([#4035](https://github.com/processone/ejabberd/issues/#4035))
|
||||
- Expand rule "mucsub subscribers are members in members only rooms" to more places
|
||||
|
||||
#### SQL:
|
||||
|
||||
- Add ability to force alternative upsert implementation in mysql
|
||||
- Properly parse mysql version even if it doesn't have type tag
|
||||
- Use prepared statement with mysql
|
||||
- Add alternate version of mysql upsert
|
||||
- `ejabberd_auth_sql`: Reset scram fields when setting plain password
|
||||
- `mod_privacy_sql`: Fix return values from `calculate_diff`
|
||||
- `mod_privacy_sql`: Optimize `set_list`
|
||||
- `mod_privacy_sql`: Use more efficient way to calculate changes in `set_privacy_list`
|
||||
|
||||
## Version 23.04
|
||||
|
||||
#### General:
|
||||
|
||||
- New `s2s_out_bounce_packet` hook
|
||||
- Re-allow anonymous connection for connection without client certificates ([#3985](https://github.com/processone/ejabberd/issues/3985))
|
||||
- Stop `ejabberd_system_monitor` before stopping node
|
||||
- `captcha_url` option now accepts `auto` value, and it's the default
|
||||
- `mod_mam`: Add support for XEP-0425: Message Moderation
|
||||
- `mod_mam_sql`: Fix problem with results of mam queries using rsm with max and before
|
||||
- `mod_muc_rtbl`: New module for Real-Time Block List for MUC rooms ([#4017](https://github.com/processone/ejabberd/issues/4017))
|
||||
- `mod_roster`: Set roster name from XEP-0172, or the stored one ([#1611](https://github.com/processone/ejabberd/issues/1611))
|
||||
- `mod_roster`: Preliminary support to store extra elements in subscription request ([#840](https://github.com/processone/ejabberd/issues/840))
|
||||
- `mod_pubsub`: Pubsub xdata fields `max_item/item_expira/children_max` use `max` not `infinity`
|
||||
- `mod_vcard_xupdate`: Invalidate `vcard_xupdate` cache on all nodes when vcard is updated
|
||||
|
||||
#### Admin:
|
||||
|
||||
- `ext_mod`: Improve support for loading `*.so` files from `ext_mod` dependencies
|
||||
- Improve output in `gen_html_doc_for_commands` command
|
||||
- Fix ejabberdctl output formatting ([#3979](https://github.com/processone/ejabberd/issues/3979))
|
||||
- Log HTTP handler exceptions
|
||||
|
||||
#### MUC:
|
||||
|
||||
- New command `get_room_history`
|
||||
- Persist `none` role for outcasts
|
||||
- Try to populate room history from mam when unhibernating
|
||||
- Make `mod_muc_room:set_opts` process persistent flag first
|
||||
- Allow passing affiliations and subscribers to `create_room_with_opts` command
|
||||
- Store state in db in `mod_muc:create_room()`
|
||||
- Make subscribers members by default
|
||||
|
||||
#### SQL schemas:
|
||||
|
||||
- Fix a long standing bug in new schema migration
|
||||
- `update_sql` command: Many improvements in new schema migration
|
||||
- `update_sql` command: Add support to migrate MySQL too
|
||||
- Change PostgreSQL SERIAL to BIGSERIAL columns
|
||||
- Fix minor SQL schema inconsistencies
|
||||
- Remove unnecessary indexes
|
||||
- New SQL schema migrate fix
|
||||
|
||||
#### MS SQL:
|
||||
|
||||
- MS SQL schema fixes
|
||||
- Add `new` schema for MS SQL
|
||||
- Add MS SQL support for new schema migration
|
||||
- Minor MS SQL improvements
|
||||
- Fix MS SQL error caused by `ORDER BY` in subquery
|
||||
|
||||
#### SQL Tests:
|
||||
|
||||
- Add support for running tests on MS SQL
|
||||
- Add ability to run tests on upgraded DB
|
||||
- Un-deprecate `ejabberd_config:set_option/2`
|
||||
- Use python3 to run `extauth.py` for tests
|
||||
- Correct README for creating test docker MS SQL DB
|
||||
- Fix TSQLlint warnings in MSSQL test script
|
||||
|
||||
#### Testing:
|
||||
|
||||
- Fix Shellcheck warnings in shell scripts
|
||||
- Fix Remark-lint warnings
|
||||
- Fix Prospector and Pylint warnings in test `extauth.py`
|
||||
- Stop testing ejabberd with Erlang/OTP 19.3, as Github Actions no longer supports ubuntu-18.04
|
||||
- Test only with oldest OTP supported (20.0), newest stable (25.3) and bleeding edge (26.0-rc2)
|
||||
- Upload Common Test logs as artifact in case of failure
|
||||
|
||||
#### `ecs` container image:
|
||||
- Update Alpine to 3.17 to get Erlang/OTP 25 and Elixir 1.14
|
||||
- Add `tini` as runtime init
|
||||
- Set `ERLANG_NODE` fixed to `ejabberd@localhost`
|
||||
- Upload images as artifacts to Github Actions
|
||||
- Publish tag images automatically to ghcr.io
|
||||
|
||||
#### `ejabberd` container image:
|
||||
- Update Alpine to 3.17 to get Erlang/OTP 25 and Elixir 1.14
|
||||
- Add `METHOD` to build container using packages ([#3983](https://github.com/processone/ejabberd/issues/3983))
|
||||
- Add `tini` as runtime init
|
||||
- Detect runtime dependencies automatically
|
||||
- Remove unused Mix stuff: ejabberd script and static COOKIE
|
||||
- Copy captcha scripts to `/opt/ejabberd-*/lib` like the installers
|
||||
- Expose only `HOME` volume, it contains all the required subdirs
|
||||
- ejabberdctl: Don't use `.../releases/COOKIE`, it's no longer included
|
||||
|
||||
#### Installers:
|
||||
|
||||
- make-binaries: Bump versions, e.g. erlang/otp to 25.3
|
||||
- make-binaries: Fix building with erlang/otp v25.x
|
||||
- make-packages: Fix for installers workflow, which didn't find lynx
|
||||
|
||||
## Version 23.01
|
||||
|
||||
#### General:
|
||||
|
||||
- Add `misc:uri_parse/2` to allow declaring default ports for protocols
|
||||
- CAPTCHA: Add support to define module instead of path to script
|
||||
- Clustering: Handle `mnesia_system_event mnesia_up` when other node joins this ([#3842](https://github.com/processone/ejabberd/issues/3842))
|
||||
- ConverseJS: Don't set i18n option because Converse enforces it instead of browser lang ([#3951](https://github.com/processone/ejabberd/issues/3951))
|
||||
- ConverseJS: Try to redirect access to files `mod_conversejs` to CDN when there is no local copies
|
||||
- ext_mod: compile C files and install them in ejabberd's `priv`
|
||||
- ext_mod: Support to get module status from Elixir modules
|
||||
- make-binaries: reduce log output
|
||||
- make-binaries: Bump zlib version to 1.2.13
|
||||
- MUC: Don't store mucsub presence events in offline storage
|
||||
- MUC: `hibernation_time` is not an option worth storing in room state ([#3946](https://github.com/processone/ejabberd/issues/3946))
|
||||
- Multicast: Jid format when `multicastc` was cached ([#3950](https://github.com/processone/ejabberd/issues/3950))
|
||||
- mysql: Pass `ssl` options to mysql driver
|
||||
- pgsql: Do not set `standard_conforming_strings` to `off` ([#3944](https://github.com/processone/ejabberd/issues/3944))
|
||||
- OAuth: Accept `jid` as a HTTP URL query argument
|
||||
- OAuth: Handle when client is not identified
|
||||
- PubSub: Expose the `pubsub#type` field in `disco#info` query to the node ([#3914](https://github.com/processone/ejabberd/issues/3914))
|
||||
- Translations: Update German translation
|
||||
|
||||
#### Admin:
|
||||
|
||||
- `api_permissions`: Fix option crash when doesn't have `who:` section
|
||||
- `log_modules_fully`: New option to list modules that will log everything
|
||||
- `outgoing_s2s_families`: Changed option's default to IPv6, and fall back to IPv4
|
||||
- Fix bash completion when using Relive or other install methods
|
||||
- Fix portability issue with some shells ([#3970](https://github.com/processone/ejabberd/issues/3970))
|
||||
- Allow admin command to subscribe new users to `members_only` rooms
|
||||
- Use alternative `split/2` function that works with Erlang/OTP as old as 19.3
|
||||
- Silent warning in OTP24 about not specified `cacerts` in SQL connections
|
||||
- Fix compilation warnings with Elixir 1.14
|
||||
|
||||
#### DOAP:
|
||||
|
||||
- Support extended `-protocol` erlang attribute
|
||||
- Add extended RFCs and XEP details to some protocol attributes
|
||||
- `tools/generate-doap.sh`: New script to generate DOAP file, add `make doap` ([#3915](https://github.com/processone/ejabberd/issues/3915))
|
||||
- `ejabberd.doap`: New DOAP file describing ejabberd supported protocols
|
||||
|
||||
#### MQTT:
|
||||
|
||||
- Add MQTT bridge module
|
||||
- Add support for certificate authentication in MQTT bridge
|
||||
- Implement reload in MQTT bridge
|
||||
- Add support for websockets to MQTT bridge
|
||||
- Recognize ws5/wss5 urls in MQTT bridge
|
||||
- `mqtt_publish`: New hook for MQTT publish event
|
||||
- `mqtt_(un)subscribe`: New hooks for MQTT subscribe & unsubscribe events
|
||||
|
||||
#### VSCode:
|
||||
|
||||
- Improve `.devcontainer` to use use devcontainer image and `.vscode`
|
||||
- Add `.vscode` files to instruct VSCode how to run ejabberd
|
||||
- Add Erlang LS default configuration
|
||||
- Add Elvis default configuration
|
||||
|
||||
## Version 22.10
|
||||
|
||||
#### Core:
|
||||
|
||||
Core:
|
||||
- Add `log_burst_limit_*` options ([#3865](https://github.com/processone/ejabberd/issues/3865))
|
||||
- Support `ERL_DIST_PORT` option to work without epmd
|
||||
- Auth JWT: Catch all errors from `jose_jwt:verify` and log debugging details ([#3890](https://github.com/processone/ejabberd/issues/3890))
|
||||
|
@ -18,7 +373,8 @@ Core:
|
|||
- `mod_shared_roster_ldap`: Update roster_get hook to use `#roster_item{}`
|
||||
- `prosody2ejabberd`: Fix parsing of scram password from prosody
|
||||
|
||||
MIX:
|
||||
#### MIX:
|
||||
|
||||
- Fix MIX's filter_nodes
|
||||
- Return user jid on join
|
||||
- `mod_mix_pam`: Add new MIX namespaces to disco features
|
||||
|
@ -33,12 +389,13 @@ MIX:
|
|||
- `mod_roster`: Adapt to change of mix_annotate type to boolean in roster_query
|
||||
- `mod_shared_roster`: Fix wrong hook type `#roster{}` (now `#roster_item{}`)
|
||||
|
||||
MUC:
|
||||
#### MUC:
|
||||
|
||||
- Store role, and use it when joining a moderated room ([#3330](https://github.com/processone/ejabberd/issues/3330))
|
||||
- Don't persist `none` role ([#3330](https://github.com/processone/ejabberd/issues/3330))
|
||||
- Allow MUC service admins to bypass max_user_conferences limitation
|
||||
- Show allow_query_users room option in disco info ([#3830](https://github.com/processone/ejabberd/issues/3830))
|
||||
- Don't set affiliation to `none` if it's already `none` in `mod_muc_room:process_item_change/3`
|
||||
- mod_muc_room: Don't set affiliation to `none` if it's already `none` in `process_item_change/3`
|
||||
- Fix mucsub unsubscribe notification payload to have muc_unsubcribe in it
|
||||
- Allow muc_{un}subscribe hooks to modify sent packets
|
||||
- Pass room state to muc_{un}subscribed hook
|
||||
|
@ -46,7 +403,8 @@ MUC:
|
|||
- Export `mod_muc_admin:get_room_pid/2`
|
||||
- Export function for getting room diagnostics
|
||||
|
||||
SQL:
|
||||
#### SQL:
|
||||
|
||||
- Handle errors reported from begin/commit inside transaction
|
||||
- Make connection close errors bubble up from inside sql transaction
|
||||
- Make first sql reconnect wait shorter time
|
||||
|
@ -58,7 +416,8 @@ SQL:
|
|||
- Update mysql library
|
||||
- Catch mysql connection being close earlier
|
||||
|
||||
Build:
|
||||
#### Build:
|
||||
|
||||
- `make all`: Generate start scripts here, not in `make install` ([#3821](https://github.com/processone/ejabberd/issues/3821))
|
||||
- `make clean`: Improve this and "distclean"
|
||||
- `make deps`: Ensure deps configuration is ran when getting deps ([#3823](https://github.com/processone/ejabberd/issues/3823))
|
||||
|
@ -71,7 +430,8 @@ Build:
|
|||
- Remove unused macro definitions detected by rebar3_hank
|
||||
- Remove unused header files which content is already in xmpp library
|
||||
|
||||
Container:
|
||||
#### Container:
|
||||
|
||||
- Get ejabberd-contrib sources to include them
|
||||
- Copy `.ejabberd-modules` directory if available
|
||||
- Do not clone repo inside container build
|
||||
|
@ -81,7 +441,8 @@ Container:
|
|||
- Set a less frequent healthcheck to reduce CPU usage ([#3826](https://github.com/processone/ejabberd/issues/3826))
|
||||
- Fix build instructions, add more podman examples
|
||||
|
||||
Installers:
|
||||
#### Installers:
|
||||
|
||||
- make-binaries: Include CAPTCHA script with release
|
||||
- make-binaries: Edit rebar.config more carefully
|
||||
- make-binaries: Fix linking of EIMP dependencies
|
||||
|
@ -95,57 +456,59 @@ Installers:
|
|||
- make-installers: Override code on upgrade
|
||||
- make-installers: Apply cosmetic changes
|
||||
|
||||
External modules:
|
||||
#### External modules:
|
||||
|
||||
- ext_mod: Support managing remote nodes in the cluster
|
||||
- ext_mod: Handle correctly when COMMIT.json not found
|
||||
- Don't bother with COMMIT.json user-friendly feature in automated user case
|
||||
- Handle not found COMMIT.json, for example in GH Actions
|
||||
- Add WebAdmin page for managing external modules
|
||||
|
||||
Workflows Actions:
|
||||
#### Workflows Actions:
|
||||
|
||||
- Update workflows to Erlang 25
|
||||
- Update workflows: Ubuntu 18 is deprecated and 22 is added
|
||||
- CI: Remove syntax_tools from applications, as fast_xml fails Dialyzer
|
||||
- Runtime: Add Xref options to be as strict as CI
|
||||
|
||||
# Version 22.05
|
||||
## Version 22.05
|
||||
|
||||
Core
|
||||
#### Core
|
||||
- C2S: Don't expect that socket will be available in `c2s_terminated` hook
|
||||
- Event handling process hook tracing
|
||||
- Guard against `erlang:system_info(logical_processors)` not always returning a number
|
||||
- `domain_balancing`: Allow for specifying `type` only, without specifying `component_number`
|
||||
|
||||
MQTT
|
||||
#### MQTT
|
||||
- Add TLS certificate authentication for MQTT connections
|
||||
- Fix login when generating client id, keep connection record (#3593)
|
||||
- Pass property name as expected in mqtt_codec (fixes login using MQTT 5)
|
||||
- Support MQTT subscriptions spread over the cluster (#3750)
|
||||
|
||||
MUC
|
||||
#### MUC
|
||||
- Attach meta field with real jid to mucsub subscription events
|
||||
- Handle user removal
|
||||
- Stop empty MUC rooms 30 seconds after creation
|
||||
- `default_room_options`: Update options configurable
|
||||
- `subscribe_room_many_max_users`: New option in `mod_muc_admin`
|
||||
|
||||
mod_conversejs
|
||||
#### mod_conversejs
|
||||
- Improved options to support `@HOST@` and `auto` values
|
||||
- Set `auth` and `register` options based on ejabberd configuration
|
||||
- `conversejs_options`: New option
|
||||
- `conversejs_resources`: New option
|
||||
|
||||
PubSub
|
||||
#### PubSub
|
||||
- `mod_pubsub`: Allow for limiting `item_expire` value
|
||||
- `mod_pubsub`: Unsubscribe JID on whitelist removal
|
||||
- `node_pep`: Add config-node and multi-items features (#3714)
|
||||
|
||||
SQL
|
||||
#### SQL
|
||||
- Improve compatibility with various db engine versions
|
||||
- Sync old-to-new schema script with reality (#3790)
|
||||
- Slight improvement in MSSQL testing support, but not yet complete
|
||||
|
||||
Other Modules
|
||||
#### Other Modules
|
||||
- `auth_jwt`: Checking if an user is active in SM for a JWT authenticated user (#3795)
|
||||
- `mod_configure`: Implement Get List of Registered/Online Users from XEP-0133
|
||||
- `mod_host_meta`: New module to serve host-meta files, see XEP-0156
|
||||
|
@ -158,7 +521,7 @@ Other Modules
|
|||
- `mod_shared_roster`: Normalize JID on unset_presence (#3752)
|
||||
- `mod_stun_disco`: Fix parsing of IPv6 listeners
|
||||
|
||||
Dependencies
|
||||
#### Dependencies
|
||||
- autoconf: Supported from 2.59 to the new 2.71
|
||||
- fast_tls: Update to 1.1.14 to support OpenSSL 3
|
||||
- jiffy: Update to 1.1.1 to support Erlang/OTP 25.0-rc1
|
||||
|
@ -168,7 +531,7 @@ Dependencies
|
|||
- rebar3: Updated binary to work from Erlang/OTP 22 to 25
|
||||
- `make update`: Fix when used with rebar 3.18
|
||||
|
||||
Compile
|
||||
#### Compile
|
||||
- `mix release`: Copy `include/` files for ejabberd, deps and otp, in `mix.exs`
|
||||
- `rebar3 release`: Fix ERTS path in `ejabberdctl`
|
||||
- `configure.ac`: Set default ejabberd version number when not using git
|
||||
|
@ -177,7 +540,7 @@ Compile
|
|||
- `tools/make-binaries`: New script for building Linux binaries
|
||||
- `tools/make-installers`: New script for building command line installers
|
||||
|
||||
Start
|
||||
#### Start
|
||||
- New `make relive` similar to `ejabberdctl live` without installing
|
||||
- `ejabberdctl`: Fix some warnings detected by ShellCheck
|
||||
- `ejabberdctl`: Mention in the help: `etop`, `ping` and `started`/`stopped`
|
||||
|
@ -185,7 +548,7 @@ Start
|
|||
- `mix.exs`: Add `-boot` and `-boot_var` in `ejabberdctl` instead of adding `vm.args`
|
||||
- `tools/captcha.sh`: Fix some warnings detected by ShellCheck
|
||||
|
||||
Commands
|
||||
#### Commands
|
||||
- Accept more types of ejabberdctl commands arguments as JSON-encoded
|
||||
- `delete_old_mam_messages_batch`: New command with rate limit
|
||||
- `delete_old_messages_batch`: New command with rate limit
|
||||
|
@ -197,7 +560,7 @@ Commands
|
|||
- `stop|restart`: Terminate ejabberd_sm before everything else to ensure sessions closing (#3641)
|
||||
- `subscribe_room_many`: New command
|
||||
|
||||
Translations
|
||||
#### Translations
|
||||
- Updated Catalan
|
||||
- Updated French
|
||||
- Updated German
|
||||
|
@ -205,7 +568,7 @@ Translations
|
|||
- Updated Portuguese (Brazil)
|
||||
- Updated Spanish
|
||||
|
||||
Workflows
|
||||
#### Workflows
|
||||
- CI: Publish CT logs and Cover on failure to an external GH Pages repo
|
||||
- CI: Test shell scripts using ShellCheck (#3738)
|
||||
- Container: New workflow to build and publish containers
|
||||
|
@ -213,14 +576,14 @@ Workflows
|
|||
- Installers: New workflow to build binary packages
|
||||
- Runtime: New workflow to test compilation, rel, starting and ejabberdctl
|
||||
|
||||
# Version 21.12
|
||||
## Version 21.12
|
||||
|
||||
Commands
|
||||
#### Commands
|
||||
- `create_room_with_opts`: Fixed when using SQL storage
|
||||
- `change_room_option`: Add missing fields from config inside `mod_muc_admin:change_options`
|
||||
- piefxis: Fixed arguments of all commands
|
||||
|
||||
Modules
|
||||
#### Modules
|
||||
- mod_caps: Don't forget caps on XEP-0198 resumption
|
||||
- mod_conversejs: New module to serve a simple page for Converse.js
|
||||
- mod_http_upload_quota: Avoid `max_days` race
|
||||
|
@ -235,7 +598,7 @@ Modules
|
|||
- mod_register_web: Handle unknown host gracefully
|
||||
- mod_register_web: Use mod_register configured restrictions
|
||||
|
||||
PubSub
|
||||
#### PubSub
|
||||
- Add `delete_expired_pubsub_items` command
|
||||
- Add `delete_old_pubsub_items` command
|
||||
- Optimize publishing on large nodes (SQL)
|
||||
|
@ -246,7 +609,7 @@ PubSub
|
|||
- node_flat: Avoid catch-all clauses for RSM
|
||||
- node_flat_sql: Avoid catch-all clauses for RSM
|
||||
|
||||
SQL
|
||||
#### SQL
|
||||
- Use `INSERT ... ON CONFLICT` in SQL_UPSERT for PostgreSQL >= 9.5
|
||||
- mod_mam export: assign MUC entries to the MUC service
|
||||
- MySQL: Fix typo when creating index
|
||||
|
@ -254,15 +617,15 @@ SQL
|
|||
- PgSQL: Add missing SQL migration for table `push_session`
|
||||
- PgSQL: Fix `vcard_search` definition in pgsql new schema
|
||||
|
||||
Other
|
||||
#### Other
|
||||
- `captcha-ng.sh`: "sort -R" command not POSIX, added "shuf" and "cat" as fallback
|
||||
- Make s2s connection table cleanup more robust
|
||||
- Update export/import of scram password to XEP-0227 1.1
|
||||
- Update Jose to 1.11.1 (the last in hex.pm correctly versioned)
|
||||
|
||||
# Version 21.07
|
||||
## Version 21.07
|
||||
|
||||
Compilation
|
||||
#### Compilation
|
||||
- Add rebar3 3.15.2 binary
|
||||
- Add support for mix to: `./configure --enable-rebar=mix`
|
||||
- Improved `make rel` to work with rebar3 and mix
|
||||
|
@ -274,14 +637,16 @@ Compilation
|
|||
- Added experimental support for GitHub Codespaces
|
||||
- Switch test service from TravisCI to GitHub Actions
|
||||
|
||||
Commands:
|
||||
#### Commands:
|
||||
|
||||
- Display extended error message in ejabberdctl
|
||||
- Remove SMP option from ejabberdctl.cfg, `-smp` was removed in OTP 21
|
||||
- `create_room`: After creating room, store in DB if it's persistent
|
||||
- `help`: Major changes in its usage and output
|
||||
- `srg_create`: Update to use `label` parameter instead of `name`
|
||||
|
||||
Modules:
|
||||
#### Modules:
|
||||
|
||||
- ejabberd_listener: New `send_timeout` option
|
||||
- mod_mix: Improvements to update to 0.14.1
|
||||
- mod_muc_room: Don't leak owner JIDs
|
||||
|
@ -298,7 +663,8 @@ Modules:
|
|||
- WebAdmin: New simple pages to view mnesia tables information and content
|
||||
- WebSocket: Fix typos
|
||||
|
||||
SQL:
|
||||
#### SQL:
|
||||
|
||||
- MySQL Backend Patch for scram-sha512
|
||||
- SQLite: When exporting for SQLite, use its specific escape options
|
||||
- SQLite: Minor fixes for new_sql_schema support
|
||||
|
@ -306,16 +672,18 @@ SQL:
|
|||
- mod_mqtt: Add mqtt_pub table definition for MSSQL
|
||||
- mod_shared_roster: Add missing indexes to `sr_group` tables in all SQL databases
|
||||
|
||||
# Version 21.04
|
||||
## Version 21.04
|
||||
|
||||
#### API Commands:
|
||||
|
||||
API Commands:
|
||||
- `add_rosteritem/...`: Add argument guards to roster commands
|
||||
- `get_user_subscriptions`: New command for MUC/Sub
|
||||
- `remove_mam_for_user_with_peer`: Fix when removing room archive
|
||||
- `send_message`: Fix bug introduced in ejabberd 21.01
|
||||
- `set_vcard`: Return modules errors
|
||||
|
||||
Build and setup:
|
||||
#### Build and setup:
|
||||
|
||||
- Allow ejabberd to be compatible as a dependency for an Erlang project using rebar3
|
||||
- CAPTCHA: New question/answer-based CAPTCHA script
|
||||
- `--enable-lua`: new configure option for luerl instead of --enable-tools
|
||||
|
@ -323,14 +691,16 @@ Build and setup:
|
|||
- Update `sql_query` record to handle the Erlang/OTP 24 compiler reports
|
||||
- Updated dependencies to fix Dialyzer warnings
|
||||
|
||||
Miscellaneous:
|
||||
#### Miscellaneous:
|
||||
|
||||
- CAPTCHA: Update `FORM_TYPE` from captcha to register
|
||||
- LDAP: fix eldap certificate verification
|
||||
- MySQL: Fix for "specified key was too long"
|
||||
- Translations: updated the Esperanto, Greek, and Japanese translations
|
||||
- Websocket: Fix PONG responses
|
||||
|
||||
Modules:
|
||||
#### Modules:
|
||||
|
||||
- `mod_block_strangers`: If stanza is type error, allow it passing
|
||||
- `mod_caps`: Don't request roster when not needed
|
||||
- `mod_caps`: Skip reading roster in one more case
|
||||
|
@ -344,9 +714,10 @@ Modules:
|
|||
- `mod_pubsub`: Fix `gen_pubsub_node:get_state` return value
|
||||
- `mod_vcard`: Obtain and provide photo type in vCard LDAP
|
||||
|
||||
# Version 21.01
|
||||
## Version 21.01
|
||||
|
||||
#### Miscellaneous changes:
|
||||
|
||||
Miscellaneous changes:
|
||||
- `log_rotate_size` option: Fix handling of ‘infinity’ value
|
||||
- `mod_time`: Fix invalid timezone
|
||||
- Auth JWT: New `check_decoded_jwt` hook runs the default JWT verifier
|
||||
|
@ -361,7 +732,8 @@ Miscellaneous changes:
|
|||
- Stun: Block loopback addresses by default
|
||||
- Several documentation fixes and clarifications
|
||||
|
||||
Commands:
|
||||
#### Commands:
|
||||
|
||||
- `decide_room`: Use better fallback value for room activity time when skipping room
|
||||
- `delete_old_message`: Fix when using sqlite spool table
|
||||
- `module_install`: Make ext_mod compile module with debug_info flags
|
||||
|
@ -369,17 +741,19 @@ Commands:
|
|||
- `send_message`: Don’t include empty in messages
|
||||
- `set_room_affiliation`: Validate affiliations
|
||||
|
||||
Running:
|
||||
#### Running:
|
||||
|
||||
- Docker: New `Dockerfile` and `devcontainer.json`
|
||||
- New `ejabberdctl foreground-quiet`
|
||||
- Systemd: Allow for listening on privileged ports
|
||||
- Systemd: Integrate nicely with systemd
|
||||
|
||||
Translations:
|
||||
#### Translations:
|
||||
|
||||
- Moved gettext PO files to a new `ejabberd-po` repository
|
||||
- Improved several translations: Catalan, Chinese, German, Greek, Indonesian, Norwegian, Portuguese (Brazil), Spanish.
|
||||
|
||||
# Version 20.12
|
||||
## Version 20.12
|
||||
|
||||
- Add support for `SCRAM-SHA-{256,512}-{PLUS}` authentication
|
||||
- Don't use same value in cache for user don't exist and wrong password
|
||||
|
@ -388,13 +762,13 @@ Translations:
|
|||
- start_room: new hook runs when a room process is started
|
||||
- check_decoded_jwt: new hook to check decoded JWT after success authentication
|
||||
|
||||
* Admin
|
||||
#### Admin
|
||||
- Docker: Fix DB initialization
|
||||
- New sql_odbc_driver option: choose the mssql ODBC driver
|
||||
- Rebar3: Fully supported. Enable with `./configure --with-rebar=/path/to/rebar3`
|
||||
- systemd: start ejabberd in foreground
|
||||
|
||||
* Modules:
|
||||
#### Modules:
|
||||
- MAM: Make sure that jid used as base in mam xml_compress is bare
|
||||
- MAM: Support for MAM Flipped Pages
|
||||
- MUC: Always show MucSub subscribers nicks
|
||||
|
@ -414,9 +788,9 @@ Translations:
|
|||
- WebAdmin: Mark dangerous buttons with CSS
|
||||
- WebSocket: Make websocket send put back pressure on c2s process
|
||||
|
||||
# Version 20.07
|
||||
## Version 20.07
|
||||
|
||||
* Changes in this version
|
||||
#### Changes in this version
|
||||
- Add support for using unix sockets in listeners.
|
||||
- Make this version compatible with erlang R23
|
||||
- Make room permissions checks more strict for subscribers
|
||||
|
@ -441,9 +815,9 @@ Translations:
|
|||
they were passed to handler modules
|
||||
- Make stun module work better with ipv6 addresses
|
||||
|
||||
# Version 20.03
|
||||
## Version 20.03
|
||||
|
||||
* Changes in this version
|
||||
#### Changes in this version
|
||||
- Add support of ssl connection when connection to mysql
|
||||
database (configured with `sql_ssl: true` option)
|
||||
- Experimental support for cockroachdb when configured
|
||||
|
@ -461,9 +835,9 @@ Translations:
|
|||
- Fix reporting errors in `send_stanza` command when xml
|
||||
passed to it couldn't be passed correctly
|
||||
|
||||
# Version 20.02
|
||||
## Version 20.02
|
||||
|
||||
* Changes in this version
|
||||
#### Changes in this version
|
||||
- Fix problems when trying to use string format with unicode
|
||||
values directly in xmpp nodes
|
||||
- Add missing oauth_client table declaration in lite.new.sql
|
||||
|
@ -479,9 +853,9 @@ Translations:
|
|||
override built-in values
|
||||
- Fix return value of reload_config and dump_config commands
|
||||
|
||||
# Version 20.01
|
||||
## Version 20.01
|
||||
|
||||
* New features
|
||||
#### New features
|
||||
- Implement OAUTH authentication in mqtt
|
||||
- Make logging infrastructure use new logger introduced
|
||||
in Erlang (requires OTP22)
|
||||
|
@ -496,7 +870,7 @@ Translations:
|
|||
- Generate man page automatically
|
||||
- Implement copy feature in mod_carboncopy
|
||||
|
||||
* Fixes
|
||||
#### Fixes
|
||||
- Make webadmin work with configurable paths
|
||||
- Fix handling of result in xmlrpc module
|
||||
- Make webadmin work even when accessed through not declared domain
|
||||
|
@ -512,20 +886,20 @@ Translations:
|
|||
failed
|
||||
- Fix crash in stream management when timeout was not set
|
||||
|
||||
# Version 19.09
|
||||
## Version 19.09
|
||||
|
||||
* Admin
|
||||
#### Admin
|
||||
- The minimum required Erlang/OTP version is now 19.3
|
||||
- Fix API call using OAuth (#2982)
|
||||
- Rename MUC command arguments from Host to Service (#2976)
|
||||
|
||||
* Webadmin
|
||||
#### Webadmin
|
||||
- Don't treat 'Host' header as a virtual XMPP host (#2989)
|
||||
- Fix some links to Guide in WebAdmin and add new ones (#3003)
|
||||
- Use select fields to input host in WebAdmin Backup (#3000)
|
||||
- Check account auth provided in WebAdmin is a local host (#3000)
|
||||
|
||||
* ACME
|
||||
#### ACME
|
||||
- Improve ACME implementation
|
||||
- Fix IDA support in ACME requests
|
||||
- Fix unicode formatting in ACME module
|
||||
|
@ -536,10 +910,10 @@ Translations:
|
|||
- Don't auto request certificate for localhost and IP-like domains
|
||||
- Add listener for ACME challenge in example config
|
||||
|
||||
* Authentication
|
||||
#### Authentication
|
||||
- JWT-only authentication for some users (#3012)
|
||||
|
||||
* MUC
|
||||
#### MUC
|
||||
- Apply default role after revoking admin affiliation (#3023)
|
||||
- Custom exit message is not broadcast (#3004)
|
||||
- Revert "Affiliations other than admin and owner cannot invite to members_only rooms" (#2987)
|
||||
|
@ -547,11 +921,11 @@ Translations:
|
|||
- Improve rooms_* commands to accept 'global' as MUC service argument (#2976)
|
||||
- Rename MUC command arguments from Host to Service (#2976)
|
||||
|
||||
* SQL
|
||||
#### SQL
|
||||
- Fix transactions for Microsoft SQL Server (#2978)
|
||||
- Spawn SQL connections on demand only
|
||||
|
||||
* Misc
|
||||
#### Misc
|
||||
- Add support for XEP-0328: JID Prep
|
||||
- Added gsfonts for captcha
|
||||
- Log Mnesia table type on creation
|
||||
|
@ -565,14 +939,14 @@ Translations:
|
|||
- Correctly handle unicode in log messages
|
||||
- Fix unicode processing in ejabberd.yml
|
||||
|
||||
# Version 19.08
|
||||
## Version 19.08
|
||||
|
||||
* Administration
|
||||
#### Administration
|
||||
- Improve ejabberd halting procedure
|
||||
- Process unexpected erlang messages uniformly: logging a warning
|
||||
- mod_configure: Remove modules management
|
||||
|
||||
* Configuration
|
||||
#### Configuration
|
||||
- Use new configuration validator
|
||||
- ejabberd_http: Use correct virtual host when consulting trusted_proxies
|
||||
- Fix Elixir modules detection in the configuration file
|
||||
|
@ -582,7 +956,7 @@ Translations:
|
|||
- mod_stream_mgmt: Allow flexible timeout format
|
||||
- mod_mqtt: Allow flexible timeout format in session_expiry option
|
||||
|
||||
* Misc
|
||||
#### Misc
|
||||
- Fix SQL connections leakage
|
||||
- New authentication method using JWT tokens
|
||||
- extauth: Add 'certauth' command
|
||||
|
@ -597,22 +971,22 @@ Translations:
|
|||
- mod_privacy: Don't attempt to query 'undefined' active list
|
||||
- mod_privacy: Fix race condition
|
||||
|
||||
* MUC
|
||||
#### MUC
|
||||
- Add code for hibernating inactive muc_room processes
|
||||
- Improve handling of unexpected iq in mod_muc_room
|
||||
- Attach mod_muc_room processes to a supervisor
|
||||
- Restore room when receiving message or generic iq for not started room
|
||||
- Distribute routing of MUC messages across all CPU cores
|
||||
|
||||
* PubSub
|
||||
#### PubSub
|
||||
- Fix pending nodes retrieval for SQL backend
|
||||
- Check access_model when publishing PEP
|
||||
- Remove deprecated pubsub plugins
|
||||
- Expose access_model and publish_model in pubsub#metadata
|
||||
|
||||
# Version 19.05
|
||||
## Version 19.05
|
||||
|
||||
* Admin
|
||||
#### Admin
|
||||
- The minimum required Erlang/OTP version is now 19.1
|
||||
- Provide a suggestion when unknown command, module, option or request handler is detected
|
||||
- Deprecate some listening options: captcha, register, web_admin, http_bind and xmlrpc
|
||||
|
@ -623,19 +997,19 @@ Translations:
|
|||
- Improve request_handlers validator
|
||||
- Fix syntax in example Elixir config file
|
||||
|
||||
* Auth
|
||||
#### Auth
|
||||
- Correctly support cache tags in ejabberd_auth
|
||||
- Don't process failed EXTERNAL authentication by mod_fail2ban
|
||||
- Don't call to mod_register when it's not loaded
|
||||
- Make anonymous auth don't {de}register user when there are other resources
|
||||
|
||||
* Developer
|
||||
#### Developer
|
||||
- Rename listening callback from start/2 to start/3
|
||||
- New hook called when room gets destroyed: room_destroyed
|
||||
- New hooks for tracking mucsub subscriptions changes: muc_subscribed, muc_unsubscribed
|
||||
- Make static hooks analyzer working again
|
||||
|
||||
* MUC
|
||||
#### MUC
|
||||
- Service admins are allowed to recreate room even if archive is nonempty
|
||||
- New option user_mucsub_from_muc_archive
|
||||
- Avoid late arrival of get_disco_item response
|
||||
|
@ -644,7 +1018,7 @@ Translations:
|
|||
- Make get_subscribed_rooms work even for non-persistant rooms
|
||||
- Allow non-moderator subscribers to get list of room subscribers
|
||||
|
||||
* Offline
|
||||
#### Offline
|
||||
- New option bounce_groupchat: make it not bounce mucsub/groupchat messages
|
||||
- New option use_mam_for_storage: fetch data from mam instead of spool table
|
||||
- When applying limit of max msgs in spool check only spool size
|
||||
|
@ -656,27 +1030,27 @@ Translations:
|
|||
- Return correct value from count_offline_messages with mam storage option
|
||||
- Make mod_offline put msg ignored by mam in spool when mam storage is on
|
||||
|
||||
* SQL:
|
||||
#### SQL:
|
||||
- Add SQL schemas for MQTT tables
|
||||
- Report better errors on SQL terms decode failure
|
||||
- Fix PostgreSQL compatibility in mod_offline_sql:remove_old_messages
|
||||
- Fix handling of list arguments on pgsql
|
||||
- Preliminary support for SQL in process_rosteritems command
|
||||
|
||||
* Tests
|
||||
#### Tests
|
||||
- Add tests for user mucsub mam from muc mam
|
||||
- Add tests for offline with mam storage
|
||||
- Add tests for offline use_mam_for_storage
|
||||
- Initial Docker environment to run ejabberd test suite
|
||||
- Test offline:use_mam_for_storage, mam:user_mucsub_from_muc_archive used together
|
||||
|
||||
* Websocket
|
||||
#### Websocket
|
||||
- Add WebSockets support to mod_mqtt
|
||||
- Return "Bad request" error when origin in websocket connection doesn't match
|
||||
- Fix RFC6454 violation on websocket connection when validating Origin header
|
||||
- Origin header validation on websocket connection
|
||||
|
||||
* Other modules
|
||||
#### Other modules
|
||||
- mod_adhoc: Use xml:lang from stanza when it's missing in <command/> element
|
||||
- mod_announce: Add 'sessionid' attribute when required
|
||||
- mod_bosh: Don't put duplicate polling attribute in bosh payload
|
||||
|
@ -687,16 +1061,16 @@ Translations:
|
|||
- mod_mqtt: Support other socket modules
|
||||
- mod_push: Check for payload in encrypted messages
|
||||
|
||||
# Version 19.02
|
||||
## Version 19.02
|
||||
|
||||
* Admin
|
||||
#### Admin
|
||||
- Fix in configure.ac the Erlang/OTP version: from 17.5 to 19.0
|
||||
- reload_config command: Fix crash when sql_pool_size option is used
|
||||
- reload_config command: Fix crash when SQL is not configured
|
||||
- rooms_empty_destroy command: Several fixes to behave more conservative
|
||||
- Fix serverhost->host parameter name for muc_(un)register_nick API
|
||||
|
||||
* Configuration
|
||||
#### Configuration
|
||||
- Allow specifying tag for listener for api_permission purposes
|
||||
- Change default ciphers to intermediate
|
||||
- Define default ciphers/protocol_option in example config
|
||||
|
@ -706,29 +1080,29 @@ Translations:
|
|||
- mod_muc: New option access_mam to restrict who can modify that room option
|
||||
- mod_offline: New option store_groupchat to allow storing group chat messages
|
||||
|
||||
* Core
|
||||
#### Core
|
||||
- Add MQTT protocol support
|
||||
- Fix (un)setting of priority
|
||||
- Use OTP application startup infrastructure for starting dependencies
|
||||
- Improve starting order of several dependencies
|
||||
|
||||
* MAM
|
||||
#### MAM
|
||||
- mod_mam_mnesia/sql: Improve check for empty archive
|
||||
- disallow room creation if archive not empty and clear_archive_on_room_destroy is false
|
||||
- allow check if archive is empty for or user or room
|
||||
- Additional checks for database failures
|
||||
|
||||
* MUC
|
||||
#### MUC
|
||||
- Make sure that room_destroyed is called even when some code throws in terminate
|
||||
- Update muc room state after adding extra access field to it
|
||||
- MUC/Sub: Send mucsub subscriber notification events with from set to room jid
|
||||
|
||||
* Shared Roster
|
||||
#### Shared Roster
|
||||
- Don't perform roster push for non-local contacts
|
||||
- Handle versioning result when shared roster group has remote account
|
||||
- Fix SQL queries
|
||||
|
||||
* Miscelanea
|
||||
#### Miscelanea
|
||||
- CAPTCHA: Add no-store hint to CAPTCHA challenge stanzas
|
||||
- HTTP: Reject http_api request with malformed Authentication header
|
||||
- mod_carboncopy: Don't lose carbons on presence change or session resumption
|
||||
|
@ -741,9 +1115,9 @@ Translations:
|
|||
- Translations: fixed "make translations"
|
||||
- WebAdmin: Fix support to restart module with new options
|
||||
|
||||
# Version 18.12
|
||||
## Version 18.12
|
||||
|
||||
* MAM data store compression
|
||||
* Proxy protocol support (http://www.haproxy.org/download/1.8/doc/proxy-protocol.txt)
|
||||
* MUC Self-Ping optimization (XEP-0410)
|
||||
* Bookmarks conversion (XEP-0411)
|
||||
- MAM data store compression
|
||||
- Proxy protocol support
|
||||
- MUC Self-Ping optimization (XEP-0410)
|
||||
- Bookmarks conversion (XEP-0411)
|
||||
|
|
|
@ -34,7 +34,7 @@ This Code of Conduct applies both within project spaces and in public spaces whe
|
|||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at conduct@process-one.net. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at the email address: conduct AT process-one.net. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
|
||||
|
||||
|
|
16
COMPILE.md
16
COMPILE.md
|
@ -7,7 +7,7 @@ from source code.
|
|||
For a more detailed explanation, please check the
|
||||
ejabberd Docs: [Source Code Installation][docs-source].
|
||||
|
||||
[docs-source]: https://docs.ejabberd.im/admin/installation/#source-code
|
||||
[docs-source]: https://docs.ejabberd.im/admin/install/source/
|
||||
|
||||
|
||||
Requirements
|
||||
|
@ -19,7 +19,7 @@ To compile ejabberd you need:
|
|||
- GCC
|
||||
- Libexpat ≥ 1.95
|
||||
- Libyaml ≥ 0.1.4
|
||||
- Erlang/OTP ≥ 19.3
|
||||
- Erlang/OTP ≥ 20.0
|
||||
- OpenSSL ≥ 1.0.0
|
||||
|
||||
Other optional libraries are:
|
||||
|
@ -28,7 +28,8 @@ Other optional libraries are:
|
|||
- PAM library, for Pluggable Authentication Modules (PAM)
|
||||
- ImageMagick's Convert program and Ghostscript fonts, for CAPTCHA
|
||||
challenges
|
||||
- Elixir ≥ 1.10.3, to support Elixir, and alternative to rebar/rebar3
|
||||
- Elixir ≥ 1.10.3, for Elixir support. It is recommended Elixir 1.13.4 or higher
|
||||
and Erlang/OTP 23.0 or higher.
|
||||
|
||||
If your system splits packages in libraries and development headers,
|
||||
install the development packages too.
|
||||
|
@ -89,13 +90,8 @@ Build an OTP Release
|
|||
Instead of installing ejabberd in the system, you can build an OTP release
|
||||
that includes all necessary to run ejabberd in a subdirectory:
|
||||
|
||||
./configure --with-rebar=rebar3
|
||||
make rel
|
||||
|
||||
Or, if you have Elixir available and plan to develop Elixir code:
|
||||
|
||||
./configure --with-rebar=mix
|
||||
make dev
|
||||
./configure
|
||||
make prod
|
||||
|
||||
Check the full list of targets:
|
||||
|
||||
|
|
222
CONTAINER.md
222
CONTAINER.md
|
@ -1,11 +1,10 @@
|
|||
|
||||
[![GitHub tag (latest SemVer)](https://img.shields.io/github/v/tag/processone/ejabberd?sort=semver&logo=embarcadero&label=&color=49c0c4)](https://github.com/processone/ejabberd/tags)
|
||||
[![GitHub Container](https://img.shields.io/github/v/tag/processone/ejabberd?label=container&sort=semver)](https://github.com/processone/ejabberd/pkgs/container/ejabberd)
|
||||
[![Docker Image Version (latest semver)](https://img.shields.io/docker/v/ejabberd/ecs?label=docker)](https://hub.docker.com/r/ejabberd/ecs/)
|
||||
[![GitHub Container](https://img.shields.io/github/v/tag/processone/ejabberd?label=ejabberd&sort=semver&logo=docker)](https://github.com/processone/ejabberd/pkgs/container/ejabberd)
|
||||
|
||||
|
||||
ejabberd Container
|
||||
==================
|
||||
`ejabberd` Container Image
|
||||
==========================
|
||||
|
||||
[ejabberd][home] is an open-source,
|
||||
robust, scalable and extensible realtime platform built using [Erlang/OTP][erlang],
|
||||
|
@ -17,20 +16,20 @@ that includes [XMPP][xmpp] Server, [MQTT][mqtt] Broker and [SIP][sip] Service.
|
|||
[mqtt]: https://mqtt.org/
|
||||
[sip]: https://en.wikipedia.org/wiki/Session_Initiation_Protocol
|
||||
|
||||
This document explains how to use the
|
||||
[ejabberd container images](https://github.com/processone/ejabberd/pkgs/container/ejabberd)
|
||||
available in the GitHub Container Registry,
|
||||
This document explains how to use the `ejabberd` container image available in
|
||||
[ghcr.io/processone/ejabberd](https://github.com/processone/ejabberd/pkgs/container/ejabberd),
|
||||
built using the files in `.github/container/`.
|
||||
This image is based in Alpine 3.19, includes Erlang/OTP 26.2 and Elixir 1.16.1.
|
||||
|
||||
Alternatively, there are also
|
||||
[ejabberd-ecs Docker images](https://hub.docker.com/r/ejabberd/ecs/)
|
||||
available in Docker Hub,
|
||||
Alternatively, there is also the `ecs` container image available in
|
||||
[docker.io/ejabberd/ecs](https://hub.docker.com/r/ejabberd/ecs/),
|
||||
built using the
|
||||
[docker-ejabberd/ecs](https://github.com/processone/docker-ejabberd/tree/master/ecs)
|
||||
repository.
|
||||
Check the [differences between `ejabberd` and `ecs` images](https://github.com/processone/docker-ejabberd/blob/master/ecs/HUB-README.md#alternative-image-in-github).
|
||||
|
||||
If you are using a Windows operating system, check the tutorials mentioned in
|
||||
[ejabberd Docs > Docker Image](https://docs.ejabberd.im/admin/installation/#docker-image).
|
||||
[ejabberd Docs > Docker Image](https://docs.ejabberd.im/admin/install/container/#ejabberd-container-image).
|
||||
|
||||
|
||||
Start ejabberd
|
||||
|
@ -109,7 +108,7 @@ docker exec -it ejabberd ejabberdctl register admin localhost passw0rd
|
|||
```
|
||||
|
||||
Then edit conf/ejabberd.yml and add the ACL as explained in
|
||||
[ejabberd Docs: Administration Account](https://docs.ejabberd.im/admin/installation/#administration-account)
|
||||
[ejabberd Docs: Administration Account](https://docs.ejabberd.im/admin/install/next-steps/#administration-account)
|
||||
|
||||
|
||||
### Check ejabberd log files
|
||||
|
@ -154,10 +153,9 @@ Now update your ejabberd configuration file, for example:
|
|||
docker exec -it ejabberd vi conf/ejabberd.yml
|
||||
```
|
||||
|
||||
and add the required options:
|
||||
```
|
||||
captcha_cmd: /opt/ejabberd-22.04/lib/ejabberd-22.04/priv/bin/captcha.sh
|
||||
captcha_url: https://localhost:5443/captcha
|
||||
and add this option:
|
||||
```yaml
|
||||
captcha_cmd: /opt/ejabberd-22.04/lib/captcha.sh
|
||||
```
|
||||
|
||||
Finally, reload the configuration file or restart the container:
|
||||
|
@ -165,6 +163,18 @@ Finally, reload the configuration file or restart the container:
|
|||
docker exec ejabberd ejabberdctl reload_config
|
||||
```
|
||||
|
||||
If the CAPTCHA image is not visible, there may be a problem generating it
|
||||
(the ejabberd log file may show some error message);
|
||||
or the image URL may not be correctly detected by ejabberd,
|
||||
in that case you can set the correct URL manually, for example:
|
||||
```yaml
|
||||
captcha_url: https://localhost:5443/captcha
|
||||
```
|
||||
|
||||
For more details about CAPTCHA options, please check the
|
||||
[CAPTCHA](https://docs.ejabberd.im/admin/configuration/basic/#captcha)
|
||||
documentation section.
|
||||
|
||||
|
||||
Advanced Container Configuration
|
||||
--------------------------------
|
||||
|
@ -206,15 +216,18 @@ explains how to install an additional module using docker-compose.
|
|||
### Commands on start
|
||||
|
||||
The ejabberdctl script reads the `CTL_ON_CREATE` environment variable
|
||||
the first time the docker container is started,
|
||||
the first time the container is started,
|
||||
and reads `CTL_ON_START` every time the container is started.
|
||||
Those variables can contain one ejabberdctl command,
|
||||
or several commands separated with the blankspace and `;` characters.
|
||||
|
||||
Example usage (see full example [docker-compose.yml](https://github.com/processone/docker-ejabberd/issues/64#issuecomment-887741332)):
|
||||
By default failure of any of commands executed that way would
|
||||
abort start, this can be disabled by prefixing commands with `!`
|
||||
|
||||
Example usage (or check the [full example](#customized-example)):
|
||||
```yaml
|
||||
environment:
|
||||
- CTL_ON_CREATE=register admin localhost asd
|
||||
- CTL_ON_CREATE=! register admin localhost asd
|
||||
- CTL_ON_START=stats registeredusers ;
|
||||
check_password admin localhost asd ;
|
||||
status
|
||||
|
@ -236,7 +249,7 @@ For this you can either:
|
|||
|
||||
Example to connect a local `ejabberdctl` to a containerized ejabberd:
|
||||
1. When creating the container, export port 5210, and set `ERLANG_COOKIE`:
|
||||
```
|
||||
```sh
|
||||
docker run --name ejabberd -it \
|
||||
-e ERLANG_COOKIE=`cat $HOME/.erlang.cookie` \
|
||||
-p 5210:5210 -p 5222:5222 \
|
||||
|
@ -247,7 +260,7 @@ docker run --name ejabberd -it \
|
|||
4. Now use `ejabberdctl` in your local ejabberd deployment
|
||||
|
||||
To connect using a local `ejabberd` script:
|
||||
```
|
||||
```sh
|
||||
ERL_DIST_PORT=5210 _build/dev/rel/ejabberd/bin/ejabberd ping
|
||||
```
|
||||
|
||||
|
@ -259,11 +272,10 @@ Example using environment variables (see full example [docker-compose.yml](https
|
|||
```
|
||||
|
||||
|
||||
Generating a Container Image
|
||||
----------------------------
|
||||
Build a Container Image
|
||||
-----------------------
|
||||
|
||||
This container image includes ejabberd as a standalone OTP release built using Elixir.
|
||||
|
||||
That OTP release is configured with:
|
||||
|
||||
- `mix.exs`: Customize ejabberd release
|
||||
|
@ -271,32 +283,23 @@ That OTP release is configured with:
|
|||
- `config/runtime.exs`: Customize ejabberd paths
|
||||
- `ejabberd.yml.template`: ejabberd default config file
|
||||
|
||||
Build ejabberd Community Server base image from ejabberd master on GitHub:
|
||||
### Direct build
|
||||
|
||||
Build ejabberd Community Server container image from ejabberd master git repository:
|
||||
|
||||
```bash
|
||||
docker build \
|
||||
docker buildx build \
|
||||
-t personal/ejabberd \
|
||||
-f .github/container/Dockerfile \
|
||||
.
|
||||
```
|
||||
|
||||
Build ejabberd Community Server base image for a given ejabberd version,
|
||||
both for amd64 and arm64 architectures:
|
||||
|
||||
```bash
|
||||
VERSION=22.05
|
||||
git checkout $VERSION
|
||||
docker buildx build \
|
||||
--platform=linux/amd64,linux/arm64
|
||||
-t personal/ejabberd:$VERSION \
|
||||
-f .github/container/Dockerfile \
|
||||
.
|
||||
```
|
||||
### Podman build
|
||||
|
||||
It's also possible to use podman instead of docker, just notice:
|
||||
- `EXPOSE 4369-4399` port range is not supported, remove that in Dockerfile
|
||||
- It mentions that `healthcheck` is not supported by the Open Container Initiative image format
|
||||
- If you want to start with command `live`, add environment variable `EJABBERD_BYPASS_WARNINGS=true`
|
||||
- to start with command `live`, you may want to add environment variable `EJABBERD_BYPASS_WARNINGS=true`
|
||||
```bash
|
||||
podman build \
|
||||
-t ejabberd \
|
||||
|
@ -310,4 +313,145 @@ podman exec eja1 ejabberdctl status
|
|||
podman exec -it eja1 sh
|
||||
|
||||
podman stop eja1
|
||||
|
||||
podman run --name eja1 -it -e EJABBERD_BYPASS_WARNINGS=true -p 5222:5222 localhost/ejabberd live
|
||||
```
|
||||
|
||||
### Package build for `arm64`
|
||||
|
||||
By default, `.github/container/Dockerfile` builds this container by directly compiling ejabberd,
|
||||
it is a fast and direct method.
|
||||
However, a problem with QEMU prevents building the container in QEMU using Erlang/OTP 25
|
||||
for the `arm64` architecture.
|
||||
|
||||
Providing `--build-arg METHOD=package` is an alternate method to build the container
|
||||
used by the Github Actions workflow that provides `amd64` and `arm64` container images.
|
||||
It first builds an ejabberd binary package, and later installs it in the image.
|
||||
That method avoids using QEMU, so it can build `arm64` container images, but is extremely
|
||||
slow the first time it's used, and consequently not recommended for general use.
|
||||
|
||||
In this case, to build the ejabberd container image for arm64 architecture:
|
||||
|
||||
```bash
|
||||
docker buildx build \
|
||||
--build-arg METHOD=package \
|
||||
--platform linux/arm64 \
|
||||
-t personal/ejabberd:$VERSION \
|
||||
-f .github/container/Dockerfile \
|
||||
.
|
||||
```
|
||||
|
||||
|
||||
Composer Examples
|
||||
-----------------
|
||||
|
||||
### Minimal Example
|
||||
|
||||
This is the barely minimal file to get a usable ejabberd.
|
||||
Store it as `docker-compose.yml`:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
main:
|
||||
image: ghcr.io/processone/ejabberd
|
||||
container_name: ejabberd
|
||||
ports:
|
||||
- "5222:5222"
|
||||
- "5269:5269"
|
||||
- "5280:5280"
|
||||
- "5443:5443"
|
||||
```
|
||||
|
||||
Create and start the container with the command:
|
||||
```bash
|
||||
docker-compose up
|
||||
```
|
||||
|
||||
### Customized Example
|
||||
|
||||
This example shows the usage of several customizations:
|
||||
it uses a local configuration file,
|
||||
stores the mnesia database in a local path,
|
||||
registers an account when it's created,
|
||||
and checks the number of registered accounts every time it's started.
|
||||
|
||||
Download or copy the ejabberd configuration file:
|
||||
```bash
|
||||
wget https://raw.githubusercontent.com/processone/ejabberd/master/ejabberd.yml.example
|
||||
mv ejabberd.yml.example ejabberd.yml
|
||||
```
|
||||
|
||||
Create the database directory and allow the container access to it:
|
||||
```bash
|
||||
mkdir database
|
||||
sudo chown 9000:9000 database
|
||||
```
|
||||
|
||||
Now write this `docker-compose.yml` file:
|
||||
```yaml
|
||||
version: '3.7'
|
||||
|
||||
services:
|
||||
|
||||
main:
|
||||
image: ghcr.io/processone/ejabberd
|
||||
container_name: ejabberd
|
||||
environment:
|
||||
- CTL_ON_CREATE=register admin localhost asd
|
||||
- CTL_ON_START=registered_users localhost ;
|
||||
status
|
||||
ports:
|
||||
- "5222:5222"
|
||||
- "5269:5269"
|
||||
- "5280:5280"
|
||||
- "5443:5443"
|
||||
volumes:
|
||||
- ./ejabberd.yml:/opt/ejabberd/conf/ejabberd.yml:ro
|
||||
- ./database:/opt/ejabberd/database
|
||||
```
|
||||
|
||||
### Clustering Example
|
||||
|
||||
In this example, the main container is created first.
|
||||
Once it is fully started and healthy, a second container is created,
|
||||
and once ejabberd is started in it, it joins the first one.
|
||||
|
||||
An account is registered in the first node when created (and
|
||||
we ignore errors that can happen when doing that - for example
|
||||
whenn account already exists),
|
||||
and it should exist in the second node after join.
|
||||
|
||||
Notice that in this example the main container does not have access
|
||||
to the exterior; the replica exports the ports and can be accessed.
|
||||
|
||||
```yaml
|
||||
version: '3.7'
|
||||
|
||||
services:
|
||||
|
||||
main:
|
||||
image: ghcr.io/processone/ejabberd
|
||||
container_name: ejabberd
|
||||
environment:
|
||||
- ERLANG_NODE_ARG=ejabberd@main
|
||||
- ERLANG_COOKIE=dummycookie123
|
||||
- CTL_ON_CREATE=! register admin localhost asd
|
||||
|
||||
replica:
|
||||
image: ghcr.io/processone/ejabberd
|
||||
container_name: replica
|
||||
depends_on:
|
||||
main:
|
||||
condition: service_healthy
|
||||
ports:
|
||||
- "5222:5222"
|
||||
- "5269:5269"
|
||||
- "5280:5280"
|
||||
- "5443:5443"
|
||||
environment:
|
||||
- ERLANG_NODE_ARG=ejabberd@replica
|
||||
- ERLANG_COOKIE=dummycookie123
|
||||
- CTL_ON_CREATE=join_cluster ejabberd@main
|
||||
- CTL_ON_START=registered_users localhost ;
|
||||
status
|
||||
```
|
||||
|
|
|
@ -3,21 +3,21 @@
|
|||
We'd love for you to contribute to our source code and to make ejabberd even better than it is
|
||||
today! Here are the guidelines we'd like you to follow:
|
||||
|
||||
* [Code of Conduct](#coc)
|
||||
* [Questions and Problems](#question)
|
||||
* [Issues and Bugs](#issue)
|
||||
* [Feature Requests](#feature)
|
||||
* [Issue Submission Guidelines](#submit)
|
||||
* [Pull Request Submission Guidelines](#submit-pr)
|
||||
* [Signing the CLA](#cla)
|
||||
* [Code of Conduct](#code-of-conduct)
|
||||
* [Questions and Problems](#questions-bugs-features)
|
||||
* [Issues and Bugs](#found-an-issue-or-bug)
|
||||
* [Feature Requests](#missing-a-feature)
|
||||
* [Issue Submission Guidelines](#issue-submission-guidelines)
|
||||
* [Pull Request Submission Guidelines](#pull-request-submission-guidelines)
|
||||
* [Signing the CLA](#signing-the-contributor-license-agreement-cla)
|
||||
|
||||
## <a name="coc"></a> Code of Conduct
|
||||
## Code of Conduct
|
||||
|
||||
Help us keep ejabberd community open-minded and inclusive. Please read and follow our [Code of Conduct][coc].
|
||||
|
||||
## <a name="requests"></a> Questions, Bugs, Features
|
||||
## Questions, Bugs, Features
|
||||
|
||||
### <a name="question"></a> Got a Question or Problem?
|
||||
### Got a Question or Problem?
|
||||
|
||||
Do not open issues for general support questions as we want to keep GitHub issues for bug reports
|
||||
and feature requests. You've got much better chances of getting your question answered on dedicated
|
||||
|
@ -34,16 +34,16 @@ To save your and our time, we will systematically close all issues that are requ
|
|||
support and redirect people to the section you are reading right now.
|
||||
|
||||
Other channels for support are:
|
||||
- [ejabberd Mailing List][list]
|
||||
- [ejabberd XMPP room][muc]: ejabberd@conference.process-one.net
|
||||
- ejabberd XMPP room: [ejabberd@conference.process-one.net][muc]
|
||||
- [ejabberd XMPP room logs][logs]
|
||||
- [ejabberd Mailing List][list]
|
||||
|
||||
### <a name="issue"></a> Found an Issue or Bug?
|
||||
### Found an Issue or Bug?
|
||||
|
||||
If you find a bug in the source code, you can help us by submitting an issue to our
|
||||
[GitHub Repository][github]. Even better, you can submit a Pull Request with a fix.
|
||||
|
||||
### <a name="feature"></a> Missing a Feature?
|
||||
### Missing a Feature?
|
||||
|
||||
You can request a new feature by submitting an issue to our [GitHub Repository][github-issues].
|
||||
|
||||
|
@ -52,9 +52,9 @@ If you would like to implement a new feature then consider what kind of change i
|
|||
* **Major Changes** that you wish to contribute to the project should be discussed first in an
|
||||
[GitHub issue][github-issues] that clearly outlines the changes and benefits of the feature.
|
||||
* **Small Changes** can directly be crafted and submitted to the [GitHub Repository][github]
|
||||
as a Pull Request. See the section about [Pull Request Submission Guidelines](#submit-pr).
|
||||
as a Pull Request. See the section about [Pull Request Submission Guidelines](#pull-request-submission-guidelines).
|
||||
|
||||
## <a name="submit"></a> Issue Submission Guidelines
|
||||
## Issue Submission Guidelines
|
||||
|
||||
Before you submit your issue search the archive, maybe your question was already answered.
|
||||
|
||||
|
@ -64,7 +64,7 @@ the effort we can spend fixing issues and adding new features, by not reporting
|
|||
The "[new issue][github-new-issue]" form contains a number of prompts that you should fill out to
|
||||
make it easier to understand and categorize the issue.
|
||||
|
||||
## <a name="submit-pr"></a> Pull Request Submission Guidelines
|
||||
## Pull Request Submission Guidelines
|
||||
|
||||
By submitting a pull request for a code or doc contribution, you need to have the right
|
||||
to grant your contribution's copyright license to ProcessOne. Please check [ProcessOne CLA][cla]
|
||||
|
@ -123,7 +123,7 @@ restarted.
|
|||
|
||||
That's it! Thank you for your contribution!
|
||||
|
||||
## <a name="cla"></a> Signing the Contributor License Agreement (CLA)
|
||||
## Signing the Contributor License Agreement (CLA)
|
||||
|
||||
Upon submitting a Pull Request, we will ask you to sign our CLA if you haven't done
|
||||
so before. It's a quick process, we promise, and you will be able to do it all online
|
||||
|
@ -147,4 +147,3 @@ gives us the option to relicense the code with a more permissive license in the
|
|||
[doc-repo]: https://github.com/processone/docs.ejabberd.im
|
||||
[developer-setup]: https://docs.ejabberd.im/developer/
|
||||
[cla]: https://www.process-one.net/resources/ejabberd-cla.pdf
|
||||
[license]: https://github.com/processone/ejabberd/blob/master/COPYING
|
||||
|
|
263
Makefile.in
263
Makefile.in
|
@ -1,8 +1,22 @@
|
|||
REBAR = @ESCRIPT@ @rebar@
|
||||
#.
|
||||
#' definitions
|
||||
#
|
||||
|
||||
ESCRIPT = @ESCRIPT@
|
||||
REBAR = @rebar@
|
||||
MIX = @rebar@
|
||||
AWK = @AWK@
|
||||
INSTALL = @INSTALL@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
SED = @SED@
|
||||
ERL = @ERL@
|
||||
EPMD = @EPMD@
|
||||
IEX = @IEX@
|
||||
|
||||
INSTALLUSER=@INSTALLUSER@
|
||||
INSTALLGROUP=@INSTALLGROUP@
|
||||
|
||||
REBAR_ENABLE_ELIXIR = @elixir@
|
||||
|
||||
prefix = @prefix@
|
||||
exec_prefix = @exec_prefix@
|
||||
|
@ -71,7 +85,10 @@ SPOOLDIR = @localstatedir@/lib/ejabberd
|
|||
# /var/log/ejabberd/
|
||||
LOGDIR = @localstatedir@/log/ejabberd
|
||||
|
||||
INSTALLUSER=@INSTALLUSER@
|
||||
#.
|
||||
#' install user
|
||||
#
|
||||
|
||||
# if no user was enabled, don't set privileges or ownership
|
||||
ifeq ($(INSTALLUSER),)
|
||||
O_USER=
|
||||
|
@ -86,18 +103,22 @@ else
|
|||
CHOWN_OUTPUT=&1
|
||||
INIT_USER=$(INSTALLUSER)
|
||||
endif
|
||||
|
||||
# if no group was enabled, don't set privileges or ownership
|
||||
INSTALLGROUP=@INSTALLGROUP@
|
||||
ifneq ($(INSTALLGROUP),)
|
||||
G_USER=-g $(INSTALLGROUP)
|
||||
endif
|
||||
|
||||
ifeq "$(MIX)" "mix"
|
||||
#.
|
||||
#' rebar / rebar3 / mix
|
||||
#
|
||||
|
||||
ifeq "$(notdir $(MIX))" "mix"
|
||||
REBAR_VER:=6
|
||||
REBAR_VER_318:=0
|
||||
else
|
||||
REBAR_VER:=$(shell $(REBAR) --version | awk -F '[ .]' '/rebar / {print $$2}')
|
||||
REBAR_VER_318:=$(shell $(REBAR) --version | awk -F '[ .]' '/rebar / {print ($$2 == 3 && $$3 >= 18 ? 1 : 0)}')
|
||||
REBAR_VER:=$(shell $(REBAR) --version | $(AWK) -F '[ .]' '/rebar / {print $$2}')
|
||||
REBAR_VER_318:=$(shell $(REBAR) --version | $(AWK) -F '[ .]' '/rebar / {print ($$2 == 3 && $$3 >= 18 ? 1 : 0)}')
|
||||
endif
|
||||
|
||||
ifeq "$(REBAR_VER)" "6"
|
||||
|
@ -112,11 +133,26 @@ ifeq "$(REBAR_VER)" "6"
|
|||
CONFIGURE_DEPS=(cd deps/eimp; ./configure)
|
||||
EBINDIR=$(DEPSDIR)/ejabberd/ebin
|
||||
XREFOPTIONS=graph
|
||||
EDOCPRE=MIX_ENV=edoc
|
||||
EDOCTASK=docs --proglang erlang
|
||||
CLEANARG=--deps
|
||||
ELIXIR_LIBDIR_RAW=$(shell elixir -e "IO.puts(:filename.dirname(:code.lib_dir(:elixir)))" -e ":erlang.halt")
|
||||
ELIXIR_LIBDIR=":$(ELIXIR_LIBDIR_RAW)"
|
||||
REBARREL=MIX_ENV=prod $(REBAR) release --overwrite
|
||||
REBARDEV=MIX_ENV=dev $(REBAR) release --overwrite
|
||||
RELIVECMD=escript rel/relive.escript && MIX_ENV=dev RELIVE=true iex --name ejabberd@localhost -S mix run
|
||||
RELIVECMD=$(ESCRIPT) rel/relive.escript && MIX_ENV=dev RELIVE=true $(IEX) --name ejabberd@localhost -S mix run
|
||||
REL_LIB_DIR = _build/dev/rel/ejabberd/lib
|
||||
COPY_REL_TARGET = dev
|
||||
GET_DEPS_TRANSLATIONS=MIX_ENV=translations $(REBAR) $(GET_DEPS)
|
||||
DEPSDIR_TRANSLATIONS=deps
|
||||
else
|
||||
ifeq ($(REBAR_ENABLE_ELIXIR),true)
|
||||
ELIXIR_LIBDIR_RAW=$(shell elixir -e "IO.puts(:filename.dirname(:code.lib_dir(:elixir)))" -e ":erlang.halt")
|
||||
ELIXIR_LIBDIR=":$(ELIXIR_LIBDIR_RAW)"
|
||||
EXPLICIT_ELIXIR_COMPILE=MIX_ENV=default mix compile.elixir
|
||||
EXPLICIT_ELIXIR_COMPILE_DEV=MIX_ENV=dev mix compile.elixir
|
||||
PREPARE_ELIXIR_SCRIPTS=$(MKDIR_P) rel/overlays; cp $(ELIXIR_LIBDIR_RAW)/../bin/iex rel/overlays/; cp $(ELIXIR_LIBDIR_RAW)/../bin/elixir rel/overlays/; sed -i 's|ERTS_BIN=$$|ERTS_BIN=$$SCRIPT_PATH/../../erts-{{erts_vsn}}/bin/|' rel/overlays/elixir
|
||||
endif
|
||||
ifeq "$(REBAR_VER)" "3"
|
||||
SKIPDEPS=
|
||||
LISTDEPS=tree
|
||||
|
@ -134,8 +170,12 @@ endif
|
|||
XREFOPTIONS=
|
||||
CLEANARG=--all
|
||||
REBARREL=$(REBAR) as prod tar
|
||||
REBARDEV=REBAR_PROFILE=dev $(REBAR) release
|
||||
RELIVECMD=$(REBAR) relive
|
||||
REBARDEV=$(REBAR) as dev release
|
||||
RELIVECMD=$(REBAR) as dev relive
|
||||
REL_LIB_DIR = _build/dev/rel/ejabberd/lib
|
||||
COPY_REL_TARGET = dev
|
||||
GET_DEPS_TRANSLATIONS=$(REBAR) as translations $(GET_DEPS)
|
||||
DEPSDIR_TRANSLATIONS=_build/translations/lib
|
||||
else
|
||||
SKIPDEPS=skip_deps=true
|
||||
LISTDEPS=-q list-deps
|
||||
|
@ -151,10 +191,16 @@ else
|
|||
REBARREL=$(REBAR) generate
|
||||
REBARDEV=
|
||||
RELIVECMD=@echo "Rebar2 detected... relive not supported.\
|
||||
\nTry: ./configure --with-rebar=./rebar3 ; make relive"
|
||||
\nTry: ./configure --with-rebar=rebar3 ; make relive"
|
||||
REL_LIB_DIR = rel/ejabberd/lib
|
||||
COPY_REL_TARGET = rel
|
||||
endif
|
||||
endif
|
||||
|
||||
#.
|
||||
#' main targets
|
||||
#
|
||||
|
||||
all: scripts deps src
|
||||
|
||||
deps: $(DEPSDIR)/.got
|
||||
|
@ -162,7 +208,7 @@ deps: $(DEPSDIR)/.got
|
|||
$(DEPSDIR)/.got:
|
||||
rm -rf $(DEPSDIR)/.got
|
||||
rm -rf $(DEPSDIR)/.built
|
||||
mkdir -p $(DEPSDIR)
|
||||
$(MKDIR_P) $(DEPSDIR)
|
||||
$(REBAR) $(GET_DEPS) && :> $(DEPSDIR)/.got
|
||||
$(CONFIGURE_DEPS)
|
||||
|
||||
|
@ -171,6 +217,7 @@ $(DEPSDIR)/.built: $(DEPSDIR)/.got
|
|||
|
||||
src: $(DEPSDIR)/.built
|
||||
$(REBAR) $(SKIPDEPS) compile
|
||||
$(EXPLICIT_ELIXIR_COMPILE)
|
||||
|
||||
update:
|
||||
rm -rf $(DEPSDIR)/.got
|
||||
|
@ -188,11 +235,35 @@ options: all
|
|||
tools/opt_types.sh ejabberd_option $(EBINDIR)
|
||||
|
||||
translations:
|
||||
tools/prepare-tr.sh $(DEPSDIR)
|
||||
$(GET_DEPS_TRANSLATIONS)
|
||||
tools/prepare-tr.sh $(DEPSDIR_TRANSLATIONS)
|
||||
|
||||
edoc:
|
||||
$(ERL) -noinput +B -eval \
|
||||
'case edoc:application(ejabberd, ".", []) of ok -> halt(0); error -> halt(1) end.'
|
||||
doap:
|
||||
tools/generate-doap.sh
|
||||
|
||||
#.
|
||||
#' edoc
|
||||
#
|
||||
|
||||
edoc: edoc_files edoc_compile
|
||||
$(EDOCPRE) $(REBAR) $(EDOCTASK)
|
||||
|
||||
edoc_compile: deps
|
||||
$(EDOCPRE) $(REBAR) compile
|
||||
|
||||
edoc_files: _build/edoc/docs.md _build/edoc/logo.png
|
||||
|
||||
_build/edoc/docs.md: edoc_compile
|
||||
echo "For much more detailed and complete ejabberd documentation, " \
|
||||
"go to the [ejabberd Docs](https://docs.ejabberd.im/) site." \
|
||||
> _build/edoc/docs.md
|
||||
|
||||
_build/edoc/logo.png: edoc_compile
|
||||
wget https://docs.ejabberd.im/assets/img/footer_logo_e.png -O _build/edoc/logo.png
|
||||
|
||||
#.
|
||||
#' copy-files
|
||||
#
|
||||
|
||||
JOIN_PATHS=$(if $(wordlist 2,1000,$(1)),$(firstword $(1))/$(call JOIN_PATHS,$(wordlist 2,1000,$(1))),$(1))
|
||||
|
||||
|
@ -279,26 +350,58 @@ copy-files:
|
|||
|
||||
copy-files-sub: copy-files-sub2
|
||||
|
||||
#.
|
||||
#' copy-files-rel
|
||||
#
|
||||
|
||||
copy-files-rel: $(COPY_REL_TARGET)
|
||||
#
|
||||
# Libraries
|
||||
(cd $(REL_LIB_DIR) && find . -follow -type f ! -executable -exec $(INSTALL) -vDm 640 $(G_USER) {} $(DESTDIR)$(LIBDIR)/{} \;)
|
||||
#
|
||||
# *.so:
|
||||
(cd $(REL_LIB_DIR) && find . -follow -type f -executable -name *.so -exec $(INSTALL) -vDm 640 $(G_USER) {} $(DESTDIR)$(LIBDIR)/{} \;)
|
||||
#
|
||||
# Executable files
|
||||
(cd $(REL_LIB_DIR) && find . -follow -type f -executable ! -name *.so -exec $(INSTALL) -vDm 550 $(G_USER) {} $(DESTDIR)$(LIBDIR)/{} \;)
|
||||
|
||||
#.
|
||||
#' uninstall-librel
|
||||
#
|
||||
|
||||
uninstall-librel:
|
||||
(cd $(REL_LIB_DIR) && find . -follow -type f -exec rm -fv -v $(DESTDIR)$(LIBDIR)/{} \;)
|
||||
(cd $(REL_LIB_DIR) && find . -follow -depth -type d -exec rm -dv -v $(DESTDIR)$(LIBDIR)/{} \;)
|
||||
|
||||
#.
|
||||
#' relive
|
||||
#
|
||||
|
||||
relive:
|
||||
$(EXPLICIT_ELIXIR_COMPILE_DEV)
|
||||
$(RELIVECMD)
|
||||
|
||||
relivelibdir=$(shell pwd)/$(DEPSDIR)
|
||||
relivedir=$(shell pwd)/_build/relive
|
||||
iexpath=$(shell which iex)
|
||||
CONFIG_DIR = ${relivedir}/conf
|
||||
SPOOL_DIR = ${relivedir}/database
|
||||
LOGS_DIR = ${relivedir}/logs
|
||||
|
||||
#.
|
||||
#' scripts
|
||||
#
|
||||
|
||||
ejabberdctl.relive:
|
||||
$(SED) -e "s*{{installuser}}*@INSTALLUSER@*g" \
|
||||
$(SED) -e "s*{{installuser}}*${INSTALLUSER}*g" \
|
||||
-e "s*{{config_dir}}*${CONFIG_DIR}*g" \
|
||||
-e "s*{{logs_dir}}*${LOGS_DIR}*g" \
|
||||
-e "s*{{spool_dir}}*${SPOOL_DIR}*g" \
|
||||
-e "s*{{bindir}}/iex*$(iexpath)*g" \
|
||||
-e "s*{{bindir}}*@bindir@*g" \
|
||||
-e "s*{{libdir}}*${relivelibdir}*g" \
|
||||
-e "s*{{erl}}*@ERL@*g" \
|
||||
-e "s*{{epmd}}*@EPMD@*g" ejabberdctl.template \
|
||||
-e "s*{{bindir}}*${BINDIR}*g" \
|
||||
-e "s*{{libdir}}*${relivelibdir}${ELIXIR_LIBDIR}*g" \
|
||||
-e "s*ERTS_VSN*# ERTS_VSN*g" \
|
||||
-e "s*{{iexpath}}*${IEX}*g" \
|
||||
-e "s*{{erl}}*${ERL}*g" \
|
||||
-e "s*{{epmd}}*${EPMD}*g" ejabberdctl.template \
|
||||
> ejabberdctl.relive
|
||||
|
||||
ejabberd.init:
|
||||
|
@ -314,19 +417,29 @@ ejabberd.service:
|
|||
chmod 644 ejabberd.service
|
||||
|
||||
ejabberdctl.example: vars.config
|
||||
$(SED) -e "s*{{installuser}}*@INSTALLUSER@*g" \
|
||||
$(SED) -e "s*{{installuser}}*${INSTALLUSER}*g" \
|
||||
-e "s*{{config_dir}}*${ETCDIR}*g" \
|
||||
-e "s*{{logs_dir}}*${LOGDIR}*g" \
|
||||
-e "s*{{spool_dir}}*${SPOOLDIR}*g" \
|
||||
-e "s*{{bindir}}*@bindir@*g" \
|
||||
-e "s*{{libdir}}*@libdir@*g" \
|
||||
-e "s*{{erl}}*@ERL@*g" \
|
||||
-e "s*{{epmd}}*@EPMD@*g" ejabberdctl.template \
|
||||
-e "s*{{bindir}}*${BINDIR}*g" \
|
||||
-e "s*{{libdir}}*${LIBDIR}${ELIXIR_LIBDIR}*g" \
|
||||
-e "s*ERTS_VSN*# ERTS_VSN*g" \
|
||||
-e "s*{{iexpath}}*${IEX}*g" \
|
||||
-e "s*{{erl}}*${ERL}*g" \
|
||||
-e "s*{{epmd}}*${EPMD}*g" ejabberdctl.template \
|
||||
> ejabberdctl.example
|
||||
|
||||
scripts: ejabberd.init ejabberd.service ejabberdctl.example
|
||||
|
||||
install: copy-files
|
||||
#.
|
||||
#' install
|
||||
#
|
||||
|
||||
install: copy-files install-main
|
||||
|
||||
install-rel: copy-files-rel install-main
|
||||
|
||||
install-main:
|
||||
#
|
||||
# Configuration files
|
||||
$(INSTALL) -d -m 750 $(G_USER) $(DESTDIR)$(ETCDIR)
|
||||
|
@ -349,12 +462,12 @@ install: copy-files
|
|||
#
|
||||
# Spool directory
|
||||
$(INSTALL) -d -m 750 $(O_USER) $(DESTDIR)$(SPOOLDIR)
|
||||
$(CHOWN_COMMAND) -R @INSTALLUSER@ $(DESTDIR)$(SPOOLDIR) >$(CHOWN_OUTPUT)
|
||||
$(CHOWN_COMMAND) -R $(INSTALLUSER) $(DESTDIR)$(SPOOLDIR) >$(CHOWN_OUTPUT)
|
||||
chmod -R 750 $(DESTDIR)$(SPOOLDIR)
|
||||
#
|
||||
# Log directory
|
||||
$(INSTALL) -d -m 750 $(O_USER) $(DESTDIR)$(LOGDIR)
|
||||
$(CHOWN_COMMAND) -R @INSTALLUSER@ $(DESTDIR)$(LOGDIR) >$(CHOWN_OUTPUT)
|
||||
$(CHOWN_COMMAND) -R $(INSTALLUSER) $(DESTDIR)$(LOGDIR) >$(CHOWN_OUTPUT)
|
||||
chmod -R 750 $(DESTDIR)$(LOGDIR)
|
||||
#
|
||||
# Documentation
|
||||
|
@ -365,8 +478,14 @@ install: copy-files
|
|||
|| echo "Man page not included in sources"
|
||||
$(INSTALL) -m 644 COPYING $(DESTDIR)$(DOCDIR)
|
||||
|
||||
#.
|
||||
#' uninstall
|
||||
#
|
||||
|
||||
uninstall: uninstall-binary
|
||||
|
||||
uninstall-rel: uninstall-binary uninstall-librel
|
||||
|
||||
uninstall-binary:
|
||||
rm -f $(DESTDIR)$(SBINDIR)/ejabberdctl
|
||||
rm -f $(DESTDIR)$(BINDIR)/iex
|
||||
|
@ -395,6 +514,7 @@ uninstall-binary:
|
|||
rm -fr $(DESTDIR)$(LUADIR)
|
||||
rm -fr $(DESTDIR)$(PRIVDIR)
|
||||
rm -fr $(DESTDIR)$(EJABBERDDIR)
|
||||
rm -f $(DESTDIR)$(MANDIR)/ejabberd.yml.5
|
||||
|
||||
uninstall-all: uninstall-binary
|
||||
rm -rf $(DESTDIR)$(ETCDIR)
|
||||
|
@ -402,6 +522,10 @@ uninstall-all: uninstall-binary
|
|||
rm -rf $(DESTDIR)$(SPOOLDIR)
|
||||
rm -rf $(DESTDIR)$(LOGDIR)
|
||||
|
||||
#.
|
||||
#' clean
|
||||
#
|
||||
|
||||
clean:
|
||||
rm -rf $(DEPSDIR)/.got
|
||||
rm -rf $(DEPSDIR)/.built
|
||||
|
@ -424,27 +548,53 @@ distclean: clean clean-rel
|
|||
rm -f Makefile
|
||||
rm -f vars.config
|
||||
|
||||
rel:
|
||||
#.
|
||||
#' releases
|
||||
#
|
||||
|
||||
rel: prod
|
||||
|
||||
prod:
|
||||
$(PREPARE_ELIXIR_SCRIPTS)
|
||||
$(REBARREL)
|
||||
|
||||
DEV_CONFIG = _build/dev/rel/ejabberd/conf/ejabberd.yml
|
||||
|
||||
dev $(DEV_CONFIG):
|
||||
$(PREPARE_ELIXIR_SCRIPTS)
|
||||
$(REBARDEV)
|
||||
|
||||
#.
|
||||
#' tags
|
||||
#
|
||||
|
||||
TAGS:
|
||||
etags *.erl
|
||||
etags src/*.erl
|
||||
|
||||
#.
|
||||
#' makefile
|
||||
#
|
||||
|
||||
Makefile: Makefile.in
|
||||
|
||||
ifeq "$(REBAR_VER)" "3"
|
||||
#.
|
||||
#' dialyzer
|
||||
#
|
||||
|
||||
ifeq "$(REBAR_VER)" "6" # Mix
|
||||
dialyzer:
|
||||
MIX_ENV=test $(REBAR) dialyzer
|
||||
|
||||
else
|
||||
ifeq "$(REBAR_VER)" "3" # Rebar3
|
||||
dialyzer:
|
||||
$(REBAR) dialyzer
|
||||
else
|
||||
|
||||
else # Rebar2
|
||||
deps := $(wildcard $(DEPSDIR)/*/ebin)
|
||||
|
||||
dialyzer/erlang.plt:
|
||||
@mkdir -p dialyzer
|
||||
@$(MKDIR_P) dialyzer
|
||||
@dialyzer --build_plt --output_plt dialyzer/erlang.plt \
|
||||
-o dialyzer/erlang.log --apps kernel stdlib sasl crypto \
|
||||
public_key ssl mnesia inets odbc compiler erts \
|
||||
|
@ -452,13 +602,13 @@ dialyzer/erlang.plt:
|
|||
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
|
||||
|
||||
dialyzer/deps.plt:
|
||||
@mkdir -p dialyzer
|
||||
@$(MKDIR_P) dialyzer
|
||||
@dialyzer --build_plt --output_plt dialyzer/deps.plt \
|
||||
-o dialyzer/deps.log $(deps); \
|
||||
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
|
||||
|
||||
dialyzer/ejabberd.plt:
|
||||
@mkdir -p dialyzer
|
||||
@$(MKDIR_P) dialyzer
|
||||
@dialyzer --build_plt --output_plt dialyzer/ejabberd.plt \
|
||||
-o dialyzer/ejabberd.log ebin; \
|
||||
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
|
||||
|
@ -480,6 +630,11 @@ dialyzer: erlang_plt deps_plt ejabberd_plt
|
|||
--get_warnings -o dialyzer/error.log ebin; \
|
||||
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
|
||||
endif
|
||||
endif
|
||||
|
||||
#.
|
||||
#' test
|
||||
#
|
||||
|
||||
test:
|
||||
@echo "************************** NOTICE ***************************************"
|
||||
|
@ -488,9 +643,18 @@ test:
|
|||
@cd priv && ln -sf ../sql
|
||||
$(REBAR) $(SKIPDEPS) ct
|
||||
|
||||
.PHONY: src edoc dialyzer Makefile TAGS clean clean-rel distclean rel \
|
||||
#.
|
||||
#' phony
|
||||
#
|
||||
|
||||
.PHONY: src edoc dialyzer Makefile TAGS clean clean-rel distclean prod rel \
|
||||
install uninstall uninstall-binary uninstall-all translations deps test \
|
||||
quicktest erlang_plt deps_plt ejabberd_plt xref hooks options
|
||||
all dev doap help install-rel relive scripts uninstall-rel update \
|
||||
erlang_plt deps_plt ejabberd_plt xref hooks options
|
||||
|
||||
#.
|
||||
#' help
|
||||
#
|
||||
|
||||
help:
|
||||
@echo ""
|
||||
|
@ -498,24 +662,31 @@ help:
|
|||
@echo " scripts Prepare ejabberd start scripts"
|
||||
@echo " deps Get and configure dependencies"
|
||||
@echo " src Compile dependencies and ejabberd"
|
||||
@echo " update Update dependencies' source code"
|
||||
@echo " update Update dependencies source code"
|
||||
@echo " clean Clean binary files"
|
||||
@echo " distclean Clean completely the development files"
|
||||
@echo ""
|
||||
@echo " install Install ejabberd to /usr/local"
|
||||
@echo " install-rel Install ejabberd to /usr/local (using release)"
|
||||
@echo " uninstall Uninstall ejabberd (buggy)"
|
||||
@echo " uninstall-rel Uninstall ejabberd (using release)"
|
||||
@echo " uninstall-all Uninstall also configuration, logs, mnesia... (buggy)"
|
||||
@echo ""
|
||||
@echo " rel Build a production release"
|
||||
@echo " prod Build a production release"
|
||||
@echo " dev Build a development release"
|
||||
@echo " relive Start a live ejabberd in _build/relive/"
|
||||
@echo ""
|
||||
@echo " edoc Generate edoc documentation (unused)"
|
||||
@echo " doap Generate DOAP file"
|
||||
@echo " edoc Generate EDoc documentation [mix]"
|
||||
@echo " options Generate ejabberd_option.erl"
|
||||
@echo " translations Extract translation files (requires --enable-tools)"
|
||||
@echo " tags Generate tags file for text editors"
|
||||
@echo " translations Extract translation files"
|
||||
@echo " TAGS Generate tags file for text editors"
|
||||
@echo ""
|
||||
@echo " dialyzer Run Dialyzer static analyzer"
|
||||
@echo " hooks Run hooks validator"
|
||||
@echo " test Run Common Tests suite"
|
||||
@echo " xref Run cross reference analysis"
|
||||
@echo " test Run Common Tests suite [rebar3]"
|
||||
@echo " xref Run cross reference analysis [rebar3]"
|
||||
|
||||
#.
|
||||
#'
|
||||
# vim: foldmarker=#',#. foldmethod=marker:
|
||||
|
|
48
README.md
48
README.md
|
@ -1,26 +1,27 @@
|
|||
|
||||
<p align="center">
|
||||
<img src="https://www.process-one.net/wp-content/uploads/2022/05/ejabberd-logo-rounded-index.png"
|
||||
height="216">
|
||||
<img src="https://www.process-one.net/wp-content/uploads/2022/05/ejabberd-logo-rounded-index.png">
|
||||
</p>
|
||||
<p align="center">
|
||||
<a href="https://github.com/processone/ejabberd/tags" alt="GitHub tag (latest SemVer)">
|
||||
<img src="https://img.shields.io/github/v/tag/processone/ejabberd?sort=semver&logo=embarcadero&label=&color=3fb0d2&logoWidth=20" /></a>
|
||||
<a href="https://hex.pm/packages/ejabberd" alt="Hex version">
|
||||
<img src="https://img.shields.io/hexpm/v/ejabberd.svg" /></a>
|
||||
<a href="https://github.com/processone/ejabberd/pkgs/container/ejabberd" alt="GitHub Container">
|
||||
<img src="https://img.shields.io/github/v/tag/processone/ejabberd?label=container&sort=semver" /></a>
|
||||
<a href="https://hub.docker.com/r/ejabberd/ecs/" alt="Docker Image Version (latest semver)">
|
||||
<img src="https://img.shields.io/docker/v/ejabberd/ecs?label=docker" /></a>
|
||||
<a href="https://formulae.brew.sh/formula/ejabberd" alt="homebrew version">
|
||||
<img src="https://img.shields.io/homebrew/v/ejabberd" /></a>
|
||||
<a href="https://hub.docker.com/r/ejabberd/ecs/" alt="Docker Image Version (latest semver)">
|
||||
<img src="https://img.shields.io/docker/v/ejabberd/ecs?label=ecs&logo=docker" /></a>
|
||||
<a href="https://github.com/processone/ejabberd/pkgs/container/ejabberd" alt="GitHub Container">
|
||||
<img src="https://img.shields.io/github/v/tag/processone/ejabberd?label=ejabberd&sort=semver&logo=docker" /></a>
|
||||
<br />
|
||||
<a href="https://github.com/processone/ejabberd/actions/workflows/ci.yml" alt="CI">
|
||||
<img src="https://github.com/processone/ejabberd/actions/workflows/ci.yml/badge.svg" /></a>
|
||||
<a href="https://coveralls.io/github/processone/ejabberd?branch=master" alt="Coverage Status">
|
||||
<img src="https://coveralls.io/repos/github/processone/ejabberd/badge.svg?branch=master "Coverage in coveralls.io"" /></a>
|
||||
<img src="https://coveralls.io/repos/github/processone/ejabberd/badge.svg?branch=master" /></a>
|
||||
<a href="https://hosted.weblate.org/projects/ejabberd/ejabberd-po/" alt="Translation status">
|
||||
<img src="https://hosted.weblate.org/widgets/ejabberd/-/ejabberd-po/svg-badge.svg"" /></a>
|
||||
<img src="https://hosted.weblate.org/widgets/ejabberd/-/ejabberd-po/svg-badge.svg" /></a>
|
||||
<a href="https://docs.ejabberd.im/" alt="ejabberd Docs">
|
||||
<img src="https://img.shields.io/github/v/tag/processone/docs.ejabberd.im?sort=semver&logo=&label=docs&logoWidth=0" /></a>
|
||||
</p>
|
||||
|
||||
|
||||
|
@ -29,8 +30,8 @@ robust, scalable and extensible realtime platform built using [Erlang/OTP][erlan
|
|||
that includes [XMPP][xmpp] Server, [MQTT][mqtt] Broker and [SIP][sip] Service.
|
||||
|
||||
Check the features in [ejabberd.im][im], [ejabberd Docs][features],
|
||||
[ejabberd at ProcessOne][p1home], and a list of [supported protocols and XEPs][xeps].
|
||||
|
||||
[ejabberd at ProcessOne][p1home], and the list of [supported protocols in ProcessOne][xeps]
|
||||
and [XMPP.org][xmppej].
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
@ -38,9 +39,9 @@ Installation
|
|||
There are several ways to install ejabberd:
|
||||
|
||||
- Source code: compile yourself, see [COMPILE](COMPILE.md)
|
||||
- Installers from [ejabberd GitHub Releases][releases] (run/deb/rpm for x64 and arm64)
|
||||
- Container image from [ejabberd Docker Hub][hubecs], see [ecs README][docker-ecs-readme] (for x64)
|
||||
- Container image from [ejabberd Github Packages][packages], see [CONTAINER](CONTAINER.md) (for x64 and arm64)
|
||||
- Installers: [ProcessOne Download][p1download] and [GitHub Releases][releases] for releases, [GitHub Actions](https://github.com/processone/ejabberd/actions/workflows/installers.yml) for master branch (run/deb/rpm for x64 and arm64)
|
||||
- `ecs` container image: [Docker Hub][hubecs] and [Github Packages][packagesecs], see [ecs README][docker-ecs-readme] (for x64)
|
||||
- `ejabberd` container image: [Github Packages][packages] for releases and master branch, see [CONTAINER](CONTAINER.md) (for x64 and arm64)
|
||||
- Using your [Operating System package][osp]
|
||||
- Using the [Homebrew][homebrew] package manager
|
||||
|
||||
|
@ -72,8 +73,12 @@ or in your local machine as explained in [Localization][localization].
|
|||
|
||||
Documentation for developers is available in [ejabberd docs: Developers][docs-dev].
|
||||
|
||||
There are nightly builds of ejabberd, both for `master` branch and for Pull Requests:
|
||||
- Installers: go to [GitHub Actions: Installers](https://github.com/processone/ejabberd/actions/workflows/installers.yml), open the most recent commit, on the bottom of that commit page, download the `ejabberd-packages.zip` artifact.
|
||||
- `ejabberd` container image: go to [ejabberd Github Packages][packages]
|
||||
|
||||
Security reports or concerns should preferably be reported privately,
|
||||
please send an email to the address: contact [at] process-one [dot] net
|
||||
please send an email to the address: contact at process-one dot net
|
||||
or some other method from [ProcessOne Contact][p1contact].
|
||||
|
||||
For commercial offering and support, including [ejabberd Business Edition][p1home]
|
||||
|
@ -85,8 +90,7 @@ Community
|
|||
|
||||
There are several places to get in touch with other ejabberd developers and administrators:
|
||||
|
||||
- [ejabberd XMPP chatroom][muc]: ejabberd@conference.process-one.net
|
||||
- [Mailing list][list]
|
||||
- ejabberd XMPP chatroom: [ejabberd@conference.process-one.net][muc]
|
||||
- [GitHub Discussions][discussions]
|
||||
- [Stack Overflow][stackoverflow]
|
||||
|
||||
|
@ -94,7 +98,7 @@ There are several places to get in touch with other ejabberd developers and admi
|
|||
License
|
||||
-------
|
||||
|
||||
ejabberd is released under the GNU General Public License v2 (see [COPYING](COPYING.md)),
|
||||
ejabberd is released under the GNU General Public License v2 (see [COPYING](COPYING)),
|
||||
and [ejabberd translations](https://github.com/processone/ejabberd-po/) under MIT License.
|
||||
|
||||
|
||||
|
@ -105,22 +109,24 @@ and [ejabberd translations](https://github.com/processone/ejabberd-po/) under MI
|
|||
[erlang]: https://www.erlang.org/
|
||||
[features]: https://docs.ejabberd.im/admin/introduction/
|
||||
[fluux]: https://fluux.io/
|
||||
[github]: https://github.com/processone/ejabberd
|
||||
[homebrew]: https://docs.ejabberd.im/admin/installation/#homebrew
|
||||
[homebrew]: https://docs.ejabberd.im/admin/install/homebrew/
|
||||
[hubecs]: https://hub.docker.com/r/ejabberd/ecs/
|
||||
[im]: https://ejabberd.im/
|
||||
[issues]: https://github.com/processone/ejabberd/issues
|
||||
[list]: https://lists.jabber.ru/mailman/listinfo/ejabberd
|
||||
[localization]: https://docs.ejabberd.im/developer/extending-ejabberd/localization/
|
||||
[mqtt]: https://mqtt.org/
|
||||
[muc]: xmpp:ejabberd@conference.process-one.net
|
||||
[osp]: https://docs.ejabberd.im/admin/installation/#operating-system-packages
|
||||
[osp]: https://docs.ejabberd.im/admin/install/os-package/
|
||||
[p1contact]: https://www.process-one.net/en/company/contact/
|
||||
[p1download]: https://www.process-one.net/en/ejabberd/downloads/
|
||||
[p1home]: https://www.process-one.net/en/ejabberd/
|
||||
[packages]: https://github.com/processone/ejabberd/pkgs/container/ejabberd
|
||||
[packagesecs]: https://github.com/processone/docker-ejabberd/pkgs/container/ecs
|
||||
[releases]: https://github.com/processone/ejabberd/releases
|
||||
[sip]: https://en.wikipedia.org/wiki/Session_Initiation_Protocol
|
||||
[stackoverflow]: https://stackoverflow.com/questions/tagged/ejabberd?sort=newest
|
||||
[weblate]: https://hosted.weblate.org/projects/ejabberd/ejabberd-po/
|
||||
[xeps]: https://www.process-one.net/en/ejabberd/protocols/
|
||||
[xmpp]: https://xmpp.org/
|
||||
[xmppej]: https://xmpp.org/software/servers/ejabberd/
|
||||
|
||||
|
|
|
@ -8,6 +8,8 @@ end
|
|||
rootpath = System.get_env("RELEASE_ROOT", rootdefault)
|
||||
config :ejabberd,
|
||||
file: Path.join(rootpath, "conf/ejabberd.yml"),
|
||||
log_path: Path.join(rootpath, 'logs/ejabberd.log')
|
||||
log_path: Path.join(rootpath, "logs/ejabberd.log")
|
||||
config :mnesia,
|
||||
dir: Path.join(rootpath, 'database/')
|
||||
dir: Path.join(rootpath, "database/")
|
||||
config :exsync,
|
||||
reload_callback: {:ejabberd_admin, :update, []}
|
||||
|
|
71
configure.ac
71
configure.ac
|
@ -2,15 +2,17 @@
|
|||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ(2.59)
|
||||
AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo 22.10` | sed 's/-g.*//;s/-/./' | tr -d '\012']), [ejabberd@process-one.net], [ejabberd])
|
||||
REQUIRE_ERLANG_MIN="8.3 (Erlang/OTP 19.3)"
|
||||
AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo 24.02` | sed 's/-g.*//;s/-/./' | tr -d '\012']), [ejabberd@process-one.net], [ejabberd])
|
||||
REQUIRE_ERLANG_MIN="9.0.5 (Erlang/OTP 20.0)"
|
||||
REQUIRE_ERLANG_MAX="100.0.0 (No Max)"
|
||||
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
|
||||
# Checks for programs.
|
||||
AC_PROG_MAKE_SET
|
||||
AC_PROG_AWK
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_MKDIR_P
|
||||
AC_PROG_SED
|
||||
|
||||
if test "x$GCC" = "xyes"; then
|
||||
|
@ -28,18 +30,42 @@ fi
|
|||
])
|
||||
|
||||
AC_ARG_WITH(rebar,
|
||||
AS_HELP_STRING([--with-rebar=bin],[use the rebar/rebar3/mix binary specified]),
|
||||
AS_HELP_STRING([--with-rebar=bin],[use as build tool the rebar/rebar3/mix binary specified]),
|
||||
[if test "$withval" = "yes" -o "$withval" = "no" -o "X$with_rebar" = "X"; then
|
||||
rebar="rebar"
|
||||
rebar="rebar3"
|
||||
else
|
||||
rebar="$with_rebar"
|
||||
fi
|
||||
], [rebar="rebar"])
|
||||
], [rebar="unconfigured"])
|
||||
|
||||
AC_PATH_TOOL(ERL, erl, , [${extra_erl_path}$PATH])
|
||||
AC_PATH_TOOL(ERLC, erlc, , [${extra_erl_path}$PATH])
|
||||
AC_PATH_TOOL(EPMD, epmd, , [${extra_erl_path}$PATH])
|
||||
|
||||
AC_PATH_TOOL(REBAR, rebar, , [${extra_erl_path}$PATH])
|
||||
AC_PATH_TOOL(REBAR3, rebar3, , [${extra_erl_path}$PATH])
|
||||
AC_PATH_TOOL(ELIXIR, elixir, , [${extra_erl_path}$PATH])
|
||||
AC_PATH_TOOL(IEX, iex, , [${extra_erl_path}$PATH])
|
||||
AC_PATH_TOOL(MIX, mix, , [${extra_erl_path}$PATH])
|
||||
|
||||
if test "$rebar" = unconfigured; then
|
||||
if test "x$ELIXIR" = "x" -o "x$IEX" = "x" -o "x$MIX" = "x"; then
|
||||
if test "x$REBAR3" = "x"; then
|
||||
rebar="rebar3"
|
||||
else
|
||||
rebar=$REBAR3
|
||||
fi
|
||||
else
|
||||
rebar=$MIX
|
||||
fi
|
||||
fi
|
||||
if test "x$rebar" = "xrebar" -a "x$REBAR" = "x" ; then
|
||||
rebar="./rebar"
|
||||
fi
|
||||
if test "x$rebar" = "xrebar3" -a "x$REBAR3" = "x" ; then
|
||||
rebar="./rebar3"
|
||||
fi
|
||||
|
||||
AC_ERLANG_NEED_ERL
|
||||
AC_ERLANG_NEED_ERLC
|
||||
|
||||
|
@ -84,7 +110,7 @@ AC_ARG_ENABLE(debug,
|
|||
esac],[if test "x$debug" = "x"; then debug=true; fi])
|
||||
|
||||
AC_ARG_ENABLE(elixir,
|
||||
[AS_HELP_STRING([--enable-elixir],[enable Elixir support (default: no)])],
|
||||
[AS_HELP_STRING([--enable-elixir],[enable Elixir support in Rebar3 (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) elixir=true ;;
|
||||
no) elixir=false ;;
|
||||
|
@ -112,7 +138,7 @@ esac],[full_xml=false])
|
|||
|
||||
ENABLEGROUP=""
|
||||
AC_ARG_ENABLE(group,
|
||||
[AS_HELP_STRING([--enable-group[[[[=GROUP]]]]], [allow this system group to start ejabberd (default: no)])],
|
||||
[AS_HELP_STRING([--enable-group[[=GROUP]]], [specify the group of the account defined in --enable-user (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) ENABLEGROUP=`groups |head -n 1` ;;
|
||||
no) ENABLEGROUP="" ;;
|
||||
|
@ -237,7 +263,7 @@ AC_ARG_ENABLE(system_deps,
|
|||
esac],[if test "x$system_deps" = "x"; then system_deps=false; fi])
|
||||
|
||||
AC_ARG_ENABLE(tools,
|
||||
[AS_HELP_STRING([--enable-tools],[build development tools (default: no)])],
|
||||
[AS_HELP_STRING([--enable-tools],[include debugging/development tools (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) tools=true ;;
|
||||
no) tools=false ;;
|
||||
|
@ -246,7 +272,7 @@ esac],[if test "x$tools" = "x"; then tools=false; fi])
|
|||
|
||||
ENABLEUSER=""
|
||||
AC_ARG_ENABLE(user,
|
||||
[AS_HELP_STRING([--enable-user[[[[=USER]]]]], [allow this system user to start ejabberd (default: no)])],
|
||||
[AS_HELP_STRING([--enable-user[[=USER]]], [allow this system user to start ejabberd (default: no)])],
|
||||
[case "${enableval}" in
|
||||
yes) ENABLEUSER=`whoami` ;;
|
||||
no) ENABLEUSER="" ;;
|
||||
|
@ -280,6 +306,8 @@ case "`uname`" in
|
|||
;;
|
||||
esac
|
||||
|
||||
AC_MSG_RESULT([build tool to use (change using --with-rebar): $rebar])
|
||||
|
||||
AC_SUBST(roster_gateway_workaround)
|
||||
AC_SUBST(new_sql_schema)
|
||||
AC_SUBST(full_xml)
|
||||
|
@ -305,3 +333,28 @@ AC_SUBST(CPPFLAGS)
|
|||
AC_SUBST(LDFLAGS)
|
||||
|
||||
AC_OUTPUT
|
||||
|
||||
AS_CASE([$rebar],
|
||||
[*rebar3], [
|
||||
deps=""
|
||||
AS_IF([test "x$stun" = "xfalse"], [deps="stun,$deps"])
|
||||
AS_IF([test "x$sqlite" = "xfalse"], [deps="sqlite3,$deps"])
|
||||
AS_IF([test "x$pgsql" = "xfalse"], [deps="p1_pgsql,$deps"])
|
||||
AS_IF([test "x$mysql" = "xfalse"], [deps="p1_mysql,$deps"])
|
||||
AS_IF([test "x$zlib" = "xfalse"], [deps="ezlib,$deps"])
|
||||
AS_IF([test "x$sip" = "xfalse"], [deps="esip,$deps"])
|
||||
AS_IF([test "x$redis" = "xfalse"], [deps="eredis,$deps"])
|
||||
AS_IF([test "x$pam" = "xfalse"], [deps="epam,$deps"])
|
||||
AS_IF([test "x$deps" = "x"], [],
|
||||
[AC_MSG_NOTICE([unlocking disabled rebar3 dependencies: $deps])
|
||||
$rebar unlock "$deps"])
|
||||
deps=""
|
||||
ERLANG_VERSION=m4_esyscmd([erl -noinput -noshell -eval 'erlang:display(list_to_integer(erlang:system_info(otp_release))), halt().'])
|
||||
AS_IF([test "$ERLANG_VERSION" -lt "21"], [deps="luerl,$deps"])
|
||||
AS_IF([test "$ERLANG_VERSION" -lt "22"], [deps="lager,$deps"])
|
||||
AS_IF([test "$ERLANG_VERSION" -le "23"], [deps="jose,$deps"])
|
||||
AS_IF([test "$ERLANG_VERSION" -ge "27"], [deps="jiffy,$deps"])
|
||||
AS_IF([test "x$deps" = "x"], [],
|
||||
[AC_MSG_NOTICE([unlocking rebar3 dependencies for old Erlang/OTP: $deps])
|
||||
$rebar unlock "$deps"])
|
||||
])
|
||||
|
|
795
ejabberd.doap
Normal file
795
ejabberd.doap
Normal file
|
@ -0,0 +1,795 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns="http://usefulinc.com/ns/doap#"
|
||||
xmlns:xmpp="https://linkmauve.fr/ns/xmpp-doap#"
|
||||
xmlns:schema="https://schema.org/">
|
||||
<Project>
|
||||
<name>ejabberd</name>
|
||||
<shortdesc>XMPP Server with MQTT Broker and SIP Service</shortdesc>
|
||||
<description>Robust, Ubiquitous and Massively Scalable Messaging Platform (XMPP Server, MQTT Broker, SIP Service)</description>
|
||||
<created>2002-11-16</created>
|
||||
<os>BSD</os>
|
||||
<os>Linux</os>
|
||||
<os>macOS</os>
|
||||
<os>Windows</os>
|
||||
<programming-langauge>Erlang</programming-langauge>
|
||||
<programming-langauge>C</programming-langauge>
|
||||
<category rdf:resource="https://linkmauve.fr/ns/xmpp-doap#category-jabber"/>
|
||||
<category rdf:resource="https://linkmauve.fr/ns/xmpp-doap#category-server"/>
|
||||
<category rdf:resource="https://linkmauve.fr/ns/xmpp-doap#category-xmpp"/>
|
||||
|
||||
<homepage rdf:resource="https://www.ejabberd.im"/>
|
||||
<download-page rdf:resource="https://www.process-one.net/en/ejabberd/downloads/"/>
|
||||
<download-mirror rdf:resource="https://github.com/processone/ejabberd/tags"/>
|
||||
<license rdf:resource="https://raw.githubusercontent.com/processone/ejabberd/master/COPYING"/>
|
||||
<schema:logo rdf:resource="https://docs.ejabberd.im/assets/img/footer_logo_e@2x.png"/>
|
||||
<bug-database rdf:resource="https://github.com/processone/ejabberd/issues"/>
|
||||
<support-forum rdf:resource="xmpp:ejabberd@conference.process-one.net?join"/>
|
||||
<repository>
|
||||
<GitRepository>
|
||||
<location rdf:resource="https://github.com/processone/ejabberd.git"/>
|
||||
<browse rdf:resource="https://github.com/processone/ejabberd"/>
|
||||
</GitRepository>
|
||||
</repository>
|
||||
|
||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc3261"/>
|
||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc3920"/>
|
||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc3921"/>
|
||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc5766"/>
|
||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc5802"/>
|
||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc6120"/>
|
||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc6121"/>
|
||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc6122"/>
|
||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc6455"/>
|
||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc7395"/>
|
||||
<implements rdf:resource="https://www.rfc-editor.org/info/rfc7590"/>
|
||||
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0004.html"/>
|
||||
<xmpp:version>2.9</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0012.html"/>
|
||||
<xmpp:version>2.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_last</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0013.html"/>
|
||||
<xmpp:version>1.2</xmpp:version>
|
||||
<xmpp:since>16.02</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_offline</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0016.html"/>
|
||||
<xmpp:version>1.6</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_privacy</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0022.html"/>
|
||||
<xmpp:version>1.4</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_offline</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0023.html"/>
|
||||
<xmpp:version>1.3</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_offline</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0030.html"/>
|
||||
<xmpp:version>2.4</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_disco</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0033.html"/>
|
||||
<xmpp:version>1.1</xmpp:version>
|
||||
<xmpp:since>15.04</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_multicast</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0039.html"/>
|
||||
<xmpp:version>0.6.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_stats</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0045.html"/>
|
||||
<xmpp:version>1.25</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_muc</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0049.html"/>
|
||||
<xmpp:version>1.2</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_private</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0050.html"/>
|
||||
<xmpp:version>1.2</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_adhoc</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0054.html"/>
|
||||
<xmpp:version>1.2</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_vcard</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0055.html"/>
|
||||
<xmpp:version>1.3</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_vcard</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0059.html"/>
|
||||
<xmpp:version>1.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0060.html"/>
|
||||
<xmpp:version>1.14</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_pubsub</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0065.html"/>
|
||||
<xmpp:version>1.8</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_proxy65</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0077.html"/>
|
||||
<xmpp:version>2.4</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_register</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0078.html"/>
|
||||
<xmpp:version>2.5</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_legacy_auth</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0085.html"/>
|
||||
<xmpp:version>2.1</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_client_state</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0086.html"/>
|
||||
<xmpp:version>1.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0092.html"/>
|
||||
<xmpp:version>1.1</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_version</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0106.html"/>
|
||||
<xmpp:version>1.1</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0114.html"/>
|
||||
<xmpp:version>1.6</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>ejabberd_service</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0115.html"/>
|
||||
<xmpp:version>1.5</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_caps</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0124.html"/>
|
||||
<xmpp:version>1.11</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>ejabberd_bosh</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0133.html"/>
|
||||
<xmpp:version>1.3.0</xmpp:version>
|
||||
<xmpp:since>13.10</xmpp:since>
|
||||
<xmpp:status>complete</xmpp:status>
|
||||
<xmpp:note>mod_configure</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0138.html"/>
|
||||
<xmpp:version>2.1</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>ejabberd_c2s</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0153.html"/>
|
||||
<xmpp:version>1.1</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_vcard</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0156.html"/>
|
||||
<xmpp:version>1.4.0</xmpp:version>
|
||||
<xmpp:since>22.05</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_host_meta</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0157.html"/>
|
||||
<xmpp:version>1.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_disco</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0158.html"/>
|
||||
<xmpp:version>1.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>ejabberd_captcha</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0160.html"/>
|
||||
<xmpp:version>1.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_offline</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0163.html"/>
|
||||
<xmpp:version>1.2</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_pubsub</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0170.html"/>
|
||||
<xmpp:version>1.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0175.html"/>
|
||||
<xmpp:version>1.2</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>ejabberd_auth_anonymous</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0176.html"/>
|
||||
<xmpp:version>1.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>ejabberd_stun</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0185.html"/>
|
||||
<xmpp:version>1.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_s2s_dialback</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0191.html"/>
|
||||
<xmpp:version>1.2</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_blocking</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0198.html"/>
|
||||
<xmpp:version>1.5.2</xmpp:version>
|
||||
<xmpp:since>14.05</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_stream_mgmt</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0199.html"/>
|
||||
<xmpp:version>2.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_ping</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0202.html"/>
|
||||
<xmpp:version>2.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_time</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0203.html"/>
|
||||
<xmpp:version>2.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_offline</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0205.html"/>
|
||||
<xmpp:version>1.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0206.html"/>
|
||||
<xmpp:version>1.4</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>ejabberd_bosh</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0212.html"/>
|
||||
<xmpp:version>1.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0215.html"/>
|
||||
<xmpp:version>0.7</xmpp:version>
|
||||
<xmpp:since>20.04</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_stun_disco</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0216.html"/>
|
||||
<xmpp:version>1.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0220.html"/>
|
||||
<xmpp:version>1.1</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>ejabberd_s2s, mod_s2s_dialback</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0227.html"/>
|
||||
<xmpp:version>1.1</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>ejabberd_piefxis</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0231.html"/>
|
||||
<xmpp:version>1.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>ejabberd_captcha</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0237.html"/>
|
||||
<xmpp:version>1.3</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_roster</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0243.html"/>
|
||||
<xmpp:version>1.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0248.html"/>
|
||||
<xmpp:version>0.2</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_pubsub</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0249.html"/>
|
||||
<xmpp:version>1.2</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_muc</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0270.html"/>
|
||||
<xmpp:version>1.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0279.html"/>
|
||||
<xmpp:version>0.2</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_sic</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0280.html"/>
|
||||
<xmpp:version>0.13.2</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_carboncopy</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0313.html"/>
|
||||
<xmpp:version>0.6.1</xmpp:version>
|
||||
<xmpp:since>15.06</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_mam</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0317.html"/>
|
||||
<xmpp:version>0.1</xmpp:version>
|
||||
<xmpp:since>21.12</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_muc_room, conversejs/prosody compatible</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0328.html"/>
|
||||
<xmpp:version>0.1</xmpp:version>
|
||||
<xmpp:since>19.09</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_jidprep</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0334.html"/>
|
||||
<xmpp:version>0.2</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_mam, mod_muc_log, mod_offline</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0352.html"/>
|
||||
<xmpp:version>0.1</xmpp:version>
|
||||
<xmpp:since>14.12</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_client_state</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0355.html"/>
|
||||
<xmpp:version>0.4.1</xmpp:version>
|
||||
<xmpp:since>16.09</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_delegation</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0356.html"/>
|
||||
<xmpp:version>0.2.1</xmpp:version>
|
||||
<xmpp:since>16.09</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_privilege</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0357.html"/>
|
||||
<xmpp:version>0.2</xmpp:version>
|
||||
<xmpp:since>17.08</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_push</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0359.html"/>
|
||||
<xmpp:version>0.5.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_mam</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0363.html"/>
|
||||
<xmpp:version>0.2</xmpp:version>
|
||||
<xmpp:since>15.10</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_http_upload</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0368.html"/>
|
||||
<xmpp:version>1.1.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0369.html"/>
|
||||
<xmpp:version>0.14.1</xmpp:version>
|
||||
<xmpp:since>16.03</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_mix</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0386.html"/>
|
||||
<xmpp:version>0.3.0</xmpp:version>
|
||||
<xmpp:since>24.02</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0388.html"/>
|
||||
<xmpp:version>0.4.0</xmpp:version>
|
||||
<xmpp:since>24.02</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0398.html"/>
|
||||
<xmpp:version>0.2.0</xmpp:version>
|
||||
<xmpp:since>18.03</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_avatar</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0402.html"/>
|
||||
<xmpp:version>1.1.3</xmpp:version>
|
||||
<xmpp:since>23.10</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_private</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0405.html"/>
|
||||
<xmpp:version>0.3.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_mix_pam</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0410.html"/>
|
||||
<xmpp:version>1.1.0</xmpp:version>
|
||||
<xmpp:since>18.12</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_muc_room</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0411.html"/>
|
||||
<xmpp:version>0.2.0</xmpp:version>
|
||||
<xmpp:since>18.12</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_private</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0421.html"/>
|
||||
<xmpp:version>0.1.0</xmpp:version>
|
||||
<xmpp:since>23.10</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_muc_occupantid</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0424.html"/>
|
||||
<xmpp:version>0.4.0</xmpp:version>
|
||||
<xmpp:since>24.02</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0425.html"/>
|
||||
<xmpp:version>0.2.1</xmpp:version>
|
||||
<xmpp:since>23.04</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_mam</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0440.html"/>
|
||||
<xmpp:version>0.4.0</xmpp:version>
|
||||
<xmpp:since>24.02</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0441.html"/>
|
||||
<xmpp:version>0.2.0</xmpp:version>
|
||||
<xmpp:since></xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note>mod_mam</xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
<implements>
|
||||
<xmpp:SupportedXep>
|
||||
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0474.html"/>
|
||||
<xmpp:version>0.3.0</xmpp:version>
|
||||
<xmpp:since>24.02</xmpp:since>
|
||||
<xmpp:status></xmpp:status>
|
||||
<xmpp:note></xmpp:note>
|
||||
</xmpp:SupportedXep>
|
||||
</implements>
|
||||
</Project>
|
||||
</rdf:RDF>
|
|
@ -36,17 +36,17 @@ listen:
|
|||
-
|
||||
port: 5223
|
||||
ip: "::"
|
||||
tls: true
|
||||
module: ejabberd_c2s
|
||||
max_stanza_size: 262144
|
||||
shaper: c2s_shaper
|
||||
access: c2s
|
||||
starttls_required: true
|
||||
tls: true
|
||||
-
|
||||
port: 5269
|
||||
ip: "::"
|
||||
module: ejabberd_s2s_in
|
||||
max_stanza_size: 524288
|
||||
shaper: s2s_shaper
|
||||
-
|
||||
port: 5443
|
||||
ip: "::"
|
||||
|
|
|
@ -108,10 +108,11 @@
|
|||
#.
|
||||
#' ERL_OPTIONS: Additional Erlang options
|
||||
#
|
||||
# The next variable allows to specify additional options passed to erlang while
|
||||
# starting ejabberd. Some useful options are -noshell, -detached, -heart. When
|
||||
# ejabberd is started from an init.d script options -noshell and -detached are
|
||||
# added implicitly. See erl(1) for more info.
|
||||
# The next variable allows to specify additional options passed to
|
||||
# all commands using erlang interpreter. This applies to starting
|
||||
# ejabberd server itself but also auxiliary commands like for example
|
||||
# starting debug shell. See erl(1) for list of commands that can be
|
||||
# used here.
|
||||
#
|
||||
# It might be useful to add "-pa /usr/local/lib/ejabberd/ebin" if you
|
||||
# want to add local modules in this path.
|
||||
|
@ -120,6 +121,20 @@
|
|||
#
|
||||
#ERL_OPTIONS=""
|
||||
|
||||
#.
|
||||
#' EJABBERD_OPTS: Additional Erlang options to start ejabberd
|
||||
#
|
||||
# The next variable allows to specify additional options passed to erlang while
|
||||
# starting ejabberd. Some useful options are -noshell, -detached, -heart. When
|
||||
# ejabberd is started from an init.d script options -noshell and -detached are
|
||||
# added implicitly. See erl(1) for more info.
|
||||
#
|
||||
# For example you can use value "-heart -env HEART_BEAT_TIMEOUT 120 -env ERL_CRASH_DUMP_SECONDS 60"
|
||||
#
|
||||
# Default: ""
|
||||
#
|
||||
#EJABBERD_OPTS=""
|
||||
|
||||
#.
|
||||
#' ERLANG_NODE: Erlang node name
|
||||
#
|
||||
|
|
|
@ -15,8 +15,8 @@ SCRIPT_DIR="$(cd "$(dirname "$SCRIPT")" && pwd -P)"
|
|||
# shellcheck disable=SC2034
|
||||
ERTS_VSN="{{erts_vsn}}"
|
||||
ERL="{{erl}}"
|
||||
IEX="{{bindir}}/iex"
|
||||
EPMD="{{epmd}}"
|
||||
IEX="{{iexpath}}"
|
||||
INSTALLUSER="{{installuser}}"
|
||||
|
||||
# check the proper system user is used
|
||||
|
@ -76,8 +76,11 @@ if [ -n "$FIREWALL_WINDOW" ] ; then
|
|||
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_listen_min ${FIREWALL_WINDOW%-*} inet_dist_listen_max ${FIREWALL_WINDOW#*-}"
|
||||
fi
|
||||
if [ -n "$INET_DIST_INTERFACE" ] ; then
|
||||
INET_DIST_INTERFACE2=$("$ERL" -noshell -eval 'case inet:parse_address("'$INET_DIST_INTERFACE'") of {ok,IP} -> io:format("~p",[IP]); _ -> ok end.' -s erlang halt)
|
||||
INET_DIST_INTERFACE2=$("$ERL" $ERLANG_OPTS -noshell -eval 'case inet:parse_address("'$INET_DIST_INTERFACE'") of {ok,IP} -> io:format("~p",[IP]); _ -> ok end.' -s erlang halt)
|
||||
if [ -n "$INET_DIST_INTERFACE2" ] ; then
|
||||
if [ "$(echo "$INET_DIST_INTERFACE2" | grep -o "," | wc -l)" -eq 7 ] ; then
|
||||
INET_DIST_INTERFACE2="$INET_DIST_INTERFACE2 -proto_dist inet6_tcp"
|
||||
fi
|
||||
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_use_interface $INET_DIST_INTERFACE2"
|
||||
fi
|
||||
fi
|
||||
|
@ -89,11 +92,12 @@ ERL_CRASH_DUMP="$LOGS_DIR"/erl_crash_$(date "+%Y%m%d-%H%M%S").dump
|
|||
ERL_INETRC="$CONFIG_DIR"/inetrc
|
||||
|
||||
# define ejabberd parameters
|
||||
EJABBERD_OPTS="$EJABBERD_OPTS\
|
||||
EJABBERD_OPTS="\
|
||||
$(sed '/^log_rotate_size/!d;s/:[ \t]*\([0-9]\{1,\}\).*/ \1/;s/:[ \t]*\(infinity\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
|
||||
$(sed '/^log_rotate_count/!d;s/:[ \t]*\([0-9]*\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
|
||||
$(sed '/^log_burst_limit_count/!d;s/:[ \t]*\([0-9]*\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
|
||||
$(sed '/^log_burst_limit_window_time/!d;s/:[ \t]*\([0-9]*[a-z]*\).*/ \1/;s/^/ /' "$EJABBERD_CONFIG_PATH")"
|
||||
$(sed '/^log_burst_limit_window_time/!d;s/:[ \t]*\([0-9]*[a-z]*\).*/ \1 /;s/^/ /' "$EJABBERD_CONFIG_PATH")\
|
||||
$EJABBERD_OPTS"
|
||||
[ -n "$EJABBERD_OPTS" ] && EJABBERD_OPTS="-ejabberd $EJABBERD_OPTS"
|
||||
EJABBERD_OPTS="-mnesia dir \"$SPOOL_DIR\" $MNESIA_OPTIONS $EJABBERD_OPTS -s ejabberd"
|
||||
|
||||
|
@ -121,7 +125,7 @@ set_dist_client()
|
|||
exec_cmd()
|
||||
{
|
||||
case $EXEC_CMD in
|
||||
as_install_user) su -s /bin/sh -c '"$0" "$@"' "$INSTALLUSER" -- "$@" ;;
|
||||
as_install_user) su -s /bin/sh -c 'exec "$0" "$@"' "$INSTALLUSER" -- "$@" ;;
|
||||
as_current_user) "$@" ;;
|
||||
esac
|
||||
}
|
||||
|
@ -149,9 +153,11 @@ debugwarning()
|
|||
echo "Please be extremely cautious with your actions,"
|
||||
echo "and exit immediately if you are not completely sure."
|
||||
echo ""
|
||||
echo "To detach this shell from ejabberd, press:"
|
||||
echo " control+c, control+c"
|
||||
echo "To exit and detach this shell from ejabberd, press:"
|
||||
echo " control+g and then q"
|
||||
echo ""
|
||||
#vt100 echo "Please do NOT use control+c in this debug shell !"
|
||||
#vt100 echo ""
|
||||
echo "--------------------------------------------------------------------"
|
||||
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
||||
echo " EJABBERD_BYPASS_WARNINGS=true"
|
||||
|
@ -172,8 +178,8 @@ livewarning()
|
|||
echo "Please be extremely cautious with your actions,"
|
||||
echo "and exit immediately if you are not completely sure."
|
||||
echo ""
|
||||
echo "To exit this LIVE mode and stop ejabberd, press:"
|
||||
echo " q(). and press the Enter key"
|
||||
echo "To exit and detach this shell from ejabberd, press:"
|
||||
echo " control+g and then q"
|
||||
echo ""
|
||||
echo "--------------------------------------------------------------------"
|
||||
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
||||
|
@ -184,6 +190,39 @@ livewarning()
|
|||
fi
|
||||
}
|
||||
|
||||
check_etop_result()
|
||||
{
|
||||
result=$?
|
||||
if [ $result -eq 1 ] ; then
|
||||
echo ""
|
||||
echo "It seems there was some problem running 'ejabberdctl etop'."
|
||||
echo "Is the error message something like this?"
|
||||
echo " Failed to load module 'etop' because it cannot be found..."
|
||||
echo "Then probably ejabberd was compiled with development tools disabled."
|
||||
echo "To use 'etop', recompile ejabberd with: ./configure --enable-tools"
|
||||
echo ""
|
||||
exit $result
|
||||
fi
|
||||
}
|
||||
|
||||
check_iex_result()
|
||||
{
|
||||
result=$?
|
||||
if [ $result -eq 127 ] ; then
|
||||
echo ""
|
||||
echo "It seems there was some problem finding 'iex' binary from Elixir."
|
||||
echo "Probably ejabberd was compiled with Rebar3 and Elixir disabled, like:"
|
||||
echo " ./configure"
|
||||
echo "which is equivalent to:"
|
||||
echo " ./configure --with-rebar=rebar3 --disable-elixir"
|
||||
echo "To use 'iex', recompile ejabberd enabling Elixir or using Mix:"
|
||||
echo " ./configure --enable-elixir"
|
||||
echo " ./configure --with-rebar=mix"
|
||||
echo ""
|
||||
exit $result
|
||||
fi
|
||||
}
|
||||
|
||||
help()
|
||||
{
|
||||
echo ""
|
||||
|
@ -212,16 +251,30 @@ help()
|
|||
}
|
||||
|
||||
# dynamic node name helper
|
||||
uid()
|
||||
{
|
||||
uuid=$(uuidgen 2>/dev/null)
|
||||
random=$(awk 'BEGIN { srand(); print int(rand()*32768) }' /dev/null)
|
||||
[ -z "$uuid" ] && [ -f /proc/sys/kernel/random/uuid ] && uuid=$(cat /proc/sys/kernel/random/uuid)
|
||||
[ -z "$uuid" ] && uuid=$(printf "%X" "${random:-$$}$(date +%M%S)")
|
||||
uuid=$(printf '%s' $uuid | sed 's/^\(...\).*$/\1/')
|
||||
[ $# -eq 0 ] && echo "${uuid}-${ERLANG_NODE}"
|
||||
[ $# -eq 1 ] && echo "${uuid}-${1}-${ERLANG_NODE}"
|
||||
[ $# -eq 2 ] && echo "${uuid}-${1}@${2}"
|
||||
uid() {
|
||||
ERTSVERSION="$("$ERL" -version 2>&1 | sed 's|.*\([0-9][0-9]\).*|\1|g')"
|
||||
if [ $ERTSVERSION -lt 11 ] ; then # otp 23.0 includes erts 11.0
|
||||
# Erlang/OTP lower than 23, which doesn's support dynamic node code
|
||||
N=1
|
||||
PF=$(( $$ % 97 ))
|
||||
while
|
||||
case $# in
|
||||
0) NN="${PF}-${N}-${ERLANG_NODE}"
|
||||
;;
|
||||
1) NN="${PF}-${N}-${1}-${ERLANG_NODE}"
|
||||
;;
|
||||
2) NN="${PF}-${N}-${1}@${2}"
|
||||
;;
|
||||
esac
|
||||
N=$(( N + 1 + ( $$ % 5 ) ))
|
||||
"$EPMD" -names 2>/dev/null | grep -q " ${NN%@*} "
|
||||
do :; done
|
||||
echo $NN
|
||||
else
|
||||
# Erlang/OTP 23 or higher: use native dynamic node code
|
||||
# https://www.erlang.org/patches/otp-23.0#OTP-13812
|
||||
echo undefined
|
||||
fi
|
||||
}
|
||||
|
||||
# stop epmd if there is no other running node
|
||||
|
@ -264,7 +317,9 @@ wait_status()
|
|||
if [ $timeout -eq 0 ] ; then
|
||||
status="$1"
|
||||
else
|
||||
exec_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \
|
||||
exec_erl "$(uid ctl)" -hidden -noinput \
|
||||
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
|
||||
-s ejabberd_ctl \
|
||||
-extra "$ERLANG_NODE" $NO_TIMEOUT status > /dev/null
|
||||
status="$?"
|
||||
fi
|
||||
|
@ -305,24 +360,29 @@ case $1 in
|
|||
;;
|
||||
etop)
|
||||
set_dist_client
|
||||
exec_erl "$(uid top)" -hidden -node "$ERLANG_NODE" -s etop \
|
||||
-s erlang halt -output text
|
||||
exec_erl "$(uid top)" -hidden -remsh "$ERLANG_NODE" -s etop \
|
||||
-output text
|
||||
check_etop_result
|
||||
;;
|
||||
iexdebug)
|
||||
debugwarning
|
||||
set_dist_client
|
||||
exec_iex "$(uid debug)" --remsh "$ERLANG_NODE"
|
||||
check_iex_result
|
||||
;;
|
||||
iexlive)
|
||||
livewarning
|
||||
exec_iex "$ERLANG_NODE" --erl "$EJABBERD_OPTS" --app ejabberd
|
||||
exec_iex "$ERLANG_NODE" --erl "$EJABBERD_OPTS"
|
||||
check_iex_result
|
||||
;;
|
||||
ping)
|
||||
PEER=${2:-$ERLANG_NODE}
|
||||
[ "$PEER" = "${PEER%.*}" ] && PS="-s"
|
||||
set_dist_client
|
||||
exec_cmd "$ERL" ${PS:--}name "$(uid ping "$(hostname $PS)")" $ERLANG_OPTS \
|
||||
-noinput -hidden -eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \
|
||||
-noinput -hidden \
|
||||
-eval 'net_kernel:connect_node('"'$PEER'"')' \
|
||||
-eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \
|
||||
-s erlang halt -output text
|
||||
;;
|
||||
started)
|
||||
|
@ -335,7 +395,9 @@ case $1 in
|
|||
;;
|
||||
*)
|
||||
set_dist_client
|
||||
exec_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \
|
||||
exec_erl "$(uid ctl)" -hidden -noinput \
|
||||
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
|
||||
-s ejabberd_ctl \
|
||||
-extra "$ERLANG_NODE" $NO_TIMEOUT "$@"
|
||||
result=$?
|
||||
case $result in
|
||||
|
|
42
elvis.config
Normal file
42
elvis.config
Normal file
|
@ -0,0 +1,42 @@
|
|||
[
|
||||
{
|
||||
elvis,
|
||||
[
|
||||
{config,
|
||||
[#{dirs => ["src"],
|
||||
filter => "*.erl",
|
||||
ruleset => erl_files,
|
||||
rules => [{elvis_style, line_length, #{limit => 100,
|
||||
skip_comments => false}},
|
||||
{elvis_text_style, no_tabs, disable},
|
||||
{elvis_style, no_debug_call, disable},
|
||||
{elvis_style, operator_spaces, disable},
|
||||
{elvis_style, invalid_dynamic_call, disable},
|
||||
{elvis_style, variable_naming_convention, #{ regex => ".*" }},
|
||||
{elvis_style, dont_repeat_yourself, #{min_complexity => 20}}
|
||||
]
|
||||
},
|
||||
#{dirs => ["."],
|
||||
filter => "Makefile.in",
|
||||
ruleset => makefiles,
|
||||
rules => [{elvis_style, line_length, #{limit => 100,
|
||||
skip_comments => false}},
|
||||
{elvis_style, no_tabs, disable},
|
||||
{elvis_style, dont_repeat_yourself, #{min_complexity => 20}}
|
||||
]
|
||||
},
|
||||
#{dirs => ["."],
|
||||
filter => "rebar.config",
|
||||
ruleset => rebar_config,
|
||||
rules => [{elvis_style, line_length, #{limit => 100,
|
||||
skip_comments => false}},
|
||||
{elvis_style, no_tabs, disable},
|
||||
{elvis_style, dont_repeat_yourself, #{min_complexity => 20}}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
].
|
32
erlang_ls.config
Normal file
32
erlang_ls.config
Normal file
|
@ -0,0 +1,32 @@
|
|||
otp_path: "/usr/lib/erlang"
|
||||
plt_path: "_build/default/rebar3_24.3.3_plt"
|
||||
#code_reload:
|
||||
# node: ejabberd@localhost
|
||||
apps_dirs:
|
||||
- "_build/default/lib/*"
|
||||
deps_dirs:
|
||||
- "_build/default/lib/*"
|
||||
include_dirs:
|
||||
- "_build/default/lib"
|
||||
- "_build/default/lib/*/include"
|
||||
- "include"
|
||||
macros:
|
||||
- name: DEPRECATED_GET_STACKTRACE
|
||||
- name: HAVE_ERL_ERROR
|
||||
- name: HAVE_URI_STRING
|
||||
- name: OTP_BELOW_25
|
||||
- name: SIP
|
||||
- name: STUN
|
||||
diagnostics:
|
||||
# enabled:
|
||||
# - crossref
|
||||
disabled:
|
||||
# - dialyzer
|
||||
- unused_includes # Otherwise it complains about unused logger.hrl
|
||||
lenses:
|
||||
disabled:
|
||||
- ct-run-test
|
||||
- function-references
|
||||
- server-info
|
||||
- show-behaviour-usages
|
||||
- suggest-spec
|
|
@ -1,66 +0,0 @@
|
|||
#!/usr/bin/perl
|
||||
|
||||
use Unix::Syslog qw(:macros :subs);
|
||||
|
||||
my $domain = $ARGV[0] || "example.com";
|
||||
|
||||
while(1)
|
||||
{
|
||||
# my $rin = '',$rout;
|
||||
# vec($rin,fileno(STDIN),1) = 1;
|
||||
# $ein = $rin;
|
||||
# my $nfound = select($rout=$rin,undef,undef,undef);
|
||||
|
||||
my $buf = "";
|
||||
syslog LOG_INFO,"waiting for packet";
|
||||
my $nread = sysread STDIN,$buf,2;
|
||||
do { syslog LOG_INFO,"port closed"; exit; } unless $nread == 2;
|
||||
my $len = unpack "n",$buf;
|
||||
my $nread = sysread STDIN,$buf,$len;
|
||||
|
||||
my ($op,$user,$host,$password) = split /:/,$buf;
|
||||
#$user =~ s/\./\//og;
|
||||
my $jid = "$user\@$domain";
|
||||
my $result;
|
||||
|
||||
syslog(LOG_INFO,"request (%s)", $op);
|
||||
|
||||
SWITCH:
|
||||
{
|
||||
$op eq 'auth' and do
|
||||
{
|
||||
$result = 1;
|
||||
},last SWITCH;
|
||||
|
||||
$op eq 'setpass' and do
|
||||
{
|
||||
$result = 1;
|
||||
},last SWITCH;
|
||||
|
||||
$op eq 'isuser' and do
|
||||
{
|
||||
# password is null. Return 1 if the user $user\@$domain exitst.
|
||||
$result = 1;
|
||||
},last SWITCH;
|
||||
|
||||
$op eq 'tryregister' and do
|
||||
{
|
||||
$result = 1;
|
||||
},last SWITCH;
|
||||
|
||||
$op eq 'removeuser' and do
|
||||
{
|
||||
# password is null. Return 1 if the user $user\@$domain exitst.
|
||||
$result = 1;
|
||||
},last SWITCH;
|
||||
|
||||
$op eq 'removeuser3' and do
|
||||
{
|
||||
$result = 1;
|
||||
},last SWITCH;
|
||||
};
|
||||
my $out = pack "nn",2,$result ? 1 : 0;
|
||||
syswrite STDOUT,$out;
|
||||
}
|
||||
|
||||
closelog;
|
|
@ -1,75 +0,0 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# PROVIDE: ejabberd
|
||||
# REQUIRE: DAEMON
|
||||
# KEYWORD: shutdown
|
||||
#
|
||||
|
||||
HOME=/usr/pkg/jabber D=/usr/pkg/jabber/ejabberd export HOME
|
||||
|
||||
name="ejabberd"
|
||||
rcvar=$name
|
||||
|
||||
if [ -r /etc/rc.conf ]
|
||||
then
|
||||
. /etc/rc.conf
|
||||
else
|
||||
eval ${rcvar}=YES
|
||||
fi
|
||||
|
||||
# $flags from environment overrides ${rcvar}_flags
|
||||
if [ -n "${flags}" ]
|
||||
then
|
||||
eval ${rcvar}_flags="${flags}"
|
||||
fi
|
||||
|
||||
checkyesno()
|
||||
{
|
||||
eval _value=\$${1}
|
||||
case $_value in
|
||||
[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) return 0 ;;
|
||||
[Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0) return 1 ;;
|
||||
*)
|
||||
echo "\$${1} is not set properly."
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
cmd=${1:-start}
|
||||
case ${cmd} in
|
||||
force*)
|
||||
cmd=${cmd#force}
|
||||
eval ${rcvar}=YES
|
||||
;;
|
||||
esac
|
||||
|
||||
if checkyesno ${rcvar}
|
||||
then
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
|
||||
case ${cmd} in
|
||||
start)
|
||||
if [ -x $D/src ]; then
|
||||
echo "Starting ${name}."
|
||||
cd $D/src
|
||||
ERL_MAX_PORTS=32000 export ERL_MAX_PORTS
|
||||
ulimit -n $ERL_MAX_PORTS
|
||||
su jabber -c "/usr/pkg/bin/erl -sname ejabberd -s ejabberd -heart -detached -sasl sasl_error_logger '{file, \"ejabberd-sasl.log\"}' &" \
|
||||
1>/dev/null 2>&1
|
||||
fi
|
||||
;;
|
||||
stop)
|
||||
echo "rpc:call('ejabberd@`hostname -s`', init, stop, [])." | \
|
||||
su jabber -c "/usr/pkg/bin/erl -sname ejabberdstop"
|
||||
;;
|
||||
restart)
|
||||
echo "rpc:call('ejabberd@`hostname -s`', init, restart, [])." | \
|
||||
su jabber -c "/usr/pkg/bin/erl -sname ejabberdrestart"
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $0 {start|stop|restart}"
|
||||
exit 1
|
||||
esac
|
|
@ -1,81 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
echo '1. fetch, compile, and install erlang'
|
||||
|
||||
if [ ! pkg_info erlang 1>/dev/null 2>&1 ]; then
|
||||
cd /usr/pkgsrc/lang/erlang
|
||||
make fetch-list|sh
|
||||
make
|
||||
make install
|
||||
fi
|
||||
if pkg_info erlang | grep -q erlang-9.1nb1; then
|
||||
else
|
||||
echo "erlang-9.1nb1 not installed" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
echo '2. install crypt_drv.so'
|
||||
|
||||
if [ ! -d /usr/pkg/lib/erlang/lib/crypto-1.1.2.1/priv/lib ] ; then
|
||||
mkdir -p /usr/pkg/lib/erlang/lib/crypto-1.1.2.1/priv/lib
|
||||
fi
|
||||
if [ ! -f /usr/pkg/lib/erlang/lib/crypto-1.1.2.1/priv/lib/crypto_drv.so ]; then
|
||||
cp work/otp*/lib/crypto/priv/*/*/crypto_drv.so \
|
||||
/usr/pkg/lib/erlang/lib/crypto-1.1.2.1/priv/lib
|
||||
fi
|
||||
|
||||
|
||||
echo '3. compile and install elibcrypto.so'
|
||||
|
||||
if [ ! -f /usr/pkg/lib/erlang/lib/crypto-1.1.2.1/priv/lib/elibcrypto.so ]; then
|
||||
cd /usr/pkgsrc/lang/erlang/work/otp_src_R9B-1/lib/crypto/c_src
|
||||
ld -r -u CRYPTO_set_mem_functions -u MD5 -u MD5_Init -u MD5_Update \
|
||||
-u MD5_Final -u SHA1 -u SHA1_Init -u SHA1_Update -u SHA1_Final \
|
||||
-u des_set_key -u des_ncbc_encrypt -u des_ede3_cbc_encrypt \
|
||||
-L/usr/lib -lcrypto -o ../priv/obj/i386--netbsdelf/elibcrypto.o
|
||||
cc -shared \
|
||||
-L/usr/pkgsrc/lang/erlang/work/otp_src_R9B-1/lib/erl_interface/obj/i386--netbsdelf \
|
||||
-o ../priv/obj/i386--netbsdelf/elibcrypto.so \
|
||||
../priv/obj/i386--netbsdelf/elibcrypto.o -L/usr/lib -lcrypto
|
||||
cp ../priv/obj/i386--netbsdelf/elibcrypto.so \
|
||||
/usr/pkg/lib/erlang/lib/crypto-1.1.2.1/priv/lib
|
||||
fi
|
||||
|
||||
|
||||
echo '4. compile and install ssl_esock'
|
||||
|
||||
if [ ! -f /usr/pkg/lib/erlang/lib/ssl-2.3.5/priv/bin/ssl_esock ]; then
|
||||
cd /usr/pkg/lib/erlang/lib/ssl-2.3.5/priv/obj/
|
||||
make
|
||||
fi
|
||||
|
||||
|
||||
echo '5. initial ejabberd configuration'
|
||||
|
||||
cd /usr/pkg/jabber/ejabberd/src
|
||||
./configure
|
||||
|
||||
|
||||
echo '6. edit ejabberd Makefiles'
|
||||
|
||||
for M in Makefile mod_*/Makefile; do
|
||||
if [ ! -f $M.orig ]; then
|
||||
mv $M $M.orig
|
||||
sed -e s%/usr/local%/usr/pkg%g < $M.orig > $M
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
echo '7. compile ejabberd'
|
||||
|
||||
gmake
|
||||
for A in mod_muc mod_pubsub; do
|
||||
(cd $A; gmake)
|
||||
done
|
||||
|
||||
|
||||
echo ''
|
||||
echo 'now edit ejabberd.cfg'
|
||||
echo ''
|
||||
echo 'to start ejabberd: erl -sname ejabberd -s ejabberd'
|
|
@ -1,65 +0,0 @@
|
|||
% jabber.dbc.mtview.ca.us
|
||||
|
||||
override_acls.
|
||||
|
||||
{acl, admin, {user, "mrose", "jabber.dbc.mtview.ca.us"}}.
|
||||
|
||||
|
||||
{access, announce, [{allow, admin},
|
||||
{deny, all}]}.
|
||||
{access, c2s, [{deny, blocked},
|
||||
{allow, all}]}.
|
||||
{access, c2s_shaper, [{none, admin},
|
||||
{normal, all}]}.
|
||||
{access, configure, [{allow, admin},
|
||||
{deny, all}]}.
|
||||
{access, disco_admin, [{allow, admin},
|
||||
{deny, all}]}.
|
||||
{access, muc_admin, [{allow, admin},
|
||||
{deny, all}]}.
|
||||
{access, register, [{deny, all}]}.
|
||||
{access, s2s_shaper, [{fast, all}]}.
|
||||
|
||||
|
||||
{auth_method, internal}.
|
||||
{host, "jabber.dbc.mtview.ca.us"}.
|
||||
{outgoing_s2s_port, 5269}.
|
||||
{shaper, normal, {maxrate, 1000}}.
|
||||
{shaper, fast, {maxrate, 50000}}.
|
||||
{welcome_message, none}.
|
||||
|
||||
|
||||
{listen, [{5222, ejabberd_c2s,
|
||||
[{access, c2s},
|
||||
{shaper, c2s_shaper}]},
|
||||
{5223, ejabberd_c2s,
|
||||
[{access, c2s},
|
||||
{shaper, c2s_shaper},
|
||||
{ssl, [{certfile, "/etc/openssl/certs/ejabberd.pem"}]}]},
|
||||
{5269, ejabberd_s2s_in,
|
||||
[{shaper, s2s_shaper}]}]}.
|
||||
|
||||
|
||||
{modules, [
|
||||
{mod_register, []},
|
||||
{mod_roster, []},
|
||||
{mod_privacy, []},
|
||||
{mod_configure, []},
|
||||
{mod_disco, []},
|
||||
{mod_stats, []},
|
||||
{mod_vcard, []},
|
||||
{mod_offline, []},
|
||||
{mod_echo, [{host, "echo.jabber.dbc.mtview.ca.us"}]},
|
||||
{mod_private, []},
|
||||
{mod_muc, []},
|
||||
{mod_pubsub, []},
|
||||
{mod_time, []},
|
||||
{mod_last, []},
|
||||
{mod_version, []}
|
||||
]}.
|
||||
|
||||
|
||||
|
||||
% Local Variables:
|
||||
% mode: erlang
|
||||
% End:
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
@ -67,42 +67,24 @@
|
|||
args_example = none :: none | [any()] | '_',
|
||||
result_example = none :: any()}).
|
||||
|
||||
%% TODO Fix me: Type is not up to date
|
||||
-type ejabberd_commands() :: #ejabberd_commands{name :: atom(),
|
||||
tags :: [atom()],
|
||||
desc :: string(),
|
||||
longdesc :: string(),
|
||||
version :: integer(),
|
||||
note :: string(),
|
||||
weight :: integer(),
|
||||
module :: atom(),
|
||||
function :: atom(),
|
||||
args :: [aterm()],
|
||||
policy :: open | restricted | admin | user,
|
||||
access :: [{atom(),atom(),atom()}|atom()],
|
||||
result :: rterm()}.
|
||||
definer :: atom(),
|
||||
result :: rterm(),
|
||||
args_rename :: [{atom(),atom()}],
|
||||
args_desc :: none | [string()] | '_',
|
||||
result_desc :: none | string() | '_',
|
||||
args_example :: none | [any()] | '_',
|
||||
result_example :: any()
|
||||
}.
|
||||
|
||||
%% @type ejabberd_commands() = #ejabberd_commands{
|
||||
%% name = atom(),
|
||||
%% tags = [atom()],
|
||||
%% desc = string(),
|
||||
%% longdesc = string(),
|
||||
%% module = atom(),
|
||||
%% function = atom(),
|
||||
%% args = [aterm()],
|
||||
%% result = rterm()
|
||||
%% }.
|
||||
%% desc: Description of the command
|
||||
%% args: Describe the accepted arguments.
|
||||
%% This way the function that calls the command can format the
|
||||
%% arguments before calling.
|
||||
|
||||
%% @type atype() = integer | string | {tuple, [aterm()]} | {list, aterm()}.
|
||||
%% Allowed types for arguments are integer, string, tuple and list.
|
||||
|
||||
%% @type rtype() = integer | string | atom | {tuple, [rterm()]} | {list, rterm()} | rescode | restuple.
|
||||
%% A rtype is either an atom or a tuple with two elements.
|
||||
|
||||
%% @type aterm() = {Name::atom(), Type::atype()}.
|
||||
%% An argument term is a tuple with the term name and the term type.
|
||||
|
||||
%% @type rterm() = {Name::atom(), Type::rtype()}.
|
||||
%% A result term is a tuple with the term name and the term type.
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
@ -34,12 +34,14 @@
|
|||
format_query :: fun(),
|
||||
format_res :: fun(),
|
||||
args :: fun(),
|
||||
flags :: non_neg_integer(),
|
||||
loc :: {module(), pos_integer()}}).
|
||||
-else.
|
||||
-record(sql_query, {hash :: binary(),
|
||||
format_query :: fun(),
|
||||
format_res :: fun(),
|
||||
args :: fun(),
|
||||
flags :: non_neg_integer(),
|
||||
loc :: {module(), {pos_integer(), pos_integer()}}}).
|
||||
-endif.
|
||||
|
||||
|
@ -48,3 +50,26 @@
|
|||
boolean :: fun((boolean()) -> binary()),
|
||||
in_array_string :: fun((binary()) -> binary()),
|
||||
like_escape :: fun(() -> binary())}).
|
||||
|
||||
|
||||
-record(sql_index, {columns,
|
||||
unique = false :: boolean(),
|
||||
meta = #{}}).
|
||||
-record(sql_column, {name :: binary(),
|
||||
type,
|
||||
default = false,
|
||||
opts = []}).
|
||||
-record(sql_table, {name :: binary(),
|
||||
columns :: [#sql_column{}],
|
||||
indices = [] :: [#sql_index{}],
|
||||
post_create}).
|
||||
-record(sql_schema, {version :: integer(),
|
||||
tables :: [#sql_table{}],
|
||||
update = []}).
|
||||
-record(sql_references, {table :: binary(),
|
||||
column :: binary()}).
|
||||
|
||||
-record(sql_schema_info,
|
||||
{db_type :: pgsql | mysql | sqlite,
|
||||
db_version :: any(),
|
||||
new_schema = true :: boolean()}).
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
@ -26,7 +26,8 @@
|
|||
bare_peer = {<<"">>, <<"">>, <<"">>} :: ljid(),
|
||||
packet = #xmlel{} :: xmlel() | message(),
|
||||
nick = <<"">> :: binary(),
|
||||
type = chat :: chat | groupchat}).
|
||||
type = chat :: chat | groupchat,
|
||||
origin_id = <<"">> :: binary()}).
|
||||
|
||||
-record(archive_prefs,
|
||||
{us = {<<"">>, <<"">>} :: {binary(), binary()},
|
||||
|
|
28
include/mod_matrix_gw.hrl
Normal file
28
include/mod_matrix_gw.hrl
Normal file
|
@ -0,0 +1,28 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
%%% published by the Free Software Foundation; either version 2 of the
|
||||
%%% License, or (at your option) any later version.
|
||||
%%%
|
||||
%%% This program is distributed in the hope that it will be useful,
|
||||
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
%%% General Public License for more details.
|
||||
%%%
|
||||
%%% You should have received a copy of the GNU General Public License along
|
||||
%%% with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
%%%
|
||||
%%%----------------------------------------------------------------------
|
||||
|
||||
-record(room_version,
|
||||
{id :: binary(),
|
||||
%% use the same field names as in Synapse
|
||||
knock_restricted_join_rule :: boolean(),
|
||||
enforce_int_power_levels :: boolean(),
|
||||
implicit_room_creator :: boolean(),
|
||||
updated_redaction_rules :: boolean()
|
||||
}).
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
@ -38,7 +38,7 @@
|
|||
description = <<"">> :: binary(),
|
||||
allow_change_subj = true :: boolean(),
|
||||
allow_query_users = true :: boolean(),
|
||||
allow_private_messages = true :: boolean(),
|
||||
allowpm = anyone :: anyone | participants | moderators | none,
|
||||
allow_private_messages_from_visitors = anyone :: anyone | moderators | nobody ,
|
||||
allow_visitor_status = true :: boolean(),
|
||||
allow_visitor_nickchange = true :: boolean(),
|
||||
|
@ -125,7 +125,7 @@
|
|||
roles = #{} :: roles(),
|
||||
history = #lqueue{} :: lqueue(),
|
||||
subject = [] :: [text()],
|
||||
subject_author = <<"">> :: binary(),
|
||||
subject_author = {<<"">>, #jid{}} :: {binary(), jid()},
|
||||
hats_users = #{} :: map(), % FIXME on OTP 21+: #{ljid() => #{binary() => binary()}},
|
||||
just_created = erlang:system_time(microsecond) :: true | integer(),
|
||||
activity = treap:empty() :: treap:treap(),
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
%%% RFC 1928 constants.
|
||||
%%%
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%% ejabberd, Copyright (C) 2017-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2017-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%-------------------------------------------------------------------
|
||||
%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net>
|
||||
%%% @copyright (C) 2002-2022 ProcessOne, SARL. All Rights Reserved.
|
||||
%%% @copyright (C) 2002-2024 ProcessOne, SARL. All Rights Reserved.
|
||||
%%%
|
||||
%%% Licensed under the Apache License, Version 2.0 (the "License");
|
||||
%%% you may not use this file except in compliance with the License.
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%%%----------------------------------------------------------------------
|
||||
%%%
|
||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
||||
%%% ejabberd, Copyright (C) 2002-2024 ProcessOne
|
||||
%%%
|
||||
%%% This program is free software; you can redistribute it and/or
|
||||
%%% modify it under the terms of the GNU General Public License as
|
||||
|
|
0
install-sh
Normal file → Executable file
0
install-sh
Normal file → Executable file
|
@ -41,7 +41,7 @@ defmodule Ejabberd.Config.Attr do
|
|||
"""
|
||||
@spec validate([attr]) :: [{:ok, attr}] | [{:error, attr, atom()}]
|
||||
def validate(attrs) when is_list(attrs), do: Enum.map(attrs, &valid_attr?/1)
|
||||
def validate(attr), do: validate([attr]) |> List.first
|
||||
def validate(attr), do: validate([attr])
|
||||
|
||||
@doc """
|
||||
Returns the type of an attribute, given its name.
|
||||
|
|
|
@ -36,8 +36,8 @@ defmodule Ejabberd.Config do
|
|||
|
||||
case force do
|
||||
true ->
|
||||
Ejabberd.Config.Store.stop
|
||||
Ejabberd.Config.Store.start_link
|
||||
Ejabberd.Config.Store.stop()
|
||||
Ejabberd.Config.Store.start_link()
|
||||
do_init(file_path)
|
||||
false ->
|
||||
if not init_already_executed, do: do_init(file_path)
|
||||
|
@ -105,11 +105,8 @@ defmodule Ejabberd.Config do
|
|||
Code.eval_file(file_path) |> extract_and_store_module_name()
|
||||
|
||||
# Getting start/0 config
|
||||
Ejabberd.Config.Store.get(:module_name)
|
||||
|> case do
|
||||
nil -> IO.puts "[ ERR ] Configuration module not found."
|
||||
[module] -> call_start_func_and_store_data(module)
|
||||
end
|
||||
[module] = Ejabberd.Config.Store.get(:module_name)
|
||||
call_start_func_and_store_data(module)
|
||||
|
||||
# Fetching git modules and install them
|
||||
get_modules_parsed_in_order()
|
||||
|
|
|
@ -13,7 +13,6 @@ defmodule Ejabberd.Config.EjabberdHook do
|
|||
@doc """
|
||||
Register a hook to ejabberd.
|
||||
"""
|
||||
@spec start(EjabberdHook.t) :: none
|
||||
def start(%EjabberdHook{hook: hook, opts: opts, fun: fun}) do
|
||||
host = Keyword.get(opts, :host, :global)
|
||||
priority = Keyword.get(opts, :priority, 50)
|
||||
|
|
|
@ -7,12 +7,13 @@ defmodule Ejabberd.Config.EjabberdModule do
|
|||
the already existing Elixir.Module.
|
||||
"""
|
||||
|
||||
@type t :: %{module: atom, attrs: [Attr.t]}
|
||||
|
||||
defstruct [:module, :attrs]
|
||||
|
||||
alias Ejabberd.Config.EjabberdModule
|
||||
alias Ejabberd.Config.Validation
|
||||
alias Ejabberd.Config.Attr
|
||||
|
||||
@type t :: %{module: atom, attrs: [Attr.attr]}
|
||||
|
||||
defstruct [:module, :attrs]
|
||||
|
||||
@doc """
|
||||
Given a list of modules / single module
|
||||
|
@ -29,7 +30,6 @@ defmodule Ejabberd.Config.EjabberdModule do
|
|||
a git attribute and tries to fetch the repo,
|
||||
then, it install them through :ext_mod.install/1
|
||||
"""
|
||||
@spec fetch_git_repos([EjabberdModule.t]) :: none()
|
||||
def fetch_git_repos(modules) do
|
||||
modules
|
||||
|> Enum.filter(&is_git_module?/1)
|
||||
|
@ -60,7 +60,7 @@ defmodule Ejabberd.Config.EjabberdModule do
|
|||
defp fetch_and_store_repo_source_if_not_exists(path, repo) do
|
||||
unless File.exists?(path) do
|
||||
IO.puts "[info] Fetching: #{repo}"
|
||||
:os.cmd('git clone #{repo} #{path}')
|
||||
:os.cmd(~c"git clone #{repo} #{path}")
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -17,9 +17,9 @@ defmodule Ejabberd.Config.EjabberdLogger do
|
|||
end
|
||||
|
||||
defp do_log_errors({:ok, _mod}), do: nil
|
||||
defp do_log_errors({:error, _mod, errors}), do: Enum.each errors, &do_log_errors/1
|
||||
defp do_log_errors({:attribute, errors}), do: Enum.each errors, &log_attribute_error/1
|
||||
defp do_log_errors({:dependency, errors}), do: Enum.each errors, &log_dependency_error/1
|
||||
defp do_log_errors({:error, _mod, errors}), do: (Enum.each errors, &do_log_errors/1)
|
||||
defp do_log_errors({:attribute, errors}), do: (Enum.each errors, &log_attribute_error/1)
|
||||
defp do_log_errors({:dependency, errors}), do: (Enum.each errors, &log_dependency_error/1)
|
||||
|
||||
defp log_attribute_error({{attr_name, _val}, :attr_not_supported}), do:
|
||||
IO.puts "[ WARN ] Annotation @#{attr_name} is not supported."
|
||||
|
|
|
@ -14,15 +14,12 @@ defmodule Ejabberd.Config.OptsFormatter do
|
|||
Look at how Config.get_ejabberd_opts/0 is constructed for
|
||||
more informations.
|
||||
"""
|
||||
@spec format_opts_for_ejabberd([{atom(), any()}]) :: list()
|
||||
@spec format_opts_for_ejabberd(map) :: list()
|
||||
def format_opts_for_ejabberd(opts) do
|
||||
opts
|
||||
|> format_attrs_for_ejabberd
|
||||
end
|
||||
|
||||
defp format_attrs_for_ejabberd(opts) when is_list(opts),
|
||||
do: Enum.map opts, &format_attrs_for_ejabberd/1
|
||||
|
||||
defp format_attrs_for_ejabberd({:listeners, mods}),
|
||||
do: {:listen, format_listeners_for_ejabberd(mods)}
|
||||
|
||||
|
@ -32,6 +29,9 @@ defmodule Ejabberd.Config.OptsFormatter do
|
|||
defp format_attrs_for_ejabberd({key, opts}) when is_atom(key),
|
||||
do: {key, opts}
|
||||
|
||||
defp format_attrs_for_ejabberd(opts),
|
||||
do: (Enum.map opts, &format_attrs_for_ejabberd/1)
|
||||
|
||||
defp format_mods_for_ejabberd(mods) do
|
||||
Enum.map mods, fn %EjabberdModule{module: mod, attrs: attrs} ->
|
||||
{mod, attrs[:opts]}
|
||||
|
|
|
@ -3,12 +3,12 @@ defmodule Ejabberd.Config.Validation do
|
|||
Module used to validate a list of modules.
|
||||
"""
|
||||
|
||||
@type mod_validation :: {[EjabberdModule.t], EjabberdModule.t, map}
|
||||
@type mod_validation_result :: {:ok, EjabberdModule.t} | {:error, EjabberdModule.t, map}
|
||||
|
||||
alias Ejabberd.Config.EjabberdModule
|
||||
alias Ejabberd.Config.Validator
|
||||
|
||||
@type mod_validation :: {[EjabberdModule.t], EjabberdModule.t, map}
|
||||
@type mod_validation_result :: {:ok, EjabberdModule.t} | {:error, EjabberdModule.t, map}
|
||||
|
||||
@doc """
|
||||
Given a module or a list of modules it runs validators on them
|
||||
and returns {:ok, mod} or {:error, mod, errors}, for each
|
||||
|
|
|
@ -3,11 +3,12 @@ defmodule Ejabberd.Config.Validator.Attrs do
|
|||
Validator module used to validate attributes.
|
||||
"""
|
||||
|
||||
# TODO: Duplicated from validator.ex !!!
|
||||
@type mod_validation :: {[EjabberdModule.t], EjabberdModule.t, map}
|
||||
|
||||
import Ejabberd.Config.ValidatorUtility
|
||||
alias Ejabberd.Config.Attr
|
||||
alias Ejabberd.Config.EjabberdModule
|
||||
|
||||
# TODO: Duplicated from validator.ex !!!
|
||||
@type mod_validation :: {[EjabberdModule.t], EjabberdModule.t, map}
|
||||
|
||||
@doc """
|
||||
Given a module (with the form used for validation)
|
||||
|
@ -17,9 +18,9 @@ defmodule Ejabberd.Config.Validator.Attrs do
|
|||
@spec validate(mod_validation) :: mod_validation
|
||||
def validate({modules, mod, errors}) do
|
||||
errors = Enum.reduce mod.attrs, errors, fn(attr, err) ->
|
||||
case Attr.validate(attr) do
|
||||
{:ok, _attr} -> err
|
||||
{:error, attr, cause} -> put_error(err, :attribute, {attr, cause})
|
||||
case Attr.validate([attr]) do
|
||||
[{:ok, _attr}] -> err
|
||||
[{:error, attr, cause}] -> put_error(err, :attribute, {attr, cause})
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -4,6 +4,8 @@ defmodule Ejabberd.Config.Validator.Dependencies do
|
|||
with the @dependency annotation.
|
||||
"""
|
||||
|
||||
alias Ejabberd.Config.EjabberdModule
|
||||
|
||||
# TODO: Duplicated from validator.ex !!!
|
||||
@type mod_validation :: {[EjabberdModule.t], EjabberdModule.t, map}
|
||||
import Ejabberd.Config.ValidatorUtility
|
||||
|
|
|
@ -4,8 +4,6 @@ defmodule Ejabberd.Config.ValidatorUtility do
|
|||
Imports utility functions for working with validation structures.
|
||||
"""
|
||||
|
||||
alias Ejabberd.Config.EjabberdModule
|
||||
|
||||
@doc """
|
||||
Inserts an error inside the errors collection, for the given key.
|
||||
If the key doesn't exists then it creates an empty collection
|
||||
|
@ -22,7 +20,6 @@ defmodule Ejabberd.Config.ValidatorUtility do
|
|||
Given a list of modules it extracts and returns a list
|
||||
of the module names (which are Elixir.Module).
|
||||
"""
|
||||
@spec extract_module_names(EjabberdModule.t) :: [atom]
|
||||
def extract_module_names(modules) when is_list(modules) do
|
||||
modules
|
||||
|> Enum.map(&Map.get(&1, :module))
|
||||
|
|
|
@ -7,7 +7,7 @@ defmodule Ejabberd.ConfigUtil do
|
|||
@doc """
|
||||
Returns true when the config file is based on elixir.
|
||||
"""
|
||||
@spec is_elixir_config(list) :: boolean
|
||||
@spec is_elixir_config(binary) :: boolean
|
||||
def is_elixir_config(filename) when is_list(filename) do
|
||||
is_elixir_config(to_string(filename))
|
||||
end
|
||||
|
|
|
@ -14,15 +14,15 @@ defmodule Mix.Tasks.Ejabberd.Deps.Tree do
|
|||
def run(_argv) do
|
||||
# First we need to start manually the store to be available
|
||||
# during the compilation of the config file.
|
||||
Ejabberd.Config.Store.start_link
|
||||
Ejabberd.Config.Store.start_link()
|
||||
Ejabberd.Config.init(:ejabberd_config.path())
|
||||
|
||||
Mix.shell.info "ejabberd modules"
|
||||
Mix.shell().info "ejabberd modules"
|
||||
|
||||
Ejabberd.Config.Store.get(:modules)
|
||||
|> Enum.reverse # Because of how mods are stored inside the store
|
||||
|> format_mods
|
||||
|> Mix.shell.info
|
||||
|> Mix.shell().info
|
||||
end
|
||||
|
||||
defp format_mods(mods) when is_list(mods) do
|
||||
|
|
|
@ -2,19 +2,19 @@ defmodule ModPresenceDemo do
|
|||
use Ejabberd.Module
|
||||
|
||||
def start(host, _opts) do
|
||||
info('Starting ejabberd module Presence Demo')
|
||||
info("Starting ejabberd module Presence Demo")
|
||||
Ejabberd.Hooks.add(:set_presence_hook, host, __MODULE__, :on_presence, 50)
|
||||
:ok
|
||||
end
|
||||
|
||||
def stop(host) do
|
||||
info('Stopping ejabberd module Presence Demo')
|
||||
info("Stopping ejabberd module Presence Demo")
|
||||
Ejabberd.Hooks.delete(:set_presence_hook, host, __MODULE__, :on_presence, 50)
|
||||
:ok
|
||||
end
|
||||
|
||||
def on_presence(user, _server, _resource, _packet) do
|
||||
info('Receive presence for #{user}')
|
||||
info("Receive presence for #{user}")
|
||||
:none
|
||||
end
|
||||
|
||||
|
@ -27,7 +27,7 @@ defmodule ModPresenceDemo do
|
|||
end
|
||||
|
||||
def mod_doc() do
|
||||
%{:desc => 'This is just a demonstration.'}
|
||||
%{:desc => "This is just a demonstration."}
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
@ -75,7 +75,7 @@ EOF
|
|||
if test "x`cat conftest.out`" != "xok"; then
|
||||
AC_MSG_RESULT([failed])
|
||||
X="`cat conftest.out`"
|
||||
if test "[$3]" == "warn"; then
|
||||
if test "[$3]" = "warn"; then
|
||||
AC_MSG_WARN([$X])
|
||||
else
|
||||
AC_MSG_FAILURE([$X])
|
||||
|
|
|
@ -2,12 +2,12 @@
|
|||
.\" Title: ejabberd.yml
|
||||
.\" Author: [see the "AUTHOR" section]
|
||||
.\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
|
||||
.\" Date: 10/12/2022
|
||||
.\" Date: 02/24/2024
|
||||
.\" Manual: \ \&
|
||||
.\" Source: \ \&
|
||||
.\" Language: English
|
||||
.\"
|
||||
.TH "EJABBERD\&.YML" "5" "10/12/2022" "\ \&" "\ \&"
|
||||
.TH "EJABBERD\&.YML" "5" "02/24/2024" "\ \&" "\ \&"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * Define some portability stuff
|
||||
.\" -----------------------------------------------------------------
|
||||
|
@ -82,7 +82,7 @@ All options can be changed in runtime by running \fIejabberdctl reload\-config\f
|
|||
.sp
|
||||
Some options can be specified for particular virtual host(s) only using \fIhost_config\fR or \fIappend_host_config\fR options\&. Such options are called \fIlocal\fR\&. Examples are \fImodules\fR, \fIauth_method\fR and \fIdefault_db\fR\&. The options that cannot be defined per virtual host are called \fIglobal\fR\&. Examples are \fIloglevel\fR, \fIcertfiles\fR and \fIlisten\fR\&. It is a configuration mistake to put \fIglobal\fR options under \fIhost_config\fR or \fIappend_host_config\fR section \- ejabberd will refuse to load such configuration\&.
|
||||
.sp
|
||||
It is not recommended to write ejabberd\&.yml from scratch\&. Instead it is better to start from "default" configuration file available at https://github\&.com/processone/ejabberd/blob/22\&.10/ejabberd\&.yml\&.example\&. Once you get ejabberd running you can start changing configuration options to meet your requirements\&.
|
||||
It is not recommended to write ejabberd\&.yml from scratch\&. Instead it is better to start from "default" configuration file available at https://github\&.com/processone/ejabberd/blob/24\&.02/ejabberd\&.yml\&.example\&. Once you get ejabberd running you can start changing configuration options to meet your requirements\&.
|
||||
.sp
|
||||
Note that this document is intended to provide comprehensive description of all configuration options that can be consulted to understand the meaning of a particular option, its format and possible values\&. It will be quite hard to understand how to configure ejabberd by reading this document only \- for this purpose the reader is recommended to read online Configuration Guide available at https://docs\&.ejabberd\&.im/admin/configuration\&.
|
||||
.SH "TOP LEVEL OPTIONS"
|
||||
|
@ -303,7 +303,9 @@ acme:
|
|||
.PP
|
||||
\fBallow_contrib_modules\fR: \fItrue | false\fR
|
||||
.RS 4
|
||||
Whether to allow installation of third\-party modules or not\&. The default value is
|
||||
Whether to allow installation of third\-party modules or not\&. See
|
||||
ejabberd\-contrib
|
||||
documentation section\&. The default value is
|
||||
\fItrue\fR\&.
|
||||
.RE
|
||||
.PP
|
||||
|
@ -396,6 +398,18 @@ Same as
|
|||
\fIcache_size\fR
|
||||
will be used\&.
|
||||
.RE
|
||||
.sp
|
||||
\fINote\fR about the next option: added in 23\&.10:
|
||||
.PP
|
||||
\fBauth_external_user_exists_check\fR: \fItrue | false\fR
|
||||
.RS 4
|
||||
Supplement check for user existence based on
|
||||
\fImod_last\fR
|
||||
data, for authentication methods that don\(cqt have a way to reliably tell if a user exists (like is the case for
|
||||
\fIjwt\fR
|
||||
and certificate based authentication)\&. This helps with processing offline message for those users\&. The default value is
|
||||
\fItrue\fR\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBauth_method\fR: \fI[mnesia | sql | anonymous | external | jwt | ldap | pam, \&.\&.\&.]\fR
|
||||
.RS 4
|
||||
|
@ -416,7 +430,9 @@ Git repository\&. Please refer to that module\(cqs README file for details\&.
|
|||
.PP
|
||||
\fBauth_password_format\fR: \fIplain | scram\fR
|
||||
.RS 4
|
||||
The option defines in what format the users passwords are stored:
|
||||
The option defines in what format the users passwords are stored, plain text or in
|
||||
SCRAM
|
||||
format:
|
||||
.sp
|
||||
.RS 4
|
||||
.ie n \{\
|
||||
|
@ -426,7 +442,7 @@ The option defines in what format the users passwords are stored:
|
|||
.sp -1
|
||||
.IP \(bu 2.3
|
||||
.\}
|
||||
\fIplain\fR: The password is stored as plain text in the database\&. This is risky because the passwords can be read if your database gets compromised\&. This is the default value\&. This format allows clients to authenticate using: the old Jabber Non\-SASL (XEP\-0078), SASL PLAIN, SASL DIGEST\-MD5, and SASL SCRAM\-SHA\-1\&.
|
||||
\fIplain\fR: The password is stored as plain text in the database\&. This is risky because the passwords can be read if your database gets compromised\&. This is the default value\&. This format allows clients to authenticate using: the old Jabber Non\-SASL (XEP\-0078), SASL PLAIN, SASL DIGEST\-MD5, and SASL SCRAM\-SHA\-1/256/512(\-PLUS)\&.
|
||||
.RE
|
||||
.sp
|
||||
.RS 4
|
||||
|
@ -437,14 +453,19 @@ The option defines in what format the users passwords are stored:
|
|||
.sp -1
|
||||
.IP \(bu 2.3
|
||||
.\}
|
||||
\fIscram\fR: The password is not stored, only some information that allows to verify the hash provided by the client\&. It is impossible to obtain the original plain password from the stored information; for this reason, when this value is configured it cannot be changed to plain anymore\&. This format allows clients to authenticate using: SASL PLAIN and SASL SCRAM\-SHA\-1\&. The default value is
|
||||
\fIplain\fR\&.
|
||||
\fIscram\fR: The password is not stored, only some information required to verify the hash provided by the client\&. It is impossible to obtain the original plain password from the stored information; for this reason, when this value is configured it cannot be changed to plain anymore\&. This format allows clients to authenticate using: SASL PLAIN and SASL SCRAM\-SHA\-1/256/512(\-PLUS)\&. The SCRAM variant depends on the
|
||||
\fIauth_scram_hash\fR
|
||||
option\&.
|
||||
.RE
|
||||
.RE
|
||||
.sp
|
||||
The default value is \fIplain\fR\&.
|
||||
.PP
|
||||
\fBauth_scram_hash\fR: \fIsha | sha256 | sha512\fR
|
||||
.RS 4
|
||||
Hash algorithm that should be used to store password in SCRAM format\&. You shouldn\(cqt change this if you already have passwords generated with a different algorithm \- users that have such passwords will not be able to authenticate\&. The default value is
|
||||
Hash algorithm that should be used to store password in
|
||||
SCRAM
|
||||
format\&. You shouldn\(cqt change this if you already have passwords generated with a different algorithm \- users that have such passwords will not be able to authenticate\&. The default value is
|
||||
\fIsha\fR\&.
|
||||
.RE
|
||||
.PP
|
||||
|
@ -560,13 +581,19 @@ A maximum number of items (not memory!) in cache\&. The rule of thumb, for all t
|
|||
\fIsm_cache_size\fR\&.
|
||||
.RE
|
||||
.sp
|
||||
\fINote\fR about the next option: improved in 21\&.10:
|
||||
\fINote\fR about the next option: improved in 23\&.01:
|
||||
.PP
|
||||
\fBcaptcha_cmd\fR: \fIPath\fR
|
||||
\fBcaptcha_cmd\fR: \fIPath | ModuleName\fR
|
||||
.RS 4
|
||||
Full path to a script that generates
|
||||
CAPTCHA
|
||||
images\&. @VERSION@ is replaced with ejabberd version number in XX\&.YY format\&. @SEMVER@ is replaced with ejabberd version number in semver format when compiled with Elixir\(cqs mix, or XX\&.YY format otherwise\&. There is no default value: when this option is not set, CAPTCHA functionality is completely disabled\&.
|
||||
images\&.
|
||||
\fI@VERSION@\fR
|
||||
is replaced with ejabberd version number in
|
||||
\fIXX\&.YY\fR
|
||||
format\&.
|
||||
\fI@SEMVER@\fR
|
||||
is replaced with ejabberd version number in semver format when compiled with Elixir\(cqs mix, or XX\&.YY format otherwise\&. Alternatively, it can be the name of a module that implements ejabberd CAPTCHA support\&. There is no default value: when this option is not set, CAPTCHA functionality is completely disabled\&.
|
||||
.sp
|
||||
When using the ejabberd installers or container image, the example captcha scripts can be used like this:
|
||||
.sp
|
||||
|
@ -595,8 +622,10 @@ CAPTCHA
|
|||
generated images per minute for any given JID\&. The option is intended to protect the server from CAPTCHA DoS\&. The default value is
|
||||
\fIinfinity\fR\&.
|
||||
.RE
|
||||
.sp
|
||||
\fINote\fR about the next option: improved in 23\&.04:
|
||||
.PP
|
||||
\fBcaptcha_url\fR: \fIURL\fR
|
||||
\fBcaptcha_url\fR: \fIURL | auto | undefined\fR
|
||||
.RS 4
|
||||
An URL where
|
||||
CAPTCHA
|
||||
|
@ -604,7 +633,14 @@ requests should be sent\&. NOTE: you need to configure
|
|||
\fIrequest_handlers\fR
|
||||
for
|
||||
\fIejabberd_http\fR
|
||||
listener as well\&. There is no default value\&.
|
||||
listener as well\&. If set to
|
||||
\fIauto\fR, it builds the URL using a
|
||||
\fIrequest_handler\fR
|
||||
already enabled, with encryption if available\&. If set to
|
||||
\fIundefined\fR, it builds the URL using the deprecated
|
||||
\fIcaptcha_host\fR
|
||||
+ /captcha\&. The default value is
|
||||
\fIauto\fR\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBcertfiles\fR: \fI[Path, \&.\&.\&.]\fR
|
||||
|
@ -696,6 +732,14 @@ or
|
|||
is case\-insensitive\&. The default value is an empty list, i\&.e\&. no mechanisms are disabled by default\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBdisable_sasl_scram_downgrade_protection\fR: \fItrue | false\fR
|
||||
.RS 4
|
||||
Allows to disable sending data required by
|
||||
\fIXEP\-0474: SASL SCRAM Downgrade Protection\fR\&. There are known buggy clients (like those that use strophejs 1\&.6\&.2) which will not be able to authenticatate when servers sends data from that specification\&. This options allows server to disable it to allow even buggy clients connects, but in exchange decrease MITM protection\&. The default value of this option is
|
||||
\fIfalse\fR
|
||||
which enables this extension\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBdomain_balancing\fR: \fI{Domain: Options}\fR
|
||||
.RS 4
|
||||
An algorithm to load balance the components that are plugged on an ejabberd cluster\&. It means that you can plug one or several instances of the same component on each ejabberd node and that the traffic will be automatically distributed\&. The algorithm to deliver messages to the component(s) can be specified by this option\&. For any component connected as
|
||||
|
@ -722,7 +766,7 @@ attribute;
|
|||
\fIfrom\fR
|
||||
attribute;
|
||||
\fIbare_destination\fR
|
||||
\- by the the bare JID (without resource) of the packet\(cqs
|
||||
\- by the bare JID (without resource) of the packet\(cqs
|
||||
\fIto\fR
|
||||
attribute;
|
||||
\fIbare_source\fR
|
||||
|
@ -866,6 +910,16 @@ Disallows the usage of those options in the included file
|
|||
\fIFilename\fR\&. The options that match this criteria are not accepted\&. The default value is an empty list\&.
|
||||
.RE
|
||||
.RE
|
||||
.sp
|
||||
\fINote\fR about the next option: added in 23\&.10:
|
||||
.PP
|
||||
\fBinstall_contrib_modules\fR: \fI[Module, \&.\&.\&.]\fR
|
||||
.RS 4
|
||||
Modules to install from
|
||||
ejabberd\-contrib
|
||||
at start time\&. The default value is an empty list of modules:
|
||||
\fI[]\fR\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBjwt_auth_only_rule\fR: \fIAccessName\fR
|
||||
.RS 4
|
||||
|
@ -877,7 +931,7 @@ This ACL rule defines accounts that can use only this auth method, even if other
|
|||
.RS 4
|
||||
By default, the JID is defined in the
|
||||
\fI"jid"\fR
|
||||
JWT field\&. This option allows to specify other JWT field name where the JID is defined\&.
|
||||
JWT field\&. In this option you can specify other JWT field name where the JID is defined\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBjwt_key\fR: \fIFilePath\fR
|
||||
|
@ -1036,6 +1090,13 @@ period before starting to drop them\&. Default 500
|
|||
.RS 4
|
||||
The time period to rate\-limit log messages by\&. Defaults to 1 second\&.
|
||||
.RE
|
||||
.sp
|
||||
\fINote\fR about the next option: added in 23\&.01:
|
||||
.PP
|
||||
\fBlog_modules_fully\fR: \fI[Module, \&.\&.\&.]\fR
|
||||
.RS 4
|
||||
List of modules that will log everything independently from the general loglevel option\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBlog_rotate_count\fR: \fINumber\fR
|
||||
.RS 4
|
||||
|
@ -1077,7 +1138,7 @@ section for details\&.
|
|||
\fBnegotiation_timeout\fR: \fItimeout()\fR
|
||||
.RS 4
|
||||
Time to wait for an XMPP stream negotiation to complete\&. When timeout occurs, the corresponding XMPP stream is closed\&. The default value is
|
||||
\fI30\fR
|
||||
\fI120\fR
|
||||
seconds\&.
|
||||
.RE
|
||||
.PP
|
||||
|
@ -1093,9 +1154,9 @@ This option can be used to tune tick time parameter of
|
|||
Whether to use
|
||||
\fInew\fR
|
||||
SQL schema\&. All schemas are located at
|
||||
https://github\&.com/processone/ejabberd/tree/22\&.10/sql\&. There are two schemas available\&. The default legacy schema allows to store one XMPP domain into one ejabberd database\&. The
|
||||
https://github\&.com/processone/ejabberd/tree/24\&.02/sql\&. There are two schemas available\&. The default legacy schema stores one XMPP domain into one ejabberd database\&. The
|
||||
\fInew\fR
|
||||
schema allows to handle several XMPP domains in a single ejabberd database\&. Using this
|
||||
schema can handle several XMPP domains in a single ejabberd database\&. Using this
|
||||
\fInew\fR
|
||||
schema is best when serving several XMPP domains and/or changing domains from time to time\&. This avoid need to manage several databases and handle complex configuration changes\&. The default depends on configuration flag
|
||||
\fI\-\-enable\-new\-sql\-schema\fR
|
||||
|
@ -1202,12 +1263,14 @@ option)\&. Later, when memory drops below this
|
|||
\fI80\fR
|
||||
percents\&.
|
||||
.RE
|
||||
.sp
|
||||
\fINote\fR about the next option: changed in 23\&.01:
|
||||
.PP
|
||||
\fBoutgoing_s2s_families\fR: \fI[ipv4 | ipv6, \&.\&.\&.]\fR
|
||||
\fBoutgoing_s2s_families\fR: \fI[ipv6 | ipv4, \&.\&.\&.]\fR
|
||||
.RS 4
|
||||
Specify which address families to try, in what order\&. The default is
|
||||
\fI[ipv4, ipv6]\fR
|
||||
which means it first tries connecting with IPv4, if that fails it tries using IPv6\&.
|
||||
\fI[ipv6, ipv4]\fR
|
||||
which means it first tries connecting with IPv6, if that fails it tries using IPv4\&. This option is obsolete and irrelevant when using ejabberd 23\&.01 and Erlang/OTP 22, or newer versions of them\&.
|
||||
.RE
|
||||
.sp
|
||||
\fINote\fR about the next option: added in 20\&.12:
|
||||
|
@ -1641,6 +1704,15 @@ seconds\&.
|
|||
An SQL database name\&. For SQLite this must be a full path to a database file\&. The default value is
|
||||
\fIejabberd\fR\&.
|
||||
.RE
|
||||
.sp
|
||||
\fINote\fR about the next option: added in 24\&.02:
|
||||
.PP
|
||||
\fBsql_flags\fR: \fI[mysql_alternative_upsert]\fR
|
||||
.RS 4
|
||||
This option accepts a list of SQL flags, and is empty by default\&.
|
||||
\fImysql_alternative_upsert\fR
|
||||
forces the alternative upsert implementation in MySQL\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBsql_keepalive_interval\fR: \fItimeout()\fR
|
||||
.RS 4
|
||||
|
@ -1651,10 +1723,13 @@ An interval to make a dummy SQL request to keep alive the connections to the dat
|
|||
.PP
|
||||
\fBsql_odbc_driver\fR: \fIPath\fR
|
||||
.RS 4
|
||||
Path to the ODBC driver to use to connect to a Microsoft SQL Server database\&. This option is only valid if the
|
||||
Path to the ODBC driver to use to connect to a Microsoft SQL Server database\&. This option only applies if the
|
||||
\fIsql_type\fR
|
||||
option is set to
|
||||
\fImssql\fR\&. The default value is:
|
||||
\fImssql\fR
|
||||
and
|
||||
\fIsql_server\fR
|
||||
is not an ODBC connection string\&. The default value is:
|
||||
\fIlibtdsodbc\&.so\fR
|
||||
.RE
|
||||
.PP
|
||||
|
@ -1687,7 +1762,7 @@ for MS SQL\&. The option has no effect for SQLite\&.
|
|||
.RS 4
|
||||
This option is
|
||||
\fItrue\fR
|
||||
by default, and is useful to disable prepared statements\&. The option is valid for PostgreSQL\&.
|
||||
by default, and is useful to disable prepared statements\&. The option is valid for PostgreSQL and MySQL\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBsql_query_timeout\fR: \fItimeout()\fR
|
||||
|
@ -1710,7 +1785,12 @@ if the latter is not set\&.
|
|||
.PP
|
||||
\fBsql_server\fR: \fIHost\fR
|
||||
.RS 4
|
||||
A hostname or an IP address of the SQL server\&. The default value is
|
||||
The hostname or IP address of the SQL server\&. For
|
||||
\fIsql_type\fR
|
||||
\fImssql\fR
|
||||
or
|
||||
\fIodbc\fR
|
||||
this can also be an ODBC connection string\&. The default value is
|
||||
\fIlocalhost\fR\&.
|
||||
.RE
|
||||
.sp
|
||||
|
@ -1718,7 +1798,7 @@ A hostname or an IP address of the SQL server\&. The default value is
|
|||
.PP
|
||||
\fBsql_ssl\fR: \fItrue | false\fR
|
||||
.RS 4
|
||||
Whether to use SSL encrypted connections to the SQL server\&. The option is only available for MySQL and PostgreSQL\&. The default value is
|
||||
Whether to use SSL encrypted connections to the SQL server\&. The option is only available for MySQL, MS SQL and PostgreSQL\&. The default value is
|
||||
\fIfalse\fR\&.
|
||||
.RE
|
||||
.PP
|
||||
|
@ -1729,7 +1809,7 @@ A path to a file with CA root certificates that will be used to verify SQL conne
|
|||
and
|
||||
\fIsql_ssl_verify\fR
|
||||
options are set to
|
||||
\fItrue\fR\&. There is no default which means certificate verification is disabled\&.
|
||||
\fItrue\fR\&. There is no default which means certificate verification is disabled\&. This option has no effect for MS SQL\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBsql_ssl_certfile\fR: \fIPath\fR
|
||||
|
@ -1737,7 +1817,7 @@ options are set to
|
|||
A path to a certificate file that will be used for SSL connections to the SQL server\&. Implies
|
||||
\fIsql_ssl\fR
|
||||
option is set to
|
||||
\fItrue\fR\&. There is no default which means ejabberd won\(cqt provide a client certificate to the SQL server\&.
|
||||
\fItrue\fR\&. There is no default which means ejabberd won\(cqt provide a client certificate to the SQL server\&. This option has no effect for MS SQL\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBsql_ssl_verify\fR: \fItrue | false\fR
|
||||
|
@ -1747,7 +1827,7 @@ Whether to verify SSL connection to the SQL server against CA root certificates
|
|||
option\&. Implies
|
||||
\fIsql_ssl\fR
|
||||
option is set to
|
||||
\fItrue\fR\&. The default value is
|
||||
\fItrue\fR\&. This option has no effect for MS SQL\&. The default value is
|
||||
\fIfalse\fR\&.
|
||||
.RE
|
||||
.PP
|
||||
|
@ -1775,12 +1855,18 @@ A user name for SQL authentication\&. The default value is
|
|||
Specify what proxies are trusted when an HTTP request contains the header
|
||||
\fIX\-Forwarded\-For\fR\&. You can specify
|
||||
\fIall\fR
|
||||
to allow all proxies, or specify a list of IPs, possibly with masks\&. The default value is an empty list\&. This allows, if enabled, to be able to know the real IP of the request, for admin purpose, or security configuration (for example using
|
||||
to allow all proxies, or specify a list of IPs, possibly with masks\&. The default value is an empty list\&. Using this option you can know the real IP of the request, for admin purpose, or security configuration (for example using
|
||||
\fImod_fail2ban\fR)\&. IMPORTANT: The proxy MUST be configured to set the
|
||||
\fIX\-Forwarded\-For\fR
|
||||
header if you enable this option as, otherwise, the client can set it itself and as a result the IP value cannot be trusted for security rules in ejabberd\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBupdate_sql_schema\fR: \fItrue | false\fR
|
||||
.RS 4
|
||||
Allow ejabberd to update SQL schema\&. The default value is
|
||||
\fItrue\fR\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBuse_cache\fR: \fItrue | false\fR
|
||||
.RS 4
|
||||
Enable or disable cache\&. The default is
|
||||
|
@ -1962,7 +2048,7 @@ ejabberdctl srg\-create g1 example\&.org "\*(AqGroup number 1\*(Aq" this_is_g1 g
|
|||
.RE
|
||||
.SS "mod_admin_update_sql"
|
||||
.sp
|
||||
This module can be used to update existing SQL database from the default to the new schema\&. Check the section Default and New Schemas for details\&. Please note that only PostgreSQL is supported\&. When the module is loaded use \fIupdate_sql\fR API\&.
|
||||
This module can be used to update existing SQL database from the default to the new schema\&. Check the section Default and New Schemas for details\&. Please note that only MS SQL, MySQL, and PostgreSQL are supported\&. When the module is loaded use \fIupdate_sql\fR API\&.
|
||||
.sp
|
||||
The module has no options\&.
|
||||
.SS "mod_announce"
|
||||
|
@ -2130,7 +2216,7 @@ Limit any given JID by the number of avatars it is able to convert per minute\&.
|
|||
.RE
|
||||
.SS "mod_block_strangers"
|
||||
.sp
|
||||
This module allows to block/log messages coming from an unknown entity\&. If a writing entity is not in your roster, you can let this module drop and/or log the message\&. By default you\(cqll just not receive message from that entity\&. Enable this module if you want to drop SPAM messages\&.
|
||||
This module blocks and logs any messages coming from an unknown entity\&. If a writing entity is not in your roster, you can let this module drop and/or log the message\&. By default you\(cqll just not receive message from that entity\&. Enable this module if you want to drop SPAM messages\&.
|
||||
.sp
|
||||
.it 1 an-trap
|
||||
.nr an-no-space-flag 1
|
||||
|
@ -2984,7 +3070,7 @@ List of accounts that are allowed to use this service\&. Default value:
|
|||
\fBExamples:\fR
|
||||
.RS 4
|
||||
.sp
|
||||
This example configuration will serve the files from the local directory \fI/var/www\fR in the address \fIhttp://example\&.org:5280/pub/archive/\fR\&. In this example a new content type \fIogg\fR is defined, \fIpng\fR is redefined, and \fIjpg\fR definition is deleted:
|
||||
This example configuration will serve the files from the local directory \fI/var/www\fR in the address \fIhttp://example\&.org:5280/pub/content/\fR\&. In this example a new content type \fIogg\fR is defined, \fIpng\fR is redefined, and \fIjpg\fR definition is deleted:
|
||||
.sp
|
||||
.if n \{\
|
||||
.RS 4
|
||||
|
@ -2997,7 +3083,7 @@ listen:
|
|||
module: ejabberd_http
|
||||
request_handlers:
|
||||
\&.\&.\&.
|
||||
/pub/archive: mod_http_fileserver
|
||||
/pub/content: mod_http_fileserver
|
||||
\&.\&.\&.
|
||||
\&.\&.\&.
|
||||
|
||||
|
@ -3489,6 +3575,96 @@ When this option is disabled, for each individual subscriber a separa mucsub mes
|
|||
\fIfalse\fR\&.
|
||||
.RE
|
||||
.RE
|
||||
.SS "mod_matrix_gw"
|
||||
.sp
|
||||
Matrix gateway\&.
|
||||
.sp
|
||||
This module is available since ejabberd 24\&.02\&.
|
||||
.sp
|
||||
.it 1 an-trap
|
||||
.nr an-no-space-flag 1
|
||||
.nr an-break-flag 1
|
||||
.br
|
||||
.ps +1
|
||||
\fBAvailable options:\fR
|
||||
.RS 4
|
||||
.PP
|
||||
\fBhost\fR: \fIHost\fR
|
||||
.RS 4
|
||||
This option defines the Jabber IDs of the service\&. If the
|
||||
\fIhost\fR
|
||||
option is not specified, the Jabber ID will be the hostname of the virtual host with the prefix
|
||||
\fI"matrix\&."\fR\&. The keyword
|
||||
\fI@HOST@\fR
|
||||
is replaced with the real virtual host name\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBkey\fR: \fIstring()\fR
|
||||
.RS 4
|
||||
Value of the matrix signing key, in base64\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBkey_name\fR: \fIstring()\fR
|
||||
.RS 4
|
||||
Name of the matrix signing key\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBmatrix_domain\fR: \fIDomain\fR
|
||||
.RS 4
|
||||
Specify a domain in the Matrix federation\&. The keyword
|
||||
\fI@HOST@\fR
|
||||
is replaced with the hostname\&. The default value is
|
||||
\fI@HOST@\fR\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBmatrix_id_as_jid\fR: \fItrue | false\fR
|
||||
.RS 4
|
||||
If set to
|
||||
\fIfalse\fR, all packets failing to be delivered via an XMPP server\-to\-server connection will then be routed to the Matrix gateway by translating a Jabber ID
|
||||
\fIuser@matrixdomain\&.tld\fR
|
||||
to a Matrix user identifier
|
||||
\fI@user:matrixdomain\&.tld\fR\&. When set to
|
||||
\fItrue\fR, messages must be explicitly sent to the matrix gateway service Jabber ID to be routed to a remote Matrix server\&. In this case, to send a message to Matrix user
|
||||
\fI@user:matrixdomain\&.tld\fR, the client must send a message to the JID
|
||||
\fIuser%\fR\fImatrixdomain\&.tld@matrix\&.myxmppdomain\fR\fI\&.tld\fR, where
|
||||
\fImatrix\&.myxmppdomain\&.tld\fR
|
||||
is the JID of the gateway service as set by the
|
||||
\fIhost\fR
|
||||
option\&. The default is
|
||||
\fIfalse\fR\&.
|
||||
.RE
|
||||
.RE
|
||||
.sp
|
||||
.it 1 an-trap
|
||||
.nr an-no-space-flag 1
|
||||
.nr an-break-flag 1
|
||||
.br
|
||||
.ps +1
|
||||
\fBExample:\fR
|
||||
.RS 4
|
||||
.sp
|
||||
.if n \{\
|
||||
.RS 4
|
||||
.\}
|
||||
.nf
|
||||
listen:
|
||||
\-
|
||||
port: 8448
|
||||
module: ejabberd_http
|
||||
tls: true
|
||||
request_handlers:
|
||||
"/_matrix": mod_matrix_gw
|
||||
|
||||
modules:
|
||||
mod_matrix_gw:
|
||||
key_name: "key1"
|
||||
key: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
|
||||
matrix_id_as_jid: true
|
||||
.fi
|
||||
.if n \{\
|
||||
.RE
|
||||
.\}
|
||||
.RE
|
||||
.SS "mod_metrics"
|
||||
.sp
|
||||
This module sends events to external backend (by now only grapherl is supported)\&. Supported events are:
|
||||
|
@ -3832,12 +4008,74 @@ Same as top\-level
|
|||
option, but applied to this module only\&.
|
||||
.RE
|
||||
.RE
|
||||
.SS "mod_mqtt_bridge"
|
||||
.sp
|
||||
This module adds ability to synchronize local MQTT topics with data on remote servers It can update topics on remote servers when local user updates local topic, or can subscribe for changes on remote server, and update local copy when remote data is updated\&. It is available since ejabberd 23\&.01\&.
|
||||
.sp
|
||||
.it 1 an-trap
|
||||
.nr an-no-space-flag 1
|
||||
.nr an-break-flag 1
|
||||
.br
|
||||
.ps +1
|
||||
\fBAvailable options:\fR
|
||||
.RS 4
|
||||
.PP
|
||||
\fBreplication_user\fR: \fIJID\fR
|
||||
.RS 4
|
||||
Identifier of a user that will be assigned as owner of local changes\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBservers\fR: \fI{ServerUrl: {publish: [TopicPairs, subscribe: [TopicPairs], authentication: [AuthInfo]}}]\fR
|
||||
.RS 4
|
||||
Declaration of data to share, must contain
|
||||
\fIpublish\fR
|
||||
or
|
||||
\fIsubscribe\fR
|
||||
or both, and
|
||||
\fIauthentication\fR
|
||||
section with username/password field or certfile pointing to client certificate\&. Accepted urls can use schema mqtt, mqtts (mqtt with tls), mqtt5, mqtt5s (both to trigger v5 protocol), ws, wss, ws5, wss5\&. Certificate authentication can be only used with mqtts, mqtt5s, wss, wss5\&.
|
||||
.RE
|
||||
.RE
|
||||
.sp
|
||||
.it 1 an-trap
|
||||
.nr an-no-space-flag 1
|
||||
.nr an-break-flag 1
|
||||
.br
|
||||
.ps +1
|
||||
\fBExample:\fR
|
||||
.RS 4
|
||||
.sp
|
||||
.if n \{\
|
||||
.RS 4
|
||||
.\}
|
||||
.nf
|
||||
modules:
|
||||
\&.\&.\&.
|
||||
mod_mqtt_bridge:
|
||||
servers:
|
||||
"mqtt://server\&.com":
|
||||
publish:
|
||||
"localA": "remoteA" # local changes to \*(AqlocalA\*(Aq will be replicated on remote server as \*(AqremoteA\*(Aq
|
||||
"topicB": "topicB"
|
||||
subscribe:
|
||||
"remoteB": "localB" # changes to \*(AqremoteB\*(Aq on remote server will be stored as \*(AqlocalB\*(Aq on local server
|
||||
authentication:
|
||||
certfile: "/etc/ejabberd/mqtt_server\&.pem"
|
||||
replication_user: "mqtt@xmpp\&.server\&.com"
|
||||
\&.\&.\&.
|
||||
.fi
|
||||
.if n \{\
|
||||
.RE
|
||||
.\}
|
||||
.RE
|
||||
.SS "mod_muc"
|
||||
.sp
|
||||
This module provides support for XEP\-0045: Multi\-User Chat\&. Users can discover existing rooms, join or create them\&. Occupants of a room can chat in public or have private chats\&.
|
||||
.sp
|
||||
The MUC service allows any Jabber ID to register a nickname, so nobody else can use that nickname in any room in the MUC service\&. To register a nickname, open the Service Discovery in your XMPP client and register in the MUC service\&.
|
||||
.sp
|
||||
It is also possible to register a nickname in a room, so nobody else can use that nickname in that room\&. If a nick is registered in the MUC service, that nick cannot be registered in any room, and vice versa: a nick that is registered in a room cannot be registered at the MUC service\&.
|
||||
.sp
|
||||
This module supports clustering and load balancing\&. One module can be started per cluster node\&. Rooms are distributed at creation time on all available MUC module instances\&. The multi\-user chat module is clustered but the rooms themselves are not clustered nor fault\-tolerant: if the node managing a set of rooms goes down, the rooms disappear and they will be recreated on an available node on first connection attempt\&.
|
||||
.sp
|
||||
.it 1 an-trap
|
||||
|
@ -3880,12 +4118,14 @@ To configure who is allowed to modify the
|
|||
room option\&. The default value is
|
||||
\fIall\fR, which means everyone is allowed to modify that option\&.
|
||||
.RE
|
||||
.sp
|
||||
\fINote\fR about the next option: improved in 23\&.10:
|
||||
.PP
|
||||
\fBaccess_register\fR: \fIAccessName\fR
|
||||
.RS 4
|
||||
This option specifies who is allowed to register nickname within the Multi\-User Chat service\&. The default is
|
||||
This option specifies who is allowed to register nickname within the Multi\-User Chat service and rooms\&. The default is
|
||||
\fIall\fR
|
||||
for backward compatibility, which means that any user is allowed to register any free nick\&.
|
||||
for backward compatibility, which means that any user is allowed to register any free nick in the MUC service and in the rooms\&.
|
||||
.RE
|
||||
.sp
|
||||
\fINote\fR about the next option: added in 22\&.05:
|
||||
|
@ -3907,7 +4147,7 @@ option, but applied to this module only\&.
|
|||
.PP
|
||||
\fBdefault_room_options\fR: \fIOptions\fR
|
||||
.RS 4
|
||||
This option allows to define the desired default room options\&. Note that the creator of a room can modify the options of his room at any time using an XMPP client with MUC capability\&. The
|
||||
Define the default room options\&. Note that the creator of a room can modify the options of his room at any time using an XMPP client with MUC capability\&. The
|
||||
\fIOptions\fR
|
||||
are:
|
||||
.PP
|
||||
|
@ -3917,12 +4157,6 @@ Allow occupants to change the subject\&. The default value is
|
|||
\fItrue\fR\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBallow_private_messages\fR: \fItrue | false\fR
|
||||
.RS 4
|
||||
Occupants can send private messages to other occupants\&. The default value is
|
||||
\fItrue\fR\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBallow_private_messages_from_visitors\fR: \fIanyone | moderators | nobody\fR
|
||||
.RS 4
|
||||
Visitors can send private messages to other occupants\&. The default value is
|
||||
|
@ -3967,6 +4201,12 @@ Allow visitors in a moderated room to request voice\&. The default value is
|
|||
\fItrue\fR\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBallowpm\fR: \fIanyone | participants | moderators | none\fR
|
||||
.RS 4
|
||||
Who can send private messages\&. The default value is
|
||||
\fIanyone\fR\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBanonymous\fR: \fItrue | false\fR
|
||||
.RS 4
|
||||
The room is anonymous: occupants don\(cqt see the real JIDs of other occupants\&. Note that the room moderators can always see the real JIDs of the occupants\&. The default value is
|
||||
|
@ -4489,7 +4729,7 @@ to a remote file\&. By default a predefined CSS will be embedded into the HTML p
|
|||
.PP
|
||||
\fBdirname\fR: \fIroom_jid | room_name\fR
|
||||
.RS 4
|
||||
Allows to configure the name of the room directory\&. If set to
|
||||
Configure the name of the room directory\&. If set to
|
||||
\fIroom_jid\fR, the room directory name will be the full room JID\&. Otherwise, the room directory name will be only the room name, not including the MUC service name\&. The default value is
|
||||
\fIroom_jid\fR\&.
|
||||
.RE
|
||||
|
@ -4583,6 +4823,43 @@ or a conference JID is appended to the
|
|||
otherwise\&. There is no default value\&.
|
||||
.RE
|
||||
.RE
|
||||
.SS "mod_muc_occupantid"
|
||||
.sp
|
||||
This module implements XEP\-0421: Anonymous unique occupant identifiers for MUCs\&.
|
||||
.sp
|
||||
When the module is enabled, the feature is enabled in all semi\-anonymous rooms\&.
|
||||
.sp
|
||||
This module is available since ejabberd 23\&.10\&.
|
||||
.sp
|
||||
The module has no options\&.
|
||||
.SS "mod_muc_rtbl"
|
||||
.sp
|
||||
This module implement Real\-time blocklists for MUC rooms\&.
|
||||
.sp
|
||||
It works by observing remote pubsub node conforming with specification described in https://xmppbl\&.org/\&.
|
||||
.sp
|
||||
This module is available since ejabberd 23\&.04\&.
|
||||
.sp
|
||||
.it 1 an-trap
|
||||
.nr an-no-space-flag 1
|
||||
.nr an-break-flag 1
|
||||
.br
|
||||
.ps +1
|
||||
\fBAvailable options:\fR
|
||||
.RS 4
|
||||
.PP
|
||||
\fBrtbl_node\fR: \fIPubsubNodeName\fR
|
||||
.RS 4
|
||||
Name of pubsub node that should be used to track blocked users\&. The default value is
|
||||
\fImuc_bans_sha256\fR\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBrtbl_server\fR: \fIDomain\fR
|
||||
.RS 4
|
||||
Domain of xmpp server that serves block list\&. The default value is
|
||||
\fIxmppbl\&.org\fR
|
||||
.RE
|
||||
.RE
|
||||
.SS "mod_multicast"
|
||||
.sp
|
||||
This module implements a service for XEP\-0033: Extended Stanza Addressing\&.
|
||||
|
@ -4893,7 +5170,11 @@ This module implements support for XEP\-0199: XMPP Ping and periodic keepalives\
|
|||
.PP
|
||||
\fBping_ack_timeout\fR: \fItimeout()\fR
|
||||
.RS 4
|
||||
How long to wait before deeming that a client has not answered a given server ping request\&. The default value is
|
||||
How long to wait before deeming that a client has not answered a given server ping request\&. NOTE: when
|
||||
\fImod_stream_mgmt\fR
|
||||
is loaded and stream management is enabled by a client, this value is ignored, and the
|
||||
ack_timeout
|
||||
applies instead\&. The default value is
|
||||
\fIundefined\fR\&.
|
||||
.RE
|
||||
.PP
|
||||
|
@ -5077,6 +5358,8 @@ This module adds support for XEP\-0049: Private XML Storage\&.
|
|||
.sp
|
||||
Using this method, XMPP entities can store private data on the server, retrieve it whenever necessary and share it between multiple connected clients of the same user\&. The data stored might be anything, as long as it is a valid XML\&. One typical usage is storing a bookmark of all user\(cqs conferences (XEP\-0048: Bookmarks)\&.
|
||||
.sp
|
||||
It also implements the bookmark conversion described in XEP\-0402: PEP Native Bookmarks, see the command bookmarks_to_pep\&.
|
||||
.sp
|
||||
.it 1 an-trap
|
||||
.nr an-no-space-flag 1
|
||||
.nr an-break-flag 1
|
||||
|
@ -5530,7 +5813,7 @@ or
|
|||
To specify whether or not pubsub should cache last items\&. Value is
|
||||
\fItrue\fR
|
||||
or
|
||||
\fIfalse\fR\&. If not defined, pubsub does not cache last items\&. On systems with not so many nodes, caching last items speeds up pubsub and allows to raise user connection rate\&. The cost is memory usage, as every item is stored in memory\&.
|
||||
\fIfalse\fR\&. If not defined, pubsub does not cache last items\&. On systems with not so many nodes, caching last items speeds up pubsub and allows you to raise the user connection rate\&. The cost is memory usage, as every item is stored in memory\&.
|
||||
.RE
|
||||
.sp
|
||||
\fINote\fR about the next option: added in 21\&.12:
|
||||
|
@ -5611,7 +5894,7 @@ nodetree before\&.
|
|||
.PP
|
||||
\fBpep_mapping\fR: \fIList of Key:Value\fR
|
||||
.RS 4
|
||||
This allows to define a list of key\-value to choose defined node plugins on given PEP namespace\&. The following example will use
|
||||
In this option you can provide a list of key\-value to choose defined node plugins on given PEP namespace\&. The following example will use
|
||||
\fInode_tune\fR
|
||||
instead of
|
||||
\fInode_pep\fR
|
||||
|
@ -5664,7 +5947,7 @@ plugin handles the default behaviour and follows standard XEP\-0060 implementati
|
|||
.IP \(bu 2.3
|
||||
.\}
|
||||
\fIpep\fR
|
||||
plugin adds extension to handle Personal Eventing Protocol (XEP\-0163) to the PubSub engine\&. Adding pep allows to handle PEP automatically\&.
|
||||
plugin adds extension to handle Personal Eventing Protocol (XEP\-0163) to the PubSub engine\&. When enabled, PEP is handled automatically\&.
|
||||
.RE
|
||||
.RE
|
||||
.PP
|
||||
|
@ -5818,6 +6101,16 @@ If this option is set to
|
|||
\fItrue\fR, the sender\(cqs JID is included with push notifications generated for incoming messages with a body\&. The default value is
|
||||
\fIfalse\fR\&.
|
||||
.RE
|
||||
.sp
|
||||
\fINote\fR about the next option: added in 23\&.10:
|
||||
.PP
|
||||
\fBnotify_on\fR: \fImessages | all\fR
|
||||
.RS 4
|
||||
If this option is set to
|
||||
\fImessages\fR, notifications are generated only for actual chat messages with a body text (or some encrypted payload)\&. If it\(cqs set to
|
||||
\fIall\fR, any kind of XMPP stanza will trigger a notification\&. If unsure, it\(cqs strongly recommended to stick to
|
||||
\fIall\fR, which is the default value\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBuse_cache\fR: \fItrue | false\fR
|
||||
.RS 4
|
||||
|
@ -5925,7 +6218,7 @@ on the requested username, registration of that user name is denied\&. There are
|
|||
.RS 4
|
||||
By default,
|
||||
\fIejabberd\fR
|
||||
doesn\(cqt allow to register new accounts from s2s or existing c2s sessions\&. You can change it by defining access rule in this option\&. Use with care: allowing registration from s2s leads to uncontrolled massive accounts creation by rogue users\&.
|
||||
doesn\(cqt allow the client to register new accounts from s2s or existing c2s sessions\&. You can change it by defining access rule in this option\&. Use with care: allowing registration from s2s leads to uncontrolled massive accounts creation by rogue users\&.
|
||||
.RE
|
||||
.PP
|
||||
\fBaccess_remove\fR: \fIAccessName\fR
|
||||
|
@ -6785,7 +7078,7 @@ It is not enough to just load this module\&. You should also configure listeners
|
|||
.PP
|
||||
\fBalways_record_route\fR: \fItrue | false\fR
|
||||
.RS 4
|
||||
Always insert "Record\-Route" header into SIP messages\&. This approach allows to bypass NATs/firewalls a bit more easily\&. The default value is
|
||||
Always insert "Record\-Route" header into SIP messages\&. With this approach it is possible to bypass NATs/firewalls a bit more easily\&. The default value is
|
||||
\fItrue\fR\&.
|
||||
.RE
|
||||
.PP
|
||||
|
@ -7628,13 +7921,13 @@ TODO
|
|||
ProcessOne\&.
|
||||
.SH "VERSION"
|
||||
.sp
|
||||
This document describes the configuration file of ejabberd 22\&.10\&. Configuration options of other ejabberd versions may differ significantly\&.
|
||||
This document describes the configuration file of ejabberd 24\&.02\&. Configuration options of other ejabberd versions may differ significantly\&.
|
||||
.SH "REPORTING BUGS"
|
||||
.sp
|
||||
Report bugs to https://github\&.com/processone/ejabberd/issues
|
||||
.SH "SEE ALSO"
|
||||
.sp
|
||||
Default configuration file: https://github\&.com/processone/ejabberd/blob/22\&.10/ejabberd\&.yml\&.example
|
||||
Default configuration file: https://github\&.com/processone/ejabberd/blob/24\&.02/ejabberd\&.yml\&.example
|
||||
.sp
|
||||
Main site: https://ejabberd\&.im
|
||||
.sp
|
||||
|
@ -7645,4 +7938,4 @@ Configuration Guide: https://docs\&.ejabberd\&.im/admin/configuration
|
|||
Source code: https://github\&.com/processone/ejabberd
|
||||
.SH "COPYING"
|
||||
.sp
|
||||
Copyright (c) 2002\-2022 ProcessOne\&.
|
||||
Copyright (c) 2002\-2024 ProcessOne\&.
|
||||
|
|
186
mix.exs
186
mix.exs
|
@ -3,31 +3,34 @@ defmodule Ejabberd.MixProject do
|
|||
|
||||
def project do
|
||||
[app: :ejabberd,
|
||||
source_url: "https://github.com/processone/ejabberd",
|
||||
version: version(),
|
||||
description: description(),
|
||||
elixir: elixir_required_version(),
|
||||
elixirc_paths: ["lib"],
|
||||
compile_path: ".",
|
||||
compilers: [:asn1] ++ Mix.compilers,
|
||||
compilers: [:asn1, :yecc] ++ Mix.compilers(),
|
||||
erlc_options: erlc_options(),
|
||||
erlc_paths: ["asn1", "src"],
|
||||
# Elixir tests are starting the part of ejabberd they need
|
||||
aliases: [test: "test --no-start"],
|
||||
start_permanent: Mix.env() == :prod,
|
||||
language: :erlang,
|
||||
dialyzer: dialyzer(),
|
||||
releases: releases(),
|
||||
package: package(),
|
||||
docs: docs(),
|
||||
deps: deps()]
|
||||
end
|
||||
|
||||
def version do
|
||||
case config(:vsn) do
|
||||
:false -> "0.0.0" # ./configure wasn't run: vars.config not created
|
||||
'0.0' -> "0.0.0" # the full git repository wasn't downloaded
|
||||
'latest.0' -> "0.0.0" # running 'docker-ejabberd/ecs/build.sh latest'
|
||||
~c"0.0" -> "0.0.0" # the full git repository wasn't downloaded
|
||||
~c"latest.0" -> "0.0.0" # running 'docker-ejabberd/ecs/build.sh latest'
|
||||
[_, _, ?., _, _] = x ->
|
||||
head = String.replace(:erlang.list_to_binary(x), ~r/\.0+([0-9])/, ".\\1")
|
||||
<<head::binary, ".0">>
|
||||
"#{head}.0"
|
||||
vsn -> String.replace(:erlang.list_to_binary(vsn), ~r/\.0+([0-9])/, ".\\1")
|
||||
end
|
||||
end
|
||||
|
@ -40,14 +43,25 @@ defmodule Ejabberd.MixProject do
|
|||
|
||||
def application do
|
||||
[mod: {:ejabberd_app, []},
|
||||
extra_applications: [:mix],
|
||||
applications: [:idna, :inets, :kernel, :sasl, :ssl, :stdlib,
|
||||
:base64url, :fast_tls, :fast_xml, :fast_yaml, :jiffy, :jose,
|
||||
:p1_utils, :stringprep, :syntax_tools, :yconf],
|
||||
applications: [:idna, :inets, :kernel, :sasl, :ssl, :stdlib, :mix,
|
||||
:fast_tls, :fast_xml, :fast_yaml, :jose,
|
||||
:p1_utils, :stringprep, :syntax_tools, :yconf, :xmpp]
|
||||
++ cond_apps(),
|
||||
included_applications: [:mnesia, :os_mon,
|
||||
:cache_tab, :eimp, :mqtree, :p1_acme,
|
||||
:p1_oauth2, :pkix, :xmpp]
|
||||
++ cond_apps()]
|
||||
:p1_oauth2, :pkix]
|
||||
++ cond_included_apps()]
|
||||
end
|
||||
|
||||
defp dialyzer do
|
||||
[
|
||||
plt_add_apps: [
|
||||
:mnesia, :odbc, :os_mon, :stdlib,
|
||||
:eredis, :luerl,
|
||||
:cache_tab, :eimp, :epam, :esip, :ezlib, :mqtree,
|
||||
:p1_acme, :p1_mysql, :p1_oauth2, :p1_pgsql, :pkix,
|
||||
:sqlite3, :stun, :xmpp],
|
||||
]
|
||||
end
|
||||
|
||||
defp if_version_above(ver, okResult) do
|
||||
|
@ -66,22 +80,40 @@ defmodule Ejabberd.MixProject do
|
|||
end
|
||||
end
|
||||
|
||||
defp if_type_exported(module, typeDef, okResult) do
|
||||
try do
|
||||
{:ok, concrete} = :dialyzer_utils.get_core_from_beam(:code.which(module))
|
||||
{:ok, types} = :dialyzer_utils.get_record_and_type_info(concrete)
|
||||
if Map.has_key?(types, typeDef) do
|
||||
okResult
|
||||
else
|
||||
[]
|
||||
end
|
||||
rescue
|
||||
_ -> []
|
||||
end
|
||||
end
|
||||
|
||||
defp erlc_options do
|
||||
# Use our own includes + includes from all dependencies
|
||||
includes = ["include"] ++ deps_include(["fast_xml", "xmpp", "p1_utils"])
|
||||
includes = ["include", deps_include()]
|
||||
result = [{:d, :ELIXIR_ENABLED}] ++
|
||||
cond_options() ++
|
||||
Enum.map(includes, fn (path) -> {:i, path} end) ++
|
||||
if_version_above('20', [{:d, :DEPRECATED_GET_STACKTRACE}]) ++
|
||||
if_version_above('20', [{:d, :HAVE_URI_STRING}]) ++
|
||||
if_version_above('20', [{:d, :HAVE_ERL_ERROR}]) ++
|
||||
if_version_below('21', [{:d, :USE_OLD_HTTP_URI}]) ++
|
||||
if_version_below('22', [{:d, :LAGER}]) ++
|
||||
if_version_below('21', [{:d, :NO_CUSTOMIZE_HOSTNAME_CHECK}]) ++
|
||||
if_version_below('23', [{:d, :USE_OLD_CRYPTO_HMAC}]) ++
|
||||
if_version_below('23', [{:d, :USE_OLD_PG2}]) ++
|
||||
if_version_below('24', [{:d, :COMPILER_REPORTS_ONLY_LINES}]) ++
|
||||
if_version_below('24', [{:d, :SYSTOOLS_APP_DEF_WITHOUT_OPTIONAL}])
|
||||
if_version_above(~c"20", [{:d, :DEPRECATED_GET_STACKTRACE}]) ++
|
||||
if_version_above(~c"20", [{:d, :HAVE_URI_STRING}]) ++
|
||||
if_version_above(~c"20", [{:d, :HAVE_ERL_ERROR}]) ++
|
||||
if_version_below(~c"21", [{:d, :USE_OLD_HTTP_URI}]) ++
|
||||
if_version_below(~c"22", [{:d, :LAGER}]) ++
|
||||
if_version_below(~c"21", [{:d, :NO_CUSTOMIZE_HOSTNAME_CHECK}]) ++
|
||||
if_version_below(~c"23", [{:d, :USE_OLD_CRYPTO_HMAC}]) ++
|
||||
if_version_below(~c"23", [{:d, :USE_OLD_PG2}]) ++
|
||||
if_version_below(~c"24", [{:d, :COMPILER_REPORTS_ONLY_LINES}]) ++
|
||||
if_version_below(~c"24", [{:d, :SYSTOOLS_APP_DEF_WITHOUT_OPTIONAL}]) ++
|
||||
if_version_below(~c"24", [{:d, :OTP_BELOW_24}]) ++
|
||||
if_version_below(~c"25", [{:d, :OTP_BELOW_25}]) ++
|
||||
if_version_below(~c"27", [{:d, :OTP_BELOW_27}]) ++
|
||||
if_type_exported(:odbc, {:opaque, :connection_reference, 0}, [{:d, :ODBC_HAS_TYPES}])
|
||||
defines = for {:d, value} <- result, do: {:d, value}
|
||||
result ++ [{:d, :ALL_DEFS, defines}]
|
||||
end
|
||||
|
@ -98,29 +130,27 @@ defmodule Ejabberd.MixProject do
|
|||
end
|
||||
|
||||
defp deps do
|
||||
[{:base64url, "~> 1.0"},
|
||||
{:cache_tab, "~> 1.0"},
|
||||
[{:cache_tab, "~> 1.0"},
|
||||
{:dialyxir, "~> 1.2", only: [:test], runtime: false},
|
||||
{:eimp, "~> 1.0"},
|
||||
{:ex_doc, ">= 0.0.0", only: :dev},
|
||||
{:fast_tls, "~> 1.1"},
|
||||
{:fast_xml, "~> 1.1"},
|
||||
{:ex_doc, "~> 0.31", only: [:dev, :edoc], runtime: false},
|
||||
{:fast_tls, ">= 1.1.18"},
|
||||
{:fast_xml, ">= 1.1.51"},
|
||||
{:fast_yaml, "~> 1.0"},
|
||||
{:idna, "~> 6.0"},
|
||||
{:jiffy, "~> 1.1.1"},
|
||||
{:jose, "~> 1.11.1"},
|
||||
{:mqtree, "~> 1.0"},
|
||||
{:p1_acme, "~> 1.0"},
|
||||
{:p1_acme, git: "https://github.com/processone/p1_acme", branch: "master"},
|
||||
{:p1_oauth2, "~> 0.6"},
|
||||
{:p1_utils, "~> 1.0"},
|
||||
{:pkix, "~> 1.0"},
|
||||
{:pkix, git: "https://github.com/processone/pkix"},
|
||||
{:stringprep, ">= 1.0.26"},
|
||||
{:xmpp, ">= 1.6.0"},
|
||||
{:xmpp, git: "https://github.com/processone/xmpp", override: true},
|
||||
{:yconf, "~> 1.0"}]
|
||||
++ cond_deps()
|
||||
end
|
||||
|
||||
defp deps_include(deps) do
|
||||
base = if Mix.Project.umbrella?() do
|
||||
defp deps_include() do
|
||||
if Mix.Project.umbrella?() do
|
||||
"../../deps"
|
||||
else
|
||||
case Mix.Project.deps_paths()[:ejabberd] do
|
||||
|
@ -128,28 +158,44 @@ defmodule Ejabberd.MixProject do
|
|||
_ -> ".."
|
||||
end
|
||||
end
|
||||
Enum.map(deps, fn dep -> base<>"/#{dep}/include" end)
|
||||
end
|
||||
|
||||
defp cond_deps do
|
||||
for {:true, dep} <- [{config(:pam), {:epam, "~> 1.0"}},
|
||||
{Mix.env() == :translations,
|
||||
{:ejabberd_po, git: "https://github.com/processone/ejabberd-po.git"}},
|
||||
{Mix.env() == :dev,
|
||||
{:exsync, "~> 0.2"}},
|
||||
{config(:redis), {:eredis, "~> 1.2.0"}},
|
||||
{config(:sip), {:esip, "~> 1.0"}},
|
||||
{config(:zlib), {:ezlib, "~> 1.0"}},
|
||||
{if_version_below('22', true), {:lager, "~> 3.9.1"}},
|
||||
{config(:lua), {:luerl, "~> 1.0"}},
|
||||
{config(:mysql), {:p1_mysql, "~> 1.0.20"}},
|
||||
{config(:pgsql), {:p1_pgsql, "~> 1.1"}},
|
||||
{if_version_above(~c"23", true), {:jose, "~> 1.11.10"}},
|
||||
{if_version_below(~c"24", true), {:jose, "1.11.1"}},
|
||||
{if_version_below(~c"27", true), {:jiffy, "~> 1.1.1"}},
|
||||
{if_version_below(~c"22", true), {:lager, "~> 3.9.1"}},
|
||||
{config(:lua), {:luerl, "~> 1.2.0"}},
|
||||
{config(:mysql), {:p1_mysql, git: "https://github.com/processone/p1_mysql" }},
|
||||
{config(:pgsql), {:p1_pgsql, git: "https://github.com/processone/p1_pgsql"}},
|
||||
{config(:sqlite), {:sqlite3, "~> 1.1"}},
|
||||
{config(:stun), {:stun, "~> 1.0"}}], do:
|
||||
dep
|
||||
end
|
||||
|
||||
defp cond_apps do
|
||||
for {:true, app} <- [{config(:stun), :stun},
|
||||
{Map.has_key?(System.get_env(), "RELIVE"), :exsync},
|
||||
{if_version_below(~c"27", true), :jiffy},
|
||||
{config(:tools), :observer}], do:
|
||||
app
|
||||
end
|
||||
|
||||
defp cond_included_apps do
|
||||
for {:true, app} <- [{config(:pam), :epam},
|
||||
{config(:lua), :luerl},
|
||||
{config(:redis), :eredis},
|
||||
{if_version_below('22', true), :lager},
|
||||
{Mix.env() == :edoc, :ex_doc},
|
||||
{Mix.env() == :test, :dialyxir},
|
||||
{if_version_below(~c"22", true), :lager},
|
||||
{config(:mysql), :p1_mysql},
|
||||
{config(:sip), :esip},
|
||||
{config(:odbc), :odbc},
|
||||
|
@ -165,16 +211,26 @@ defmodule Ejabberd.MixProject do
|
|||
"mix.exs", "rebar.config", "rebar.config.script", "vars.config"],
|
||||
maintainers: ["ProcessOne"],
|
||||
licenses: ["GPL-2.0-or-later"],
|
||||
links: %{"Site" => "https://www.ejabberd.im",
|
||||
"Documentation" => "http://docs.ejabberd.im",
|
||||
"Source" => "https://github.com/processone/ejabberd",
|
||||
links: %{"ejabberd.im" => "https://www.ejabberd.im",
|
||||
"ejabberd Docs" => "http://docs.ejabberd.im",
|
||||
"GitHub" => "https://github.com/processone/ejabberd",
|
||||
"ProcessOne" => "http://www.process-one.net/"}]
|
||||
end
|
||||
|
||||
defp vars do
|
||||
case :file.consult("vars.config") do
|
||||
filepath = case Application.fetch_env(:ejabberd, :vars_config_path) do
|
||||
:error ->
|
||||
"vars.config"
|
||||
{:ok, path} ->
|
||||
path
|
||||
end
|
||||
config2 = case :file.consult(filepath) do
|
||||
{:ok,config} -> config
|
||||
_ -> [zlib: true]
|
||||
_ -> [stun: true, zlib: true]
|
||||
end
|
||||
case Mix.env() do
|
||||
:dev -> List.keystore(config2, :tools, 0, {:tools, true})
|
||||
_ -> config2
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -203,7 +259,7 @@ defmodule Ejabberd.MixProject do
|
|||
_ -> :ok
|
||||
end
|
||||
case Version.match?(System.version(), "< 1.11.4")
|
||||
and :erlang.system_info(:otp_release) > '23' do
|
||||
and :erlang.system_info(:otp_release) > ~c"23" do
|
||||
true ->
|
||||
IO.puts("ERROR: To build releases with Elixir lower than 1.11.4, Erlang/OTP lower than 24 is required.")
|
||||
_ -> :ok
|
||||
|
@ -239,6 +295,8 @@ defmodule Ejabberd.MixProject do
|
|||
config_dir: config(:config_dir),
|
||||
logs_dir: config(:logs_dir),
|
||||
spool_dir: config(:spool_dir),
|
||||
vsn: version(),
|
||||
iexpath: config(:iexpath),
|
||||
erl: config(:erl),
|
||||
epmd: config(:epmd),
|
||||
bindir: Path.join([config(:release_dir), "releases", version()]),
|
||||
|
@ -253,14 +311,14 @@ defmodule Ejabberd.MixProject do
|
|||
execute = fn(command) ->
|
||||
case function_exported?(System, :shell, 1) do
|
||||
true ->
|
||||
System.shell(command)
|
||||
System.shell(command, into: IO.stream())
|
||||
false ->
|
||||
:os.cmd(to_charlist(command))
|
||||
end
|
||||
end
|
||||
|
||||
# Mix/Elixir lower than 1.11.0 use config/releases.exs instead of runtime.exs
|
||||
case Version.match?(System.version, "~> 1.11") do
|
||||
case Version.match?(System.version(), "~> 1.11") do
|
||||
true ->
|
||||
:ok
|
||||
false ->
|
||||
|
@ -271,8 +329,7 @@ defmodule Ejabberd.MixProject do
|
|||
Mix.Generator.copy_template("ejabberdctl.example1", "ejabberdctl.example2", assigns)
|
||||
execute.("sed -e 's|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.example2> ejabberdctl.example2a")
|
||||
Mix.Generator.copy_template("ejabberdctl.example2a", "ejabberdctl.example2b", assigns)
|
||||
execute.("sed -e 's|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.example2b > ejabberdctl.example3")
|
||||
execute.("sed -e 's|^ERLANG_NODE=ejabberd@localhost|ERLANG_NODE=ejabberd|g' ejabberdctl.example3 > ejabberdctl.example4")
|
||||
execute.("sed -e 's|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.example2b > ejabberdctl.example4")
|
||||
execute.("sed -e 's|^ERLANG_OPTS=\"|ERLANG_OPTS=\"-boot ../releases/#{release.version}/start_clean -boot_var RELEASE_LIB ../lib |' ejabberdctl.example4 > ejabberdctl.example5")
|
||||
execute.("sed -e 's|^INSTALLUSER=|ERL_OPTIONS=\"-setcookie \\$\\(cat \"\\${SCRIPT_DIR%/*}/releases/COOKIE\")\"\\nINSTALLUSER=|g' ejabberdctl.example5 > ejabberdctl.example6")
|
||||
Mix.Generator.copy_template("ejabberdctl.example6", "#{ro}/bin/ejabberdctl", assigns)
|
||||
|
@ -320,13 +377,38 @@ defmodule Ejabberd.MixProject do
|
|||
end
|
||||
|
||||
case Mix.env() do
|
||||
:dev -> execute.("REL_DIR_TEMP=$PWD/rel/overlays/ rel/setup-dev.sh")
|
||||
:dev -> execute.("REL_DIR_TEMP=$PWD/rel/overlays/ rel/setup-dev.sh mix")
|
||||
_ -> :ok
|
||||
end
|
||||
|
||||
release
|
||||
end
|
||||
|
||||
defp docs do
|
||||
[
|
||||
main: "readme",
|
||||
logo: "_build/edoc/logo.png",
|
||||
source_ref: "master",
|
||||
extra_section: "", # No need for Pages section name, it's the only one
|
||||
api_reference: false, # API section has just Elixir, hide it
|
||||
filter_modules: "aaaaa", # Module section has just Elixir modules, hide them
|
||||
extras: [
|
||||
"README.md": [title: "Readme"],
|
||||
"COMPILE.md": [title: "Compile and Install"],
|
||||
"CONTAINER.md": [title: "Container Image"],
|
||||
"CONTRIBUTING.md": [title: "Contributing"],
|
||||
"CONTRIBUTORS.md": [title: "Contributors"],
|
||||
"CODE_OF_CONDUCT.md": [title: "Code of Conduct"],
|
||||
"CHANGELOG.md": [title: "ChangeLog"],
|
||||
"COPYING": [title: "Copying License"],
|
||||
"_build/edoc/docs.md": [title: "⟹ ejabberd Docs"]
|
||||
],
|
||||
groups_for_extras: [
|
||||
"": Path.wildcard("*.md") ++ ["COPYING"],
|
||||
"For more documentation": "_build/edoc/docs.md"
|
||||
]
|
||||
]
|
||||
end
|
||||
end
|
||||
|
||||
defmodule Mix.Tasks.Compile.Asn1 do
|
||||
|
@ -339,7 +421,7 @@ defmodule Mix.Tasks.Compile.Asn1 do
|
|||
def run(args) do
|
||||
{opts, _, _} = OptionParser.parse(args, switches: [force: :boolean])
|
||||
|
||||
project = Mix.Project.config
|
||||
project = Mix.Project.config()
|
||||
source_paths = project[:asn1_paths] || ["asn1"]
|
||||
dest_paths = project[:asn1_target] || ["src"]
|
||||
mappings = Enum.zip(source_paths, dest_paths)
|
||||
|
@ -361,7 +443,7 @@ defmodule Mix.Tasks.Compile.Asn1 do
|
|||
end
|
||||
|
||||
def manifests, do: [manifest()]
|
||||
defp manifest, do: Path.join(Mix.Project.manifest_path, @manifest)
|
||||
defp manifest, do: Path.join(Mix.Project.manifest_path(), @manifest)
|
||||
|
||||
def clean, do: Erlang.clean(manifest())
|
||||
end
|
||||
|
|
54
mix.lock
54
mix.lock
|
@ -1,35 +1,39 @@
|
|||
%{
|
||||
"base64url": {:hex, :base64url, "1.0.1", "f8c7f2da04ca9a5d0f5f50258f055e1d699f0e8bf4cfdb30b750865368403cf6", [:rebar3], [], "hexpm", "f9b3add4731a02a9b0410398b475b33e7566a695365237a6bdee1bb447719f5c"},
|
||||
"cache_tab": {:hex, :cache_tab, "1.0.30", "6d35eecfb65fbe5fc85988503a27338d32de01243f3fc8ea3ee7161af08725a4", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "6d8a5e00d8f84c42627706a6dbedb02e34d58495f3ed61935c8475ca0531cda0"},
|
||||
"earmark_parser": {:hex, :earmark_parser, "1.4.25", "2024618731c55ebfcc5439d756852ec4e85978a39d0d58593763924d9a15916f", [:mix], [], "hexpm", "56749c5e1c59447f7b7a23ddb235e4b3defe276afc220a6227237f3efe83f51e"},
|
||||
"dialyxir": {:hex, :dialyxir, "1.4.3", "edd0124f358f0b9e95bfe53a9fcf806d615d8f838e2202a9f430d59566b6b53b", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "bf2cfb75cd5c5006bec30141b131663299c661a864ec7fbbc72dfa557487a986"},
|
||||
"earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"},
|
||||
"eimp": {:hex, :eimp, "1.0.22", "fa9b376ef0b50e8455db15c7c11dea4522c6902e04412288aab436d26335f6eb", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "b3b9ffb1d9a5f4a2ba88ac418a819164932d9a9d3a2fc3d32ca338ce855c4392"},
|
||||
"epam": {:hex, :epam, "1.0.12", "2a5625d4133bca4b3943791a3f723ba764455a461ae9b6ba5debb262efcf4b40", [:rebar3], [], "hexpm", "54c166c4459cef72f2990a3d89a8f0be27180fe0ab0f24b28ddcc3b815f49f7f"},
|
||||
"epam": {:hex, :epam, "1.0.14", "aa0b85d27f4ef3a756ae995179df952a0721237e83c6b79d644347b75016681a", [:rebar3], [], "hexpm", "2f3449e72885a72a6c2a843f561add0fc2f70d7a21f61456930a547473d4d989"},
|
||||
"eredis": {:hex, :eredis, "1.2.0", "0b8e9cfc2c00fa1374cd107ea63b49be08d933df2cf175e6a89b73dd9c380de4", [:rebar3], [], "hexpm", "d9b5abef2c2c8aba8f32aa018203e0b3dc8b1157773b254ab1d4c2002317f1e1"},
|
||||
"esip": {:hex, :esip, "1.0.48", "3b3b3afc798be9458517d4fd2730674322368e54c2c1211aa630327354946d1b", [:rebar3], [{:fast_tls, "1.1.16", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.2.6", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "02b9fc6e071415cbc62105f5115aeb68d11184bdad3960da7b62ea3e99e7fccf"},
|
||||
"ex_doc": {:hex, :ex_doc, "0.28.4", "001a0ea6beac2f810f1abc3dbf4b123e9593eaa5f00dd13ded024eae7c523298", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "bf85d003dd34911d89c8ddb8bda1a958af3471a274a4c2150a9c01c78ac3f8ed"},
|
||||
"erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"},
|
||||
"esip": {:hex, :esip, "1.0.52", "a2840287c493a4280e6fba57a257706843b025c315875e38b03fd07190e22dba", [:rebar3], [{:fast_tls, "1.1.19", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.2.12", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "6f00165395900500aa262ce0297162d93931c78c1464d89fd0edc6e3d6bc011f"},
|
||||
"ex_doc": {:hex, :ex_doc, "0.33.0", "690562b153153c7e4d455dc21dab86e445f66ceba718defe64b0ef6f0bd83ba0", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "3f69adc28274cb51be37d09b03e4565232862a4b10288a3894587b0131412124"},
|
||||
"exsync": {:hex, :exsync, "0.4.1", "0a14fe4bfcb80a509d8a0856be3dd070fffe619b9ba90fec13c58b316c176594", [:mix], [{:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "cefb22aa805ec97ffc5b75a4e1dc54bcaf781e8b32564bf74abbe5803d1b5178"},
|
||||
"ezlib": {:hex, :ezlib, "1.0.12", "ffe906ba10d03aaee7977e1e0e81d9ffc3bb8b47fb9cd8e2e453507a2e56221f", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "30e94355fb42260aab6e12582cb0c56bf233515e655c8aeaf48760e7561e4ebb"},
|
||||
"fast_tls": {:hex, :fast_tls, "1.1.16", "85fa7f3112ea4ff5ccb4f3abadc130a8c855ad74eb00869487399cb0c322d208", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "aa08cca89b4044e74f1f12e399817d8beaeae3ee006c98a893c0bfb1d81fba51"},
|
||||
"fast_xml": {:hex, :fast_xml, "1.1.49", "67d9bfcadd04efd930e0ee1412b5ea09d3e791f1fdbd4d3e9a8c8f29f8bfed8c", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "01da064d2f740818956961036637fee2475c17bf8aab9442217f90dc77883593"},
|
||||
"fast_yaml": {:hex, :fast_yaml, "1.0.34", "3be1ed8a37fe87a53f7f2ad1ee9586dcc257103d0b1d1f0ee6306cad9d54c29a", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "926dc1798399418d3983bd53356f3395b01c07a550f6b8d1dd5d6cc07c22c1c9"},
|
||||
"idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "4bdd305eb64e18b0273864920695cb18d7a2021f31a11b9c5fbcd9a253f936e2"},
|
||||
"fast_tls": {:hex, :fast_tls, "1.1.19", "f52731a4b35259fa06cf23e2a0732920ad9efce7c3d68377f129a474998747bb", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "db34322c8782d4c5139ccb80709d8ec8c38089b44262edd0c2f660ac495bd389"},
|
||||
"fast_xml": {:hex, :fast_xml, "1.1.51", "a7f8c6942591632309099386d5c339c89997ac2bbdd1216f6c196dee6d7828a9", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "7fce41b7d1a4ba438a2d7a088dabe74a3ca0739f1af2abcb77e62daf43e0409a"},
|
||||
"fast_yaml": {:hex, :fast_yaml, "1.0.36", "65413a34a570fd4e205a460ba602e4ee7a682f35c22d2e1c839025dbf515105c", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "1abe8f758fc2a86b08edff80bbc687cfd41ebc1412cfec0ef4a0acfcd032052f"},
|
||||
"file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"},
|
||||
"idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
|
||||
"jiffy": {:hex, :jiffy, "1.1.1", "aca10f47aa91697bf24ab9582c74e00e8e95474c7ef9f76d4f1a338d0f5de21b", [:rebar3], [], "hexpm", "62e1f0581c3c19c33a725c781dfa88410d8bff1bbafc3885a2552286b4785c4c"},
|
||||
"jose": {:hex, :jose, "1.11.1", "59da64010c69aad6cde2f5b9248b896b84472e99bd18f246085b7b9fe435dcdb", [:mix, :rebar3], [], "hexpm", "078f6c9fb3cd2f4cfafc972c814261a7d1e8d2b3685c0a76eb87e158efff1ac5"},
|
||||
"luerl": {:hex, :luerl, "1.0.0", "1b68c30649323590d5339b967b419260500ffe520cd3abc1987482a82d3b5a6c", [:rebar3], [], "hexpm", "c17bc45cb4b0845ec975387f9a5d8c81ab60456698527a29c96f78992af86bd1"},
|
||||
"makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"},
|
||||
"makeup_elixir": {:hex, :makeup_elixir, "0.16.0", "f8c570a0d33f8039513fbccaf7108c5d750f47d8defd44088371191b76492b0b", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "28b2cbdc13960a46ae9a8858c4bebdec3c9a6d7b4b9e7f4ed1502f8159f338e7"},
|
||||
"makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"},
|
||||
"mqtree": {:hex, :mqtree, "1.0.15", "bc54d8b88698fdaebc1e27a9ac43688b927e3dbc05bd5cee4057e69a89a8cf17", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "294ac43c9b3d372e24eeea56c259e19c655522dcff64a55c401a639663b9d829"},
|
||||
"nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"},
|
||||
"p1_acme": {:hex, :p1_acme, "1.0.20", "c976cbca2dd1bdcf71a6e17fb512e30451b5f258694157f7b63963767ee26560", [:rebar3], [{:base64url, "1.0.1", [hex: :base64url, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "1.1.1", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "1.11.1", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "1.0.14", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "70e0ecf8c8729dfc01f6a15279ef9fa4003c3b5af47b6732d9312296a8ba4f5c"},
|
||||
"p1_mysql": {:hex, :p1_mysql, "1.0.20", "08aeade83a24902a5fca2dbf78fa674eef25ca4e66250b4be8bd3580f35880e7", [:rebar3], [], "hexpm", "12152e8feadcf8ce586334314ca27cb088f12e0a5c850c496a8df69859390877"},
|
||||
"p1_oauth2": {:hex, :p1_oauth2, "0.6.11", "96b4e85c08355720523c2f892011a81a07994d15c179ce4dd82d704fecad15b2", [:rebar3], [], "hexpm", "9c3c6ae59382b9525473bb02a32949889808f33f95f6db10594fd92acd1f63db"},
|
||||
"p1_pgsql": {:hex, :p1_pgsql, "1.1.19", "dc615844fd22a2e45182018d5bcc6b757ac19f576fab3fe6d69e1c0ff25cee2b", [:rebar3], [{:xmpp, "1.6.0", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "4b0c6d30bbf881feb01171d13f444a6e05e1d19b6926e3f56f4028823d02730b"},
|
||||
"jose": {:hex, :jose, "1.11.10", "a903f5227417bd2a08c8a00a0cbcc458118be84480955e8d251297a425723f83", [:mix, :rebar3], [], "hexpm", "0d6cd36ff8ba174db29148fc112b5842186b68a90ce9fc2b3ec3afe76593e614"},
|
||||
"luerl": {:hex, :luerl, "1.2.0", "60f05f4240f0e7c148ddb79b67b8ff972734aad237aa74c83d0748b8214c8ef0", [:rebar3], [], "hexpm", "9cafd4f6094ff0f5a9d278fd81d60d3e026c820bdfb6cacd4b1bd909f21b525d"},
|
||||
"makeup": {:hex, :makeup, "1.1.2", "9ba8837913bdf757787e71c1581c21f9d2455f4dd04cfca785c70bbfff1a76a3", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cce1566b81fbcbd21eca8ffe808f33b221f9eee2cbc7a1706fc3da9ff18e6cac"},
|
||||
"makeup_elixir": {:hex, :makeup_elixir, "0.16.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"},
|
||||
"makeup_erlang": {:hex, :makeup_erlang, "1.0.0", "6f0eff9c9c489f26b69b61440bf1b238d95badae49adac77973cbacae87e3c2e", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "ea7a9307de9d1548d2a72d299058d1fd2339e3d398560a0e46c27dab4891e4d2"},
|
||||
"mqtree": {:hex, :mqtree, "1.0.16", "f8f8b4971e4ca94313ba9bcaaa1aa1077daaba5e3fd3468ffb491420a4cc3593", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "c87d1c95575db65af29b795c9daa3bed43f5c1bf84072a74469659bcf53594eb"},
|
||||
"nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"},
|
||||
"p1_acme": {:git, "https://github.com/processone/p1_acme", "176b4a8c67627c3229fbea3c05d82a5d567e6e49", [branch: "master"]},
|
||||
"p1_mysql": {:git, "https://github.com/processone/p1_mysql", "0dccb755a60cda61d41e7b092b344d38d1ebc802", []},
|
||||
"p1_oauth2": {:hex, :p1_oauth2, "0.6.14", "1c5f82535574de87e2059695ac4b91f8f9aebacbc1c80287dae6f02552d47aea", [:rebar3], [], "hexpm", "1fd3ac474e43722d9d5a87c6df8d36f698ed87af7bb81cbbb66361451d99ae8f"},
|
||||
"p1_pgsql": {:git, "https://github.com/processone/p1_pgsql", "fe0bb2a2a2ae21cd9fc48b81520cfce508520a56", []},
|
||||
"p1_utils": {:hex, :p1_utils, "1.0.25", "2d39b5015a567bbd2cc7033eeb93a7c60d8c84efe1ef69a3473faa07fa268187", [:rebar3], [], "hexpm", "9219214428f2c6e5d3187ff8eb9a8783695c2427420be9a259840e07ada32847"},
|
||||
"pkix": {:hex, :pkix, "1.0.9", "eb20b2715d71a23b4fe7e754dae9281a964b51113d0bba8adf9da72bf9d65ac2", [:rebar3], [], "hexpm", "daab2c09cdd4eda05c9b45a5c00e994a1a5f27634929e1377e2e59b707103e3a"},
|
||||
"sqlite3": {:hex, :sqlite3, "1.1.13", "94a6e0508936514e1493efeb9b939a9bbfa861f4b8dc93ef174ae88a1d9381d3", [:rebar3], [], "hexpm", "b77fad096d1ae9553ad8551ea75bd0d64a2f5b09923a7ca48b14215564dbfc48"},
|
||||
"pkix": {:git, "https://github.com/processone/pkix", "03be27c7168449bdfeb8c5b6cc0f800f71f8cfe9", []},
|
||||
"sqlite3": {:hex, :sqlite3, "1.1.14", "f9ea0cff8540865fdfdb7e24eef34dc46677364b1c070896e99b5bf08c8a7fd7", [:rebar3], [], "hexpm", "85054b6ca297343c159ed6794a473ff2c8eeabd854b6fe02f711c0bfd373ce86"},
|
||||
"stringprep": {:hex, :stringprep, "1.0.29", "02f23e8c3a219a3dfe40a22e908bece3a2f68af0ff599ea8a7b714ecb21e62ee", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "928eba304c3006eb1512110ebd7b87db163b00859a09375a1e4466152c6c462a"},
|
||||
"stun": {:hex, :stun, "1.2.6", "5d1978d340ea20efb28bc1e58779a3a1d64568c66168db4d20692e76ce813d5e", [:rebar3], [{:fast_tls, "1.1.16", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "21aed098457e5099e925129459590592e001c470cf7503e5614a7a6b688ff146"},
|
||||
"unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm", "1d1848c40487cdb0b30e8ed975e34e025860c02e419cb615d255849f3427439d"},
|
||||
"xmpp": {:hex, :xmpp, "1.6.0", "2ca2180eac1a97e929d1cfa1e4faabef4f32a719331c7f56e47d305c0ec8e438", [:rebar3], [{:ezlib, "1.0.12", [hex: :ezlib, repo: "hexpm", optional: false]}, {:fast_tls, "1.1.16", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:fast_xml, "1.1.49", [hex: :fast_xml, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stringprep, "1.0.29", [hex: :stringprep, repo: "hexpm", optional: false]}], "hexpm", "5fd723c95bce79600a8f44ba79cf5d3b1dac80af65493a4a414e39791f7dd7e9"},
|
||||
"yconf": {:hex, :yconf, "1.0.14", "b216f385f729b338385b25176f6e4fe8cabfdf7ede9c40a35b2e77fc93e98fc8", [:rebar3], [{:fast_yaml, "1.0.34", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "a8a9262553c11ed4cd13cc8e656e53acb00f9385f0a50cd235af7d02e9204bce"},
|
||||
"stun": {:hex, :stun, "1.2.12", "a65df67a8aaaecb6a94d687977b2e9f161820819910cb97bbe26a3525356525b", [:rebar3], [{:fast_tls, "1.1.19", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "a2055032b6d338d0454142004bcb12fafb0c64ab1f273f1d0c6923ebbc8ede40"},
|
||||
"unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"},
|
||||
"xmpp": {:git, "https://github.com/processone/xmpp", "a1fb778bd385d832f913e564558152ea507dac37", []},
|
||||
"yconf": {:hex, :yconf, "1.0.15", "e22998b3d7728270bdd06162a9515bd142b14fae8927cbdbd3ef639c32aa6f7a", [:rebar3], [{:fast_yaml, "1.0.36", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "7ff2ab24d3c9833842716b9aaaa01a8f96641a7695cbb701b03445c4def01117"},
|
||||
}
|
||||
|
|
|
@ -16,12 +16,14 @@ a.roomjid {color: #336699; font-size: 24px; font-weight: bold; font-family: sans
|
|||
div.logdate {color: #663399; font-size: 20px; font-weight: bold; font-family: sans-serif; letter-spacing: 2px; border-bottom: #224466 solid 1pt; margin-left:80pt; margin-top:20px;}
|
||||
div.roomsubject {color: #336699; font-size: 18px; font-family: sans-serif; margin-left: 80pt; margin-bottom: 10px;}
|
||||
div.rc {color: #336699; font-size: 12px; font-family: sans-serif; margin-left: 50%; text-align: right; background: #f3f6f9; border-bottom: 1px solid #336699; border-right: 4px solid #336699;}
|
||||
div.rct {font-weight: bold; background: #e3e6e9; padding-right: 10px;}
|
||||
div.rct {font-weight: bold; background: #e3e6e9; padding-right: 10px; cursor: pointer;}
|
||||
div.rct:hover {text-decoration: underline;}
|
||||
div.rcos {padding-right: 10px;}
|
||||
div.rcoe {color: green;}
|
||||
div.rcod {color: red;}
|
||||
div.rcoe:after {content: ": v";}
|
||||
div.rcod:after {content: ": x";}
|
||||
div.rcot:after {}
|
||||
div.jl {display: none;}
|
||||
.legend {width: 100%; margin-top: 30px; border-top: #224466 solid 1pt; padding: 10px 0px 10px 0px; text-align: left; font-family: monospace; letter-spacing: 2px;}
|
||||
.w3c {position: absolute; right: 10px; width: 60%; text-align: right; font-family: monospace; letter-spacing: 1px;}
|
||||
|
|
|
@ -6,3 +6,14 @@ function sh(e) {
|
|||
document.getElementById(e).style.display='none';
|
||||
}
|
||||
}
|
||||
// Show/Hide join/leave elements
|
||||
function jlf() {
|
||||
var es = document.getElementsByClassName('jl');
|
||||
for (var i = 0; i < es.length; i++) {
|
||||
if (es[i].style.display === 'block') {
|
||||
es[i].style.display = 'none';
|
||||
} else {
|
||||
es[i].style.display = 'block';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
669
priv/msgs/bg.msg
Normal file
669
priv/msgs/bg.msg
Normal file
|
@ -0,0 +1,669 @@
|
|||
%% Generated automatically
|
||||
%% DO NOT EDIT: run `make translations` instead
|
||||
%% To improve translations please read:
|
||||
%% https://docs.ejabberd.im/developer/extending-ejabberd/localization/
|
||||
|
||||
{" (Add * to the end of field to match substring)"," (Добавете * в края на полето, за да съответства на подниза)"}.
|
||||
{" has set the subject to: "," е задал темата на: "}.
|
||||
{"# participants","# участници"}.
|
||||
{"A description of the node","Описание на нода"}.
|
||||
{"A friendly name for the node","Удобно име на нода"}.
|
||||
{"A password is required to enter this room","Необходима е парола за влизане в тази стая"}.
|
||||
{"A Web Page","Уеб страница"}.
|
||||
{"Accept","Приемам"}.
|
||||
{"Access denied by service policy","Достъпът е отказан спрямо политиката на услугата"}.
|
||||
{"Access model","Модел на достъп"}.
|
||||
{"Account doesn't exist","Профилът не съществува"}.
|
||||
{"Action on user","Действие върху потребител"}.
|
||||
{"Add a hat to a user","Добави шапка към потребител"}.
|
||||
{"Add Jabber ID","Добави Jabber ID"}.
|
||||
{"Add New","Добави нов"}.
|
||||
{"Add User","Добави потребител"}.
|
||||
{"Administration of ","Администриране на "}.
|
||||
{"Administration","Администриране"}.
|
||||
{"Administrator privileges required","Изискватт се администраторски права"}.
|
||||
{"All activity","Цялата статистика"}.
|
||||
{"All Users","Всички потребители"}.
|
||||
{"Allow subscription","Разреши абониране"}.
|
||||
{"Allow this Jabber ID to subscribe to this pubsub node?","Позволявате ли това Jabber ID да се абонира за pubsub нода?"}.
|
||||
{"Allow this person to register with the room?","Позволявате ли този потребителя да се регистрира в стаята?"}.
|
||||
{"Allow users to change the subject","Позволи потребителите да сменят темата"}.
|
||||
{"Allow users to query other users","Позволи на потребителите да правят заявки към други потребители"}.
|
||||
{"Allow users to send invites","Разреши на потребителите да изпращат покани"}.
|
||||
{"Allow users to send private messages","Разреши на потребителите да изпращат лични съобщения"}.
|
||||
{"Allow visitors to change nickname","Разреши на посетителите да променят псевдонима си"}.
|
||||
{"Allow visitors to send private messages to","Разреши на потребителите да изпращат лични съобщения до"}.
|
||||
{"Allow visitors to send status text in presence updates","Разреши на посетителите да изпращат текст за състоянието в актуализациите за присъствие"}.
|
||||
{"Allow visitors to send voice requests","Разреши на посетителите да изпращат заявки за гласово повикване"}.
|
||||
{"An associated LDAP group that defines room membership; this should be an LDAP Distinguished Name according to an implementation-specific or deployment-specific definition of a group.","Асоциирана LDAP група, която определя членството в стая; това трябва да бъде LDAP отличително име според специфично за изпълнението/внедряването определение на група."}.
|
||||
{"Announcements","Съобщения"}.
|
||||
{"Answer associated with a picture","Отговор, свързан с картина"}.
|
||||
{"Answer associated with a video","Отговор, свързан с видеоклип"}.
|
||||
{"Answer associated with speech","Отговор, свързан с аудио клип"}.
|
||||
{"Answer to a question","Отговор на въпрос"}.
|
||||
{"Anyone in the specified roster group(s) may subscribe and retrieve items","Всеки в посочения списък от групата с контакти, може да се абонира и извлича елементи"}.
|
||||
{"Anyone may associate leaf nodes with the collection","Всеки може да асоциира \"leaf\" нодове с колекцията"}.
|
||||
{"Anyone may publish","Всеки може да публикува"}.
|
||||
{"Anyone may subscribe and retrieve items","Всеки може да се абонира и да извлича елементи"}.
|
||||
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Всеки, който има абонамент за присъствие на двете или от: може да се абонира и да извлича елементи"}.
|
||||
{"Anyone with Voice","Всеки, с възможност за гласово обаждане"}.
|
||||
{"Anyone","Всеки"}.
|
||||
{"Apparently your account has no administration rights in this server. Please check how to grant admin rights in: https://docs.ejabberd.im/admin/installation/#administration-account","Очевидно Вашият акаунт няма административни права за този сървър. Моля, проверете как да предоставите администраторски права на: https://docs.ejabberd.im/admin/installation/#administration-account"}.
|
||||
{"April","Април"}.
|
||||
{"Attribute 'channel' is required for this request","Атрибутът 'канал' е задължителен за тази заявка"}.
|
||||
{"Attribute 'id' is mandatory for MIX messages","Атрибутът 'id' е задължителен за MIX съобщения"}.
|
||||
{"Attribute 'jid' is not allowed here","Атрибутът 'jid' не е разрешен тук"}.
|
||||
{"Attribute 'node' is not allowed here","Атрибутът 'нод' не е разрешен тук"}.
|
||||
{"Attribute 'to' of stanza that triggered challenge","Атрибут 'до' на строфата, който е предизвикал предизвикателството"}.
|
||||
{"August","Август"}.
|
||||
{"Automatic node creation is not enabled","Автоматичното създаване на нод не е включено"}.
|
||||
{"Backup Management","Управление на архивирането"}.
|
||||
{"Backup of ~p","Резервно копие на ~p"}.
|
||||
{"Backup to File at ","Архивиране във файл на "}.
|
||||
{"Backup","Резервно копие"}.
|
||||
{"Bad format","Лош формат"}.
|
||||
{"Birthday","Рожден ден"}.
|
||||
{"Both the username and the resource are required","Изискват се потребителското име и ресурсът"}.
|
||||
{"Bytestream already activated","Bytestream вече е активиран"}.
|
||||
{"Cannot remove active list","Активният списък не може да бъде премахнат"}.
|
||||
{"Cannot remove default list","Не можете да премахнете списъка по подразбиране"}.
|
||||
{"CAPTCHA web page","CAPTCHA уеб страница"}.
|
||||
{"Challenge ID","ID на предизвикателството"}.
|
||||
{"Change Password","Смяна на парола"}.
|
||||
{"Change User Password","Смяна на потребителска парола"}.
|
||||
{"Changing password is not allowed","Смяната на парола не е разрешена"}.
|
||||
{"Changing role/affiliation is not allowed","Смяната на роля/принадлежност не е разрешена"}.
|
||||
{"Channel already exists","Каналът вече съществува"}.
|
||||
{"Channel does not exist","Каналът не съществува"}.
|
||||
{"Channel JID","JID на канал"}.
|
||||
{"Channels","Канали"}.
|
||||
{"Characters not allowed:","Неразрешени символи:"}.
|
||||
{"Chatroom configuration modified","Конфигурацията на стаята за чат е променена"}.
|
||||
{"Chatroom is created","Стаята за чат е създадена"}.
|
||||
{"Chatroom is destroyed","Стаята за чат е унищожена"}.
|
||||
{"Chatroom is started","Стаята за чат е стартирана"}.
|
||||
{"Chatroom is stopped","Стаята за чат е спряна"}.
|
||||
{"Chatrooms","Чат стаи"}.
|
||||
{"Choose a username and password to register with this server","Изберете потребителско име и парола, за да се регистрирате на този сървър"}.
|
||||
{"Choose storage type of tables","Изберете тип за съхранение на таблици"}.
|
||||
{"Choose whether to approve this entity's subscription.","Изберете дали да одобрите абонамента на този субект."}.
|
||||
{"City","Град"}.
|
||||
{"Client acknowledged more stanzas than sent by server","Клиентът потвърди повече строфи от изпратените от сървъра"}.
|
||||
{"Commands","Команди"}.
|
||||
{"Conference room does not exist","Конферентната стая не съществува"}.
|
||||
{"Configuration of room ~s","Конфигурация на стая ~s"}.
|
||||
{"Configuration","Конфигурация"}.
|
||||
{"Connected Resources:","Свързани ресурси:"}.
|
||||
{"Contact Addresses (normally, room owner or owners)","Адреси за контакт (обикновено собственик или собственици на стая)"}.
|
||||
{"Contrib Modules","Сътруднически модули"}.
|
||||
{"Country","Държава"}.
|
||||
{"CPU Time:","Процесорно време:"}.
|
||||
{"Current Discussion Topic","Текуща тема на дискусита"}.
|
||||
{"Database failure","Грешка в базата данни"}.
|
||||
{"Database Tables at ~p","Таблици на базата данни при ~p"}.
|
||||
{"Database Tables Configuration at ","Конфигурация на таблиците в базата данни при "}.
|
||||
{"Database","База данни"}.
|
||||
{"December","Декември"}.
|
||||
{"Default users as participants","Потребители по подразбиране като участници"}.
|
||||
{"Delete content","Изтрий съдържанието"}.
|
||||
{"Delete message of the day on all hosts","Изтрий съобщението на деня от всички нодове"}.
|
||||
{"Delete message of the day","Изтрий съобщението на деня"}.
|
||||
{"Delete Selected","Изтрий избраните"}.
|
||||
{"Delete table","Изтрий таблицата"}.
|
||||
{"Delete User","Изтрий потребителя"}.
|
||||
{"Deliver event notifications","Достави известията за събития"}.
|
||||
{"Deliver payloads with event notifications","Достави прикачените обекти с известията за събития"}.
|
||||
{"Description:","Описание:"}.
|
||||
{"Disc only copy","Копие само на диска"}.
|
||||
{"'Displayed groups' not added (they do not exist!): ","'Показаните групи' не са добавени (не съществуват!): "}.
|
||||
{"Displayed:","Показва се:"}.
|
||||
{"Don't tell your password to anybody, not even the administrators of the XMPP server.","Не казвайте паролата си на никого, дори на администраторите на XMPP сървъра."}.
|
||||
{"Dump Backup to Text File at ","Архивиране в текстов файл при "}.
|
||||
{"Dump to Text File","Архивиране в текстов файл"}.
|
||||
{"Duplicated groups are not allowed by RFC6121","Дублирани групи не са разрешени от RFC6121"}.
|
||||
{"Dynamically specify a replyto of the item publisher","Динамично задаване на отговор към публикувалия елемента"}.
|
||||
{"Edit Properties","Редактиране на свойства"}.
|
||||
{"Either approve or decline the voice request.","Одобрете или отхвърлете заявката за гласова връзка."}.
|
||||
{"ejabberd vCard module","ejabberd vCard модул"}.
|
||||
{"ejabberd Web Admin","Уеб администрация на ejabberd"}.
|
||||
{"ejabberd","ejabberd"}.
|
||||
{"Elements","Елементи"}.
|
||||
{"Email Address","Имейл адрес"}.
|
||||
{"Email","Илейл"}.
|
||||
{"Enable hats","Активиране на шапки"}.
|
||||
{"Enable logging","Активирай запис на хронологията"}.
|
||||
{"Enable message archiving","Активирай архивиране на съобщенията"}.
|
||||
{"Enabling push without 'node' attribute is not supported","Активиране на известията без атрибут 'нод' не се поддържа"}.
|
||||
{"End User Session","Прекрати сесията на потребителя"}.
|
||||
{"Enter nickname you want to register","Въведете псевдонима, който желаете да регистрирате"}.
|
||||
{"Enter path to backup file","Въведете пътя към архивния файл"}.
|
||||
{"Enter path to jabberd14 spool dir","Въведете пътя към jabberd14 spool директорията"}.
|
||||
{"Enter path to jabberd14 spool file","Въведете пътя към jabberd14 spool файла"}.
|
||||
{"Enter path to text file","Въведете пътя към текстовия файл"}.
|
||||
{"Enter the text you see","Въведете текста, който виждате"}.
|
||||
{"Erlang XMPP Server","Erlang XMPP сървър"}.
|
||||
{"Error","Грешка"}.
|
||||
{"Exclude Jabber IDs from CAPTCHA challenge","Изключи CAPTCHA предизвикателство за следните Jabber ID-та"}.
|
||||
{"Export all tables as SQL queries to a file:","Експортирай всички таблици като SQL заявки във файл:"}.
|
||||
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Експортирай данните за всички потребители на сървъра в PIEFXIS файлове (XEP-0227):"}.
|
||||
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Експортирай данните за потребителите на този хост в PIEFXIS файлове (XEP-0227):"}.
|
||||
{"External component failure","Неуспех породен от външен компонент"}.
|
||||
{"External component timeout","Времето за изчакване на външен компонент изтече"}.
|
||||
{"Failed to activate bytestream","Неуспешно активиране на bytestream"}.
|
||||
{"Failed to extract JID from your voice request approval","Неуспешно извличане на JID от одобрението за гласова заявка"}.
|
||||
{"Failed to map delegated namespace to external component","Неуспешно съпоставяне на делегирано пространство от имена с външен компонент"}.
|
||||
{"Failed to parse HTTP response","Неуспешно анализиран HTTP отговор"}.
|
||||
{"Failed to process option '~s'","Неуспешо обработена опция '~s'"}.
|
||||
{"Family Name","Фамилно име"}.
|
||||
{"FAQ Entry","Въвеждане на ЧЗВ"}.
|
||||
{"February","Февруари"}.
|
||||
{"File larger than ~w bytes","Файлът е по-голям от ~w байта"}.
|
||||
{"Fill in the form to search for any matching XMPP User","Попълнете формата, за да търсите съвпадащ XMPP потребител"}.
|
||||
{"Friday","Петък"}.
|
||||
{"From ~ts","От ~ts"}.
|
||||
{"From","От"}.
|
||||
{"Full List of Room Admins","Пълен списък на администраторите на стаята"}.
|
||||
{"Full List of Room Owners","Пълен списък на собствениците на стаята"}.
|
||||
{"Full Name","Пълно име"}.
|
||||
{"Get List of Online Users","Списък на онлайн потребителите"}.
|
||||
{"Get List of Registered Users","Списък на регистрираните потребители"}.
|
||||
{"Get Number of Online Users","Брой на онлайн потребителите"}.
|
||||
{"Get Number of Registered Users","Брой на регистрираните потребители"}.
|
||||
{"Get Pending","Виж чакащи"}.
|
||||
{"Get User Last Login Time","Покажи времето, когато потребителят е влязъл за последно"}.
|
||||
{"Get User Password","Покажи паролата на потребителя"}.
|
||||
{"Get User Statistics","Покажи статистика за потребителя"}.
|
||||
{"Given Name","Име"}.
|
||||
{"Grant voice to this person?","Предоставяне на глас за потребителя?"}.
|
||||
{"Groups that will be displayed to the members","Групи, които ще се показват на членовете"}.
|
||||
{"Groups","Групи"}.
|
||||
{"Group","Група"}.
|
||||
{"Hat title","Заглавие на шапката"}.
|
||||
{"Hat URI","URI адрес за шапка"}.
|
||||
{"Hats limit exceeded","Превишен е лимитът за шапка"}.
|
||||
{"Host unknown","Неизвестен хост"}.
|
||||
{"Host","Хост"}.
|
||||
{"HTTP File Upload","Качване на файл по HTTP"}.
|
||||
{"Idle connection","Неактивна връзка"}.
|
||||
{"If you don't see the CAPTCHA image here, visit the web page.","Ако не виждате CAPTCHA изображението, посетете уеб страницата."}.
|
||||
{"Import Directory","Импорт на директория"}.
|
||||
{"Import File","Импорт на файл"}.
|
||||
{"Import user data from jabberd14 spool file:","Импорт на потребители от jabberd14 Spool файл:"}.
|
||||
{"Import User from File at ","Импорт на потребител от файл на "}.
|
||||
{"Import users data from a PIEFXIS file (XEP-0227):","Импорт на потребителски данни от PIEFXIS файл (XEP-0227):"}.
|
||||
{"Import users data from jabberd14 spool directory:","Импорт на потребители от jabberd14 Spool директория:"}.
|
||||
{"Import Users from Dir at ","Импорт на потребители от директория на "}.
|
||||
{"Import Users From jabberd14 Spool Files","Импорт на потребители от jabberd14 Spool файлове"}.
|
||||
{"Improper domain part of 'from' attribute","Неправилна част за домейн в атрибута 'from'"}.
|
||||
{"Improper message type","Неправилен тип съобщение"}.
|
||||
{"Incoming s2s Connections:","Входящи s2s връзки:"}.
|
||||
{"Incorrect CAPTCHA submit","Неправилно CAPTCHA въвеждане"}.
|
||||
{"Incorrect data form","Неправилна форма на данните"}.
|
||||
{"Incorrect password","Грешна парола"}.
|
||||
{"Incorrect value of 'action' attribute","Неправилна стойност на атрибута 'action'"}.
|
||||
{"Incorrect value of 'action' in data form","Неправилна стойност на 'action' във формата за данни"}.
|
||||
{"Incorrect value of 'path' in data form","Неправилна стойност на 'path' във формата за данни"}.
|
||||
{"Installed Modules:","Инсталирани модули:"}.
|
||||
{"Install","Инсталирай"}.
|
||||
{"Insufficient privilege","Недостатъчни права"}.
|
||||
{"Internal server error","Вътрешна сървърна грешка"}.
|
||||
{"Invalid 'from' attribute in forwarded message","Невалиден атрибут 'from' в препратеното съобщение"}.
|
||||
{"Invalid node name","Невалидно име на нода"}.
|
||||
{"Invalid 'previd' value","Невалидна стойност на 'previd'"}.
|
||||
{"Invitations are not allowed in this conference","Поканите не са разрешени в тази конференция"}.
|
||||
{"IP addresses","IP адреси"}.
|
||||
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","Не е позволено да изпращате съобщения за грешки в стаята. Участникът (~s) е изпратил съобщение за грешка (~s) и е бил отстранен от стаята"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","Изпращането на лични съобщения от тип \"групов чат\" не е разрешено"}.
|
||||
{"It is not allowed to send private messages to the conference","Изпращането на лични съобщения до конференцията не е разрешено"}.
|
||||
{"Jabber ID","Jabber ID"}.
|
||||
{"January","Януари"}.
|
||||
{"JID normalization denied by service policy","Политиката на услугата не допуска нормализирането на JID"}.
|
||||
{"JID normalization failed","Нормализирането на JID е неуспешно"}.
|
||||
{"Joined MIX channels of ~ts","Свързани MIX канали на ~ts"}.
|
||||
{"Joined MIX channels:","Свързани MIX канали:"}.
|
||||
{"July","Юли"}.
|
||||
{"June","Юни"}.
|
||||
{"Just created","Току що създаден"}.
|
||||
{"Label:","Етикет:"}.
|
||||
{"Last Activity","Последна активност"}.
|
||||
{"Last login","Последно влизане"}.
|
||||
{"Last message","Последно съобщение"}.
|
||||
{"Last month","Миналия месец"}.
|
||||
{"Last year","Миналата година"}.
|
||||
{"Least significant bits of SHA-256 hash of text should equal hexadecimal label","Най-малко значимите битове SHA-256 хеш на текст трябва да са равни на шестнайсетичния етикет"}.
|
||||
{"List of rooms","Списък на стаите"}.
|
||||
{"List of users with hats","Списък на потребителите с шапки"}.
|
||||
{"List users with hats","Избройте потребителите с шапки"}.
|
||||
{"Logging","Регистриране на събития"}.
|
||||
{"Low level update script","Скрипт за актуализация на ниско ниво"}.
|
||||
{"Make participants list public","Направи списъка с участниците публичен"}.
|
||||
{"Make room CAPTCHA protected","Защити стаята с CAPTCHA"}.
|
||||
{"Make room members-only","Направи стаята само за членове"}.
|
||||
{"Make room moderated","Направи стая модерирана"}.
|
||||
{"Make room password protected","Защити стаята с парола"}.
|
||||
{"Make room persistent","Направи стая постоянна"}.
|
||||
{"Make room public searchable","Направи стаята да е публично търсена"}.
|
||||
{"Malformed username","Неправилно формирано потребителско име"}.
|
||||
{"MAM preference modification denied by service policy","Промяна на предпочитанията за МАМ е отказана, поради политика на услугата"}.
|
||||
{"March","Март"}.
|
||||
{"Max # of items to persist, or `max` for no specific limit other than a server imposed maximum","Максимален # на елементи, които да се запазят, или `max` за неспецифичен лимит, различен от наложения от сървъра максимум"}.
|
||||
{"Max payload size in bytes","Максимален размер на прикачения обект в байтове"}.
|
||||
{"Maximum file size","Максимален размер на файла"}.
|
||||
{"Maximum Number of History Messages Returned by Room","Максимален брой съобщения от хронологията, върнати от стая"}.
|
||||
{"Maximum number of items to persist","Максимален брой елементи за запазване"}.
|
||||
{"Maximum Number of Occupants","Максимален брой участници"}.
|
||||
{"May","Май"}.
|
||||
{"Members not added (inexistent vhost!): ","Членовете не са добавени (несъществуващ vhost!): "}.
|
||||
{"Membership is required to enter this room","Изисква се членство, за вход в тази стая"}.
|
||||
{"Members:","Членове:"}.
|
||||
{"Memorize your password, or write it in a paper placed in a safe place. In XMPP there isn't an automated way to recover your password if you forget it.","Запомнете паролата си или я запишете на лист хартия, поставен на сигурно място. В XMPP няма автоматичен начин за възстановяване на паролата в случай, че я забравите."}.
|
||||
{"Memory","Памет"}.
|
||||
{"Mere Availability in XMPP (No Show Value)","Наличност в XMPP (Не показвай стойност)"}.
|
||||
{"Message body","Текст на съобщението"}.
|
||||
{"Message not found in forwarded payload","Съобщението не е намерено в препратения прикачен елемент"}.
|
||||
{"Messages from strangers are rejected","Съобщенията от непознати се отхвърлят"}.
|
||||
{"Messages of type headline","Съобщения от тип заглавие"}.
|
||||
{"Messages of type normal","Съобщения от тип нормален"}.
|
||||
{"Middle Name","Презиме"}.
|
||||
{"Minimum interval between voice requests (in seconds)","Минимален интервал между заявките за гласова комуникация (в секунди)"}.
|
||||
{"Moderator privileges required","Изискват се права на модератор"}.
|
||||
{"Moderators Only","Само модератори"}.
|
||||
{"Moderator","Модератор"}.
|
||||
{"Modified modules","Модифицирани модули"}.
|
||||
{"Module failed to handle the query","Модулът не успя да обработи заявката"}.
|
||||
{"Monday","Понеделник"}.
|
||||
{"Multicast","Мултикаст"}.
|
||||
{"Multiple <item/> elements are not allowed by RFC6121","Повече от един <item/> елемента не се разрешават от RFC6121"}.
|
||||
{"Multi-User Chat","Групов чат (MUC)"}.
|
||||
{"Name in the rosters where this group will be displayed","Име в списъците с контакти, където ще се показва тази група"}.
|
||||
{"Name","Име"}.
|
||||
{"Name:","Име:"}.
|
||||
{"Natural Language for Room Discussions","Език за дискусии в стаята"}.
|
||||
{"Natural-Language Room Name","Име на стаята на предпочитания език"}.
|
||||
{"Neither 'jid' nor 'nick' attribute found","Атрибутите 'jid' и 'nick' не са намерени"}.
|
||||
{"Neither 'role' nor 'affiliation' attribute found","Атрибути 'role' или 'affiliation' не са намерени"}.
|
||||
{"Never","Никога"}.
|
||||
{"New Password:","Нова парола:"}.
|
||||
{"Nickname can't be empty","Псевдонимът не може да бъде празен"}.
|
||||
{"Nickname Registration at ","Регистрация на псевдоним в "}.
|
||||
{"Nickname ~s does not exist in the room","Псевдонимът ~s не присъства в стаята"}.
|
||||
{"Nickname","Псевдоним"}.
|
||||
{"No address elements found","Не е намерен адресен елемент"}.
|
||||
{"No addresses element found","Не са намерени адресни елементи"}.
|
||||
{"No 'affiliation' attribute found","Атрибут 'affiliation' не е намерен"}.
|
||||
{"No available resource found","Не е намерен наличен ресурс"}.
|
||||
{"No body provided for announce message","Не е предоставен текст за съобщение тип обява"}.
|
||||
{"No child elements found","Не са открити подчинени елементи"}.
|
||||
{"No data form found","Не е намерена форма за данни"}.
|
||||
{"No Data","Няма данни"}.
|
||||
{"No features available","Няма налични функции"}.
|
||||
{"No <forwarded/> element found","Елементът <forwarded/> не е намерен"}.
|
||||
{"No hook has processed this command","Никоя кука не е обработила тази команда"}.
|
||||
{"No info about last activity found","Няма информация за последна активновт"}.
|
||||
{"No 'item' element found","Елементът 'item' не е намерен"}.
|
||||
{"No items found in this query","Няма намерени елементи в тази заявка"}.
|
||||
{"No limit","Няма ограничение"}.
|
||||
{"No module is handling this query","Нито един модул не обработва тази заявка"}.
|
||||
{"No node specified","Не е посочен нод"}.
|
||||
{"No 'password' found in data form","Не е намерен 'password' във формата за данни"}.
|
||||
{"No 'password' found in this query","В заявката не е намерен 'password'"}.
|
||||
{"No 'path' found in data form","Не е намерен 'path' във формата за данни"}.
|
||||
{"No pending subscriptions found","Не са намерени чакащи абонаменти"}.
|
||||
{"No privacy list with this name found","Не е намерен списък за поверителност с това име"}.
|
||||
{"No private data found in this query","Няма открити лични данни в тази заявка"}.
|
||||
{"No running node found","Не е намерен работещ нод"}.
|
||||
{"No services available","Няма налични услуги"}.
|
||||
{"No statistics found for this item","Не е налична статистика за този елемент"}.
|
||||
{"No 'to' attribute found in the invitation","Атрибутът 'to' не е намерен в поканата"}.
|
||||
{"Nobody","Никой"}.
|
||||
{"Node already exists","Нодът вече съществува"}.
|
||||
{"Node ID","ID на нода"}.
|
||||
{"Node index not found","Индексът на нода не е намерен"}.
|
||||
{"Node not found","Нодът не е намерен"}.
|
||||
{"Node ~p","Нод ~p"}.
|
||||
{"Nodeprep has failed","Nodeprep е неуспешен"}.
|
||||
{"Nodes","Нодове"}.
|
||||
{"Node","Нод"}.
|
||||
{"None","Нито един"}.
|
||||
{"Not allowed","Не е разрешено"}.
|
||||
{"Not Found","Не е намерен"}.
|
||||
{"Not subscribed","Няма абонамент"}.
|
||||
{"Notify subscribers when items are removed from the node","Уведоми абонатите, когато елементите бъдат премахнати от нода"}.
|
||||
{"Notify subscribers when the node configuration changes","Уведоми абонатите, когато конфигурацията на нода се промени"}.
|
||||
{"Notify subscribers when the node is deleted","Уведоми абонатите, когато нодът бъде изтрит"}.
|
||||
{"November","Ноември"}.
|
||||
{"Number of answers required","Брой на необходимите отговори"}.
|
||||
{"Number of occupants","Брой участници"}.
|
||||
{"Number of Offline Messages","Брой офлайн съобщения"}.
|
||||
{"Number of online users","Брой онлайн потребители"}.
|
||||
{"Number of registered users","Брой регистрирани потребители"}.
|
||||
{"Number of seconds after which to automatically purge items, or `max` for no specific limit other than a server imposed maximum","Брой секунди, след които автоматично да се изчистят елементите, или `max` за липса на конкретно ограничение, различно от наложения от сървъра максимум"}.
|
||||
{"Occupants are allowed to invite others","На участниците е позволено да канят други"}.
|
||||
{"Occupants are allowed to query others","Участниците могат да отправят заявки към други лица"}.
|
||||
{"Occupants May Change the Subject","Участниците могат да променят темата"}.
|
||||
{"October","Октомври"}.
|
||||
{"Offline Messages","Офлайн съобщения"}.
|
||||
{"Offline Messages:","Офлайн съобщения:"}.
|
||||
{"OK","ДОБРЕ"}.
|
||||
{"Old Password:","Стара парола:"}.
|
||||
{"Online Users","Онлайн потребители"}.
|
||||
{"Online Users:","Онлайн потребители:"}.
|
||||
{"Online","Онлайн"}.
|
||||
{"Only admins can see this","Само администратори могат да видят това"}.
|
||||
{"Only collection node owners may associate leaf nodes with the collection","Само собственици на колекционни нодове имат право да свързват листови нодове към колекцията"}.
|
||||
{"Only deliver notifications to available users","Доставяне на известия само до наличните потребители"}.
|
||||
{"Only <enable/> or <disable/> tags are allowed","Само тагове <enable/> и <disable/> са разрешени"}.
|
||||
{"Only <list/> element is allowed in this query","Само елементът <list/> е разрешен за тази заявка"}.
|
||||
{"Only members may query archives of this room","Само членовете могат да търсят архиви на тази стая"}.
|
||||
{"Only moderators and participants are allowed to change the subject in this room","Само модератори и участници имат право да променят темата в тази стая"}.
|
||||
{"Only moderators are allowed to change the subject in this room","Само модераторите имат право да сменят темата в тази стая"}.
|
||||
{"Only moderators are allowed to retract messages","Само модераторите имат право да оттеглят съобщения"}.
|
||||
{"Only moderators can approve voice requests","Само модераторите могат да одобряват гласови заявки"}.
|
||||
{"Only occupants are allowed to send messages to the conference","Само участници имат право да изпращат съобщения до конференцията"}.
|
||||
{"Only occupants are allowed to send queries to the conference","Само участници имат право да изпращат запитвания до конференцията"}.
|
||||
{"Only publishers may publish","Само издателите могат да публикуват"}.
|
||||
{"Only service administrators are allowed to send service messages","Само администраторите на услуги имат право да изпращат системни съобщения"}.
|
||||
{"Only those on a whitelist may associate leaf nodes with the collection","Само тези от списъка с позволени могат да свързват листови нодове с колекцията"}.
|
||||
{"Only those on a whitelist may subscribe and retrieve items","Само тези от списъка с позволени могат да се абонират и да извличат елементи"}.
|
||||
{"Organization Name","Име на организацията"}.
|
||||
{"Organization Unit","Отдел"}.
|
||||
{"Other Modules Available:","Други налични модули:"}.
|
||||
{"Outgoing s2s Connections","Изходящи s2s връзки"}.
|
||||
{"Outgoing s2s Connections:","Изходящи s2s връзки:"}.
|
||||
{"Owner privileges required","Изискват се привилегии на собственик"}.
|
||||
{"Packet relay is denied by service policy","Предаването на пакети е отказано от политиката на услугата"}.
|
||||
{"Packet","Пакет"}.
|
||||
{"Participant ID","ID на участник"}.
|
||||
{"Participant","Участник"}.
|
||||
{"Password Verification","Проверка на паролата"}.
|
||||
{"Password Verification:","Проверка на паролата:"}.
|
||||
{"Password","Парола"}.
|
||||
{"Password:","Парола:"}.
|
||||
{"Path to Dir","Път към директория"}.
|
||||
{"Path to File","Път до файл"}.
|
||||
{"Payload semantic type information","Информация за семантичен тип полезен товар"}.
|
||||
{"Pending","В очакване"}.
|
||||
{"Period: ","Период: "}.
|
||||
{"Persist items to storage","Запазване на елементите в хранилището"}.
|
||||
{"Persistent","Постоянен"}.
|
||||
{"Ping query is incorrect","Заявката за пинг е неправилна"}.
|
||||
{"Ping","Пинг"}.
|
||||
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Обърнете внимание, че тези опции ще направят резервно копие само на вградената (Mnesia) база данни. Ако използвате модула ODBC, трябва да направите резервно копие на SQL базата данни отделно."}.
|
||||
{"Please, wait for a while before sending new voice request","Моля, изчакайте известно време, преди да изпратите нова заявка за гласова връзка"}.
|
||||
{"Pong","Понг"}.
|
||||
{"Possessing 'ask' attribute is not allowed by RFC6121","Притежаването на атрибут 'ask' не е разрешено от RFC6121"}.
|
||||
{"Present real Jabber IDs to","Покажи истински Jabber ID-та на"}.
|
||||
{"Previous session not found","Предишната сесия не е намерена"}.
|
||||
{"Previous session PID has been killed","PID от предишната сесия е унищожен"}.
|
||||
{"Previous session PID has exited","Предишният PID на сесията е излязъл"}.
|
||||
{"Previous session PID is dead","PID от предишната сесия не съществува"}.
|
||||
{"Previous session timed out","Времето на предишната сесия изтече"}.
|
||||
{"Public","Публичен"}.
|
||||
{"Publish model","Модел за публикуване"}.
|
||||
{"Publish-Subscribe","Публикуване-Абониране"}.
|
||||
{"PubSub subscriber request","Заявка от абонат за PubSub"}.
|
||||
{"Purge all items when the relevant publisher goes offline","Изчисти всички елементи, когато съответният публикуващ премине в режим офлайн"}.
|
||||
{"Push record not found","Push записът не е намерен"}.
|
||||
{"Queries to the conference members are not allowed in this room","В тази стая не се допускат запитвания към членовете на конференцията"}.
|
||||
{"Query to another users is forbidden","Заявка към други потребители е забранена"}.
|
||||
{"RAM and disc copy","Копие в RAM и на диск"}.
|
||||
{"RAM copy","Копие в RAM"}.
|
||||
{"Really delete message of the day?","Наистина ли желаете да изтриете съобщението на деня?"}.
|
||||
{"Receive notification from all descendent nodes","Получаване на известие от всички низходящи нодове"}.
|
||||
{"Receive notification from direct child nodes only","Получаване на известия само от директни подчинени нодове"}.
|
||||
{"Receive notification of new items only","Получаване на известия само за нови елементи"}.
|
||||
{"Receive notification of new nodes only","Получаване на известия само за нови нодове"}.
|
||||
{"Recipient is not in the conference room","Получателят не е в конферентната стая"}.
|
||||
{"Register an XMPP account","Регистрирай XMPP акаунт"}.
|
||||
{"Registered Users","Регистрирани потребители"}.
|
||||
{"Registered Users:","Регистрирани потребители:"}.
|
||||
{"Register","Регистрирай"}.
|
||||
{"Remote copy","Отдалечено копие"}.
|
||||
{"Remove a hat from a user","Премахни шапка от потребител"}.
|
||||
{"Remove All Offline Messages","Премахни всички офлайн съобщения"}.
|
||||
{"Remove User","Премахни потребител"}.
|
||||
{"Remove","Премахни"}.
|
||||
{"Replaced by new connection","Заменен от нова връзка"}.
|
||||
{"Request has timed out","Времето за заявка изтече"}.
|
||||
{"Request is ignored","Заявката е игнорирано"}.
|
||||
{"Requested role","Заявена роля"}.
|
||||
{"Resources","Ресурси"}.
|
||||
{"Restart Service","Рестартирай услугата"}.
|
||||
{"Restart","Рестартирай"}.
|
||||
{"Restore Backup from File at ","Възстанови резервно копие от файл в "}.
|
||||
{"Restore binary backup after next ejabberd restart (requires less memory):","Възстановяване на бинарно копие след следващото рестартиране на ejabberd (изисква по-малко памет):"}.
|
||||
{"Restore binary backup immediately:","Възстанови незабавно двоично копие:"}.
|
||||
{"Restore plain text backup immediately:","Възстановете незабавно копие от обикновен текст:"}.
|
||||
{"Restore","Възстанови"}.
|
||||
{"Roles and Affiliations that May Retrieve Member List","Роли и принадлежности, които могат да извличат списък с членове"}.
|
||||
{"Roles for which Presence is Broadcasted","Роли, за които се излъчва присъствие"}.
|
||||
{"Roles that May Send Private Messages","Роли, които могат да изпращат лични съобщения"}.
|
||||
{"Room Configuration","Конфигурация на стаята"}.
|
||||
{"Room creation is denied by service policy","Създаването на стая е отказано поради политика на услугата"}.
|
||||
{"Room description","Описание на стаята"}.
|
||||
{"Room Occupants","Участници в стаята"}.
|
||||
{"Room terminates","Стаята се прекратява"}.
|
||||
{"Room title","Заглавие на стаята"}.
|
||||
{"Roster groups allowed to subscribe","Групи от списъци с контакти, на които е разрешено да се абонират"}.
|
||||
{"Roster of ~ts","Списък с контакти на ~ts"}.
|
||||
{"Roster size","Размер на списъка с контакти"}.
|
||||
{"Roster:","Списък с контакти:"}.
|
||||
{"RPC Call Error","Грешка при RPC повикване"}.
|
||||
{"Running Nodes","Работещи нодове"}.
|
||||
{"~s invites you to the room ~s","~s ви кани в стая ~s"}.
|
||||
{"Saturday","Събота"}.
|
||||
{"Script check","Проверка на скрипт"}.
|
||||
{"Search from the date","Търси от дата"}.
|
||||
{"Search Results for ","Резултати от търсенето за "}.
|
||||
{"Search the text","Търси текста"}.
|
||||
{"Search until the date","Търси до дата"}.
|
||||
{"Search users in ","Търси потребители в "}.
|
||||
{"Select All","Избери всички"}.
|
||||
{"Send announcement to all online users on all hosts","Изпрати съобщение до всички онлайн потребители на всички хостове"}.
|
||||
{"Send announcement to all online users","Изпрати съобщение до всички онлайн потребители"}.
|
||||
{"Send announcement to all users on all hosts","Изпрати съобщение до всички потребители на всички хостове"}.
|
||||
{"Send announcement to all users","Изпрати съобщение до всички потребители"}.
|
||||
{"September","Септември"}.
|
||||
{"Server:","Сървър:"}.
|
||||
{"Service list retrieval timed out","Времето за изчакване на извличането на списъка с услуги изтече"}.
|
||||
{"Session state copying timed out","Времето за изчакване на копирането на състоянието на сесията изтече"}.
|
||||
{"Set message of the day and send to online users","Задай съобщение на деня и го изпрати на онлайн потребителите"}.
|
||||
{"Set message of the day on all hosts and send to online users","Задавай съобщение на деня на всички хостове и изпрати на онлайн потребителите"}.
|
||||
{"Shared Roster Groups","Споделени групи от списъци с контакти"}.
|
||||
{"Show Integral Table","Покажи интегрална таблица"}.
|
||||
{"Show Ordinary Table","Покажи обикновена таблица"}.
|
||||
{"Shut Down Service","Изключи услугата"}.
|
||||
{"SOCKS5 Bytestreams","SOCKS5 байтови потоци"}.
|
||||
{"Some XMPP clients can store your password in the computer, but you should do this only in your personal computer for safety reasons.","Някои XMPP клиенти могат да съхраняват паролата Ви в компютъра, но от съображения за сигурност трябва да го правите само на личния си компютър."}.
|
||||
{"Sources Specs:","Спецификации на източниците:"}.
|
||||
{"Specify the access model","Задай модела за достъп"}.
|
||||
{"Specify the event message type","Задай типа на съобщението за събитие"}.
|
||||
{"Specify the publisher model","Задайте модела на публикуващия"}.
|
||||
{"Stanza id is not valid","Невалидно ID на строфата"}.
|
||||
{"Stanza ID","ID на строфа"}.
|
||||
{"Statically specify a replyto of the node owner(s)","Статично задаване на replyto на собственика(ците) на нода"}.
|
||||
{"Statistics of ~p","Статистики на ~p"}.
|
||||
{"Statistics","Статистики"}.
|
||||
{"Stopped Nodes","Спрени нодове"}.
|
||||
{"Stop","Спри"}.
|
||||
{"Storage Type","Тип хранилище"}.
|
||||
{"Store binary backup:","Запази бинарен архив:"}.
|
||||
{"Store plain text backup:","Запази архив като обикновен текст:"}.
|
||||
{"Stream management is already enabled","Управлението на потока вече е активирано"}.
|
||||
{"Stream management is not enabled","Управлението на потока не е активирано"}.
|
||||
{"Subject","Тема"}.
|
||||
{"Submitted","Изпратено"}.
|
||||
{"Submit","Изпрати"}.
|
||||
{"Subscriber Address","Адрес на абоната"}.
|
||||
{"Subscribers may publish","Абонатите могат да публикуват"}.
|
||||
{"Subscription requests must be approved and only subscribers may retrieve items","Заявките за абонамент трябва да бъдат одобрени и само абонатите могат да извличат елементи"}.
|
||||
{"Subscriptions are not allowed","Абонаментите не са разрешени"}.
|
||||
{"Subscription","Абонамент"}.
|
||||
{"Sunday","Неделя"}.
|
||||
{"Text associated with a picture","Текст, свързан със снимка"}.
|
||||
{"Text associated with a sound","Текст, свързан със звук"}.
|
||||
{"Text associated with a video","Текст, свързан с видео"}.
|
||||
{"Text associated with speech","Текст, свързан с реч"}.
|
||||
{"That nickname is already in use by another occupant","Този псевдоним вече се използва от друг участник"}.
|
||||
{"That nickname is registered by another person","Този псевдоним е регистриран от друго лице"}.
|
||||
{"The account already exists","Профилът вече съществува"}.
|
||||
{"The account was not unregistered","Профилът не е дерегистриран"}.
|
||||
{"The body text of the last received message","Текстът на последното получено съобщение"}.
|
||||
{"The CAPTCHA is valid.","CAPTCHA предизвикателството е валидно."}.
|
||||
{"The CAPTCHA verification has failed","Проверката на CAPTCHA предизвикателството е неуспешна"}.
|
||||
{"The captcha you entered is wrong","Въведеният captcha код е грешен"}.
|
||||
{"The child nodes (leaf or collection) associated with a collection","Дъщерните нодове (листови или колекция), свързани с колекция"}.
|
||||
{"The collections with which a node is affiliated","Колекциите, с които даден нод е свързан"}.
|
||||
{"The DateTime at which a leased subscription will end or has ended","Датата и часът, на който абонамент ще приключи или е приключил"}.
|
||||
{"The datetime when the node was created","Датата, когато нодът е бил създаден"}.
|
||||
{"The default language of the node","Езикът по подразбиране на нода"}.
|
||||
{"The feature requested is not supported by the conference","Исканата функция не се поддържа от конференцията"}.
|
||||
{"The JID of the node creator","JID на създателя на нода"}.
|
||||
{"The JIDs of those to contact with questions","JID на лицата, с които да се свържете при въпроси"}.
|
||||
{"The JIDs of those with an affiliation of owner","JID на лицата с принадлежност на собственик"}.
|
||||
{"The JIDs of those with an affiliation of publisher","JID-та на лица с принадлежност към публикуващи"}.
|
||||
{"The list of all online users","Списък на всички онлайн потребители"}.
|
||||
{"The list of all users","Списък на всички потребители"}.
|
||||
{"The list of JIDs that may associate leaf nodes with a collection","Списъкът с JID, които могат да асоциират листови нодове с колекция"}.
|
||||
{"The maximum number of child nodes that can be associated with a collection, or `max` for no specific limit other than a server imposed maximum","Максимален брой подчинени нодове, които могат да бъдат свързани с колекция, или `max` за липса на конкретен лимит, различен от наложения от сървъра максимум"}.
|
||||
{"The minimum number of milliseconds between sending any two notification digests","Минималният брой милисекунди между изпращането на две извадки на известия"}.
|
||||
{"The name of the node","Името на нода"}.
|
||||
{"The node is a collection node","Нодът е от тип колекция"}.
|
||||
{"The node is a leaf node (default)","Нодът е листов (по подразбиране)"}.
|
||||
{"The NodeID of the relevant node","NodeID на съответния нод"}.
|
||||
{"The number of pending incoming presence subscription requests","Броят на чакащите входящи заявки за абонамент за присъствие"}.
|
||||
{"The number of subscribers to the node","Бротят абонати на нода"}.
|
||||
{"The number of unread or undelivered messages","Броят непрочетени или недоставени съобщения"}.
|
||||
{"The password contains unacceptable characters","Паролата съдържа недопустими символи"}.
|
||||
{"The password is too weak","Паролата е твърде слаба"}.
|
||||
{"The password of your XMPP account was successfully changed.","Паролата на вашия XMPP профил беше успешно променена."}.
|
||||
{"The password was not changed","Паролата не е променена"}.
|
||||
{"The passwords are different","Паролите са различни"}.
|
||||
{"The presence states for which an entity wants to receive notifications","Състояния на присъствие, за които даден субект желае да получава известия"}.
|
||||
{"The query is only allowed from local users","Заявката е разрешена само за локални потребители"}.
|
||||
{"The query must not contain <item/> elements","Заявката не може да съдържа елементи <item/>"}.
|
||||
{"The room subject can be modified by participants","Темата на стаята може да бъде променяна от участниците"}.
|
||||
{"The semantic type information of data in the node, usually specified by the namespace of the payload (if any)","Информацията за семантичния тип данни на нода, обикновено зададена от пространството на имената на прикачените данни (ако има такива)"}.
|
||||
{"The sender of the last received message","Подателят на последното получено съобщение"}.
|
||||
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Строфата ТРЯБВА да съдържа само един <active/> елемент, един <default/> елемент или един <list/> елемент"}.
|
||||
{"The subscription identifier associated with the subscription request","Идентификаторът на абонамента, свързан със заявката за абонамент"}.
|
||||
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","URL адрес на XSL трансформацията, която може да се приложи към прикачените данни, за да се генерира подходящ елемент от тялото на съобщението."}.
|
||||
{"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","URL адрес на XSL трансформацията, която може да се приложи към формата на прикачените данни, за да се генерира валиден резултат от Data Forms, който клиентът може да покаже с помощта на общ механизъм за визуализация на Data Forms."}.
|
||||
{"There was an error changing the password: ","Възникна грешка при промяна на паролата: "}.
|
||||
{"There was an error creating the account: ","Възникна грешка при създаването на профила: "}.
|
||||
{"There was an error deleting the account: ","Възникна грешка при изтриването на профила: "}.
|
||||
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Не е чувствително към регистъра (главни и малки букви): \"macbeth\"е същото като \"MacBeth\"и \"Macbeth\"."}.
|
||||
{"This page allows to register an XMPP account in this XMPP server. Your JID (Jabber ID) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Тази страница позволява регистриране на XMPP профил на този сървър. Вашият JID (Jabber ID) ще бъде във формата: username@server. Моля, прочетете внимателно инструкциите, за да попълните правилно полетата."}.
|
||||
{"This page allows to unregister an XMPP account in this XMPP server.","Тази страница позволява премахване на XMPP профил от този сървър."}.
|
||||
{"This room is not anonymous","Тази стая не е анонимна"}.
|
||||
{"This service can not process the address: ~s","Тази услуга не може да обработи адреса: ~s"}.
|
||||
{"Thursday","Четвъртък"}.
|
||||
{"Time delay","Закъснение"}.
|
||||
{"Timed out waiting for stream resumption","Времето за изчакване за възобновяване на потока изтече"}.
|
||||
{"Time","Час"}.
|
||||
{"To register, visit ~s","За да се регистрирате, посетете ~s"}.
|
||||
{"To ~ts","До ~ts"}.
|
||||
{"Token TTL","Токен TTL"}.
|
||||
{"Too many active bytestreams","Твърде много активни \"bytestreams\" потоци"}.
|
||||
{"Too many CAPTCHA requests","Твърде много CAPTCHA заявки"}.
|
||||
{"Too many child elements","Твърде много дъщерни елементи"}.
|
||||
{"Too many <item/> elements","Твърде много <item/> елементи"}.
|
||||
{"Too many <list/> elements","Твърде много <list/> елементи"}.
|
||||
{"Too many (~p) failed authentications from this IP address (~s). The address will be unblocked at ~s UTC","Твърде много (~p) неуспешни опити за удостоверявания от този IP адрес (~s). Адресът ще бъде деблокиран в ~s UTC"}.
|
||||
{"Too many receiver fields were specified","Посочени са твърде много полета за получател"}.
|
||||
{"Too many unacked stanzas","Твърде много непотвърдени строфи"}.
|
||||
{"Too many users in this conference","Твърде много потребители в тази конференция"}.
|
||||
{"Total rooms","Общо стаи"}.
|
||||
{"To","До"}.
|
||||
{"Traffic rate limit is exceeded","Лимитът за трафик е надвишен"}.
|
||||
{"Transactions Aborted:","Прекратени транзакции:"}.
|
||||
{"Transactions Committed:","Извършени транзакции:"}.
|
||||
{"Transactions Logged:","Регистрирани транзакции:"}.
|
||||
{"Transactions Restarted:","Рестартирани транзакции:"}.
|
||||
{"~ts's Offline Messages Queue","Офлайн съобщения на ~ts"}.
|
||||
{"Tuesday","Вторник"}.
|
||||
{"Unable to generate a CAPTCHA","Не може да се генерира CAPTCHA"}.
|
||||
{"Unable to register route on existing local domain","Не може да се регистрира маршрут в съществуващ локален домейн"}.
|
||||
{"Unauthorized","Неоторизиран"}.
|
||||
{"Unexpected action","Неочаквано действие"}.
|
||||
{"Unexpected error condition: ~p","Неочаквано състояние на грешка: ~p"}.
|
||||
{"Uninstall","Деинсталирай"}.
|
||||
{"Unregister an XMPP account","Дерегистрирай XMPP профил"}.
|
||||
{"Unregister","Дерегистрирай"}.
|
||||
{"Unselect All","Размаркирай всички"}.
|
||||
{"Unsupported <index/> element","Неподдържан елемент <index/>"}.
|
||||
{"Unsupported version","Неподдържана версия"}.
|
||||
{"Update message of the day (don't send)","Актуализирай съобщението на деня (не изпращай)"}.
|
||||
{"Update message of the day on all hosts (don't send)","Актуализирай съобщението на деня на всички хостове (не изпращай)"}.
|
||||
{"Update plan","План за актуализация"}.
|
||||
{"Update ~p","Актуализирай ~p"}.
|
||||
{"Update script","Актуализиращ скрипт"}.
|
||||
{"Update specs to get modules source, then install desired ones.","Актуализирайте спецификациите, за да получите източник на модули, след което инсталирайте желаните."}.
|
||||
{"Update Specs","Актуализирай спецификациите"}.
|
||||
{"Update","Актуализирай"}.
|
||||
{"Upgrade","Обнови"}.
|
||||
{"Uptime:","Време на работа:"}.
|
||||
{"URL for Archived Discussion Logs","URL адрес за дневници на архивирани дискусии"}.
|
||||
{"User already exists","Потребителят вече съществува"}.
|
||||
{"User (jid)","Потребител (jid)"}.
|
||||
{"User JID","Потребител JID"}.
|
||||
{"User Management","Управление на потребители"}.
|
||||
{"User removed","Потребителят е премахнат"}.
|
||||
{"User session not found","Потребителската сесия не е намерена"}.
|
||||
{"User session terminated","Потребителската сесия е прекратена"}.
|
||||
{"User ~ts","Потребител ~ts"}.
|
||||
{"Username:","Потребителско име:"}.
|
||||
{"Users are not allowed to register accounts so quickly","Не е разрешено потребителите да регистрират профили толкова бързо"}.
|
||||
{"Users Last Activity","Последна активност на потребителите"}.
|
||||
{"Users","Потребители"}.
|
||||
{"User","Потребител"}.
|
||||
{"Validate","Валидирай"}.
|
||||
{"Value 'get' of 'type' attribute is not allowed","Стойността 'get' на атрибут 'type' не е разрешена"}.
|
||||
{"Value of '~s' should be boolean","Стойността на '~s' трябва да е булева"}.
|
||||
{"Value of '~s' should be datetime string","Стойността на '~s' трябва да бъде низ за дата и час"}.
|
||||
{"Value of '~s' should be integer","Стойността на '~s' трябва да бъде цяло число"}.
|
||||
{"Value 'set' of 'type' attribute is not allowed","Стойността 'set' на атрибут 'type' не е разрешена"}.
|
||||
{"View joined MIX channels","Вижте присъединените MIX канали"}.
|
||||
{"View Queue","Вижте опашката"}.
|
||||
{"View Roster","Преглед на списъка с контакти"}.
|
||||
{"Virtual Hosts","Виртуални хостове"}.
|
||||
{"Visitors are not allowed to change their nicknames in this room","Посетителите нямат право да променят псевдонимите си в тази стая"}.
|
||||
{"Visitors are not allowed to send messages to all occupants","На посетителите не е разрешено да изпращат съобщения до всички участници"}.
|
||||
{"Visitor","Посетител"}.
|
||||
{"Voice requests are disabled in this conference","Гласовите обаждания са деактивирани в тази конференция"}.
|
||||
{"Voice request","Заявка за гласово обаждане"}.
|
||||
{"Wednesday","Сряда"}.
|
||||
{"When a new subscription is processed and whenever a subscriber comes online","Когато се обработва нов абонамент и всеки път, когато абонат се появи онлайн"}.
|
||||
{"When a new subscription is processed","Когато се обработва нов абонамент"}.
|
||||
{"When to send the last published item","Кога да изпратите последния публикуван елемент"}.
|
||||
{"Whether an entity wants to receive an XMPP message body in addition to the payload format","Дали даден обект иска да получи тяло на XMPP съобщение в допълнение към формата на полезен товар"}.
|
||||
{"Whether an entity wants to receive digests (aggregations) of notifications or all notifications individually","Дали даден обект желае да получава обобщения за известия или всички известия поотделно"}.
|
||||
{"Whether an entity wants to receive or disable notifications","Дали даден обект желае да получава или деактивира известия"}.
|
||||
{"Whether owners or publisher should receive replies to items","Дали собствениците или публикуващите трябва да получават отговори на елементи"}.
|
||||
{"Whether the node is a leaf (default) or a collection","Дали нодът е листов (по подразбиране) или колекция"}.
|
||||
{"Whether to allow subscriptions","Дали да се разрешат абонаменти"}.
|
||||
{"Whether to make all subscriptions temporary, based on subscriber presence","Дали всички абонаменти да бъдат временни въз основа на присъствието на абонат"}.
|
||||
{"Whether to notify owners about new subscribers and unsubscribes","Дали да се уведомяват собствениците за нови абонати и откази от абонамент"}.
|
||||
{"Who can send private messages","Кой може да изпраща лични съобщения"}.
|
||||
{"Who may associate leaf nodes with a collection","Кой може да асоциира листови нодове с колекция"}.
|
||||
{"Wrong parameters in the web formulary","Грешни параметри в уеб формуляра"}.
|
||||
{"Wrong xmlns","Грешен xmlns"}.
|
||||
{"XMPP Account Registration","Регистриране на XMPP профил"}.
|
||||
{"XMPP Domains","XMPP домейни"}.
|
||||
{"XMPP Show Value of Away","XMPP покажи стойност на Отсъства"}.
|
||||
{"XMPP Show Value of Chat","XMPP покажи стойност на Чат"}.
|
||||
{"XMPP Show Value of DND (Do Not Disturb)","XMPP покажи стойност на DND (Не ме безпокой)"}.
|
||||
{"XMPP Show Value of XA (Extended Away)","XMPP покажи стойност на Продължително отсъствие"}.
|
||||
{"You are being removed from the room because of a system shutdown","Премахнати сте от стаята поради изключване на системата"}.
|
||||
{"You are not allowed to send private messages","Нямате право да изпращате лични съобщения"}.
|
||||
{"You are not joined to the channel","Не сте присъединени към канала"}.
|
||||
{"You can later change your password using an XMPP client.","По-късно можете да промените паролата си с помощта на XMPP клиент."}.
|
||||
{"You have been banned from this room","Достъпът ви до тази стая е забранен"}.
|
||||
{"You have joined too many conferences","Присъединили сте се към твърде много конференции"}.
|
||||
{"You must fill in field \"Nickname\" in the form","Трябва да попълните полето \"Псевдоним\" във формата"}.
|
||||
{"You need a client that supports x:data and CAPTCHA to register","За да се регистрирате Ви е нужен клиент, който поддържа x:data и CAPTCHA"}.
|
||||
{"You need a client that supports x:data to register the nickname","За да регистрирате псевдонима, Ви е необходим клиент, който поддържа x:data"}.
|
||||
{"You need an x:data capable client to search","За да търсите, Ви е нужен клиент, който поддържа x:data"}.
|
||||
{"Your XMPP account was successfully registered.","Вашият XMPP акаунт, беше регистриран успешно."}.
|
||||
{"Your XMPP account was successfully unregistered.","Вашият XMPP акаунт, беше успешно дерегистриран."}.
|
||||
{"You're not allowed to create nodes","Нямате право да създавате нодове"}.
|
|
@ -12,11 +12,6 @@
|
|||
{"A Web Page","Una Pàgina Web"}.
|
||||
{"Accept","Acceptar"}.
|
||||
{"Access denied by service policy","Accés denegat per la política del servei"}.
|
||||
{"Access model of authorize","Model d'Accés de autoritzar"}.
|
||||
{"Access model of open","Model d'Accés de obert"}.
|
||||
{"Access model of presence","Model d'Accés de presència"}.
|
||||
{"Access model of roster","Model d'Accés de contactes"}.
|
||||
{"Access model of whitelist","Model d'Accés de llista blanca"}.
|
||||
{"Access model","Model d'Accés"}.
|
||||
{"Account doesn't exist","El compte no existeix"}.
|
||||
{"Action on user","Acció en l'usuari"}.
|
||||
|
@ -53,6 +48,7 @@
|
|||
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Qualsevol amb una subscripció de presencia de 'both' o 'from' pot subscriure's i publicar elements"}.
|
||||
{"Anyone with Voice","Qualsevol amb Veu"}.
|
||||
{"Anyone","Qualsevol"}.
|
||||
{"Apparently your account has no administration rights in this server. Please check how to grant admin rights in: https://docs.ejabberd.im/admin/installation/#administration-account","Aparentment el teu compte no te privilegis d'administrador en este servidor. Per favor consulta com obtindre privilegis d'administrador en: https://docs.ejabberd.im/admin/installation/#administration-account"}.
|
||||
{"April","Abril"}.
|
||||
{"Attribute 'channel' is required for this request","L'atribut 'channel' és necessari per a aquesta petició"}.
|
||||
{"Attribute 'id' is mandatory for MIX messages","L'atribut 'id' es necessari per a missatges MIX"}.
|
||||
|
@ -230,7 +226,6 @@
|
|||
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","No està permés enviar missatges d'error a la sala. El participant (~s) ha enviat un missatge d'error (~s) i ha sigut expulsat de la sala"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","No està permés enviar missatges del tipus \"groupchat\""}.
|
||||
{"It is not allowed to send private messages to the conference","No està permès l'enviament de missatges privats a la sala"}.
|
||||
{"It is not allowed to send private messages","No està permés enviar missatges privats"}.
|
||||
{"Jabber ID","ID Jabber"}.
|
||||
{"January","Gener"}.
|
||||
{"JID normalization denied by service policy","S'ha denegat la normalització del JID per política del servei"}.
|
||||
|
@ -375,6 +370,7 @@
|
|||
{"Only members may query archives of this room","Només membres poden consultar l'arxiu de missatges d'aquesta sala"}.
|
||||
{"Only moderators and participants are allowed to change the subject in this room","Només els moderadors i participants poden canviar el tema d'aquesta sala"}.
|
||||
{"Only moderators are allowed to change the subject in this room","Només els moderadors poden canviar el tema d'aquesta sala"}.
|
||||
{"Only moderators are allowed to retract messages","Només els moderadors tenen permís per a retractar missatges"}.
|
||||
{"Only moderators can approve voice requests","Només els moderadors poden aprovar les peticions de veu"}.
|
||||
{"Only occupants are allowed to send messages to the conference","Sols els ocupants poden enviar missatges a la sala"}.
|
||||
{"Only occupants are allowed to send queries to the conference","Sols els ocupants poden enviar sol·licituds a la sala"}.
|
||||
|
@ -398,7 +394,7 @@
|
|||
{"Password:","Contrasenya:"}.
|
||||
{"Path to Dir","Ruta al directori"}.
|
||||
{"Path to File","Ruta al fitxer"}.
|
||||
{"Payload type","Tipus de payload"}.
|
||||
{"Payload semantic type information","Informació sobre el tipus semàntic de la carrega útil"}.
|
||||
{"Pending","Pendent"}.
|
||||
{"Period: ","Període: "}.
|
||||
{"Persist items to storage","Persistir elements al guardar"}.
|
||||
|
@ -497,6 +493,7 @@
|
|||
{"Specify the access model","Especificar el model d'accés"}.
|
||||
{"Specify the event message type","Especifica el tipus de missatge d'event"}.
|
||||
{"Specify the publisher model","Especificar el model del publicant"}.
|
||||
{"Stanza id is not valid","L'identificador del paquet no es vàlid"}.
|
||||
{"Stanza ID","ID del paquet"}.
|
||||
{"Statically specify a replyto of the node owner(s)","Especifica estaticament una adreça on respondre al propietari del node"}.
|
||||
{"Statistics of ~p","Estadístiques de ~p"}.
|
||||
|
@ -561,10 +558,10 @@
|
|||
{"The query is only allowed from local users","La petició està permesa només d'usuaris locals"}.
|
||||
{"The query must not contain <item/> elements","La petició no pot contenir elements <item/>"}.
|
||||
{"The room subject can be modified by participants","El tema de la sala pot modificar-lo els participants"}.
|
||||
{"The semantic type information of data in the node, usually specified by the namespace of the payload (if any)","La informació semàntica de les dades al node, usualment especificat pel espai de noms de la càrrega util (si n'hi ha)"}.
|
||||
{"The sender of the last received message","Qui ha enviat l'ultim missatge rebut"}.
|
||||
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","El paquet DEU contindre només un element <active/>, un element <default/>, o un element <list/>"}.
|
||||
{"The subscription identifier associated with the subscription request","L'identificador de subscripció associat amb la petició de subscripció"}.
|
||||
{"The type of node data, usually specified by the namespace of the payload (if any)","El tipus de dades al node, usualment especificat pel namespace del payload (si n'hi ha)"}.
|
||||
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","La URL de uns transformació XSL que pot ser aplicada als payloads per a generar un element apropiat de contingut de missatge."}.
|
||||
{"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","La URL de una transformació XSL que pot ser aplicada al format de payload per a generar un resultat valid de Data Forms, que el client puga mostrar usant un métode generic de Data Forms"}.
|
||||
{"There was an error changing the password: ","Hi ha hagut un error canviant la contrasenya: "}.
|
||||
|
@ -663,6 +660,7 @@
|
|||
{"Whether to allow subscriptions","Permetre subscripcions"}.
|
||||
{"Whether to make all subscriptions temporary, based on subscriber presence","Si fer totes les subscripcions temporals, basat en la presencia del subscriptor"}.
|
||||
{"Whether to notify owners about new subscribers and unsubscribes","Si notificar als propietaris sobre noves subscripcions i desubscripcions"}.
|
||||
{"Who can send private messages","Qui pot enviar missatges privats"}.
|
||||
{"Who may associate leaf nodes with a collection","Qui pot associar nodes fulla amb una col·lecció"}.
|
||||
{"Wrong parameters in the web formulary","Paràmetres incorrectes en el formulari web"}.
|
||||
{"Wrong xmlns","El xmlns ès incorrecte"}.
|
||||
|
@ -674,6 +672,7 @@
|
|||
{"XMPP Show Value of XA (Extended Away)","Valor 'show' de XMPP: XA (Molt Ausent)"}.
|
||||
{"XMPP URI of Associated Publish-Subscribe Node","URI XMPP del Node Associat Publish-Subscribe"}.
|
||||
{"You are being removed from the room because of a system shutdown","Has sigut expulsat de la sala perquè el sistema va a apagar-se"}.
|
||||
{"You are not allowed to send private messages","No tens permés enviar missatges privats"}.
|
||||
{"You are not joined to the channel","No t'has unit al canal"}.
|
||||
{"You can later change your password using an XMPP client.","Podràs canviar la teva contrasenya més endavant utilitzant un client XMPP."}.
|
||||
{"You have been banned from this room","Has sigut bloquejat en aquesta sala"}.
|
||||
|
|
|
@ -115,6 +115,7 @@
|
|||
{"February",". února"}.
|
||||
{"File larger than ~w bytes","Soubor větší než ~w bytů"}.
|
||||
{"Friday","Pátek"}.
|
||||
{"From ~ts","Od ~ts"}.
|
||||
{"From","Od"}.
|
||||
{"Full Name","Celé jméno"}.
|
||||
{"Get Number of Online Users","Získat počet online uživatelů"}.
|
||||
|
@ -151,17 +152,18 @@
|
|||
{"Incorrect value of 'action' attribute","Nesprávná hodnota atributu 'action'"}.
|
||||
{"Incorrect value of 'action' in data form","Nesprávná hodnota atributu 'action' v datovém formuláři"}.
|
||||
{"Incorrect value of 'path' in data form","Nesprávná hodnota atributu 'path' v datovém formuláři"}.
|
||||
{"Installed Modules:","Instalované moduly:"}.
|
||||
{"Insufficient privilege","Nedostatečné oprávnění"}.
|
||||
{"Invalid 'from' attribute in forwarded message","Nesprávný atribut 'from' v přeposlané zprávě"}.
|
||||
{"Invitations are not allowed in this conference","Pozvánky nejsou povoleny v této místnosti"}.
|
||||
{"IP addresses","IP adresy"}.
|
||||
{"is now known as","se přejmenoval(a) na"}.
|
||||
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","Není povoleno posílat chybové zprávy do místnosti. Účastník (~s) odeslal chybovou zprávu (~s) a byl vyhozen z místnosti"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","Není dovoleno odeslání soukromé zprávy typu \"skupinová zpráva\" "}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","Není dovoleno odeslání soukromých zpráv typu \"skupinová zpráva\""}.
|
||||
{"It is not allowed to send private messages to the conference","Není povoleno odesílat soukromé zprávy v této místnosti"}.
|
||||
{"It is not allowed to send private messages","Je zakázáno posílat soukromé zprávy"}.
|
||||
{"Jabber ID","Jabber ID"}.
|
||||
{"January",". ledna"}.
|
||||
{"Joined MIX channels:","Připojené MIX kanály:"}.
|
||||
{"joins the room","vstoupil(a) do místnosti"}.
|
||||
{"July",". července"}.
|
||||
{"June",". června"}.
|
||||
|
@ -182,7 +184,7 @@
|
|||
{"Malformed username","Chybně formátováné jméno uživatele"}.
|
||||
{"March",". března"}.
|
||||
{"Max payload size in bytes","Maximální náklad v bajtech"}.
|
||||
{"Maximum Number of Occupants","Počet účastníků"}.
|
||||
{"Maximum Number of Occupants","Maximální počet účastníků"}.
|
||||
{"May",". května"}.
|
||||
{"Members:","Členové:"}.
|
||||
{"Membership is required to enter this room","Pro vstup do místnosti musíte být členem"}.
|
||||
|
@ -267,6 +269,7 @@
|
|||
{"Only service administrators are allowed to send service messages","Pouze správci služby smí odesílat servisní zprávy"}.
|
||||
{"Organization Name","Název firmy"}.
|
||||
{"Organization Unit","Oddělení"}.
|
||||
{"Other Modules Available:","Ostatní dostupné moduly:"}.
|
||||
{"Outgoing s2s Connections","Odchozí s2s spojení"}.
|
||||
{"Outgoing s2s Connections:","Odchozí s2s spojení:"}.
|
||||
{"Owner privileges required","Jsou vyžadována práva vlastníka"}.
|
||||
|
@ -320,7 +323,9 @@
|
|||
{"Room Occupants","Počet účastníků"}.
|
||||
{"Room title","Název místnosti"}.
|
||||
{"Roster groups allowed to subscribe","Skupiny kontaktů, které mohou odebírat"}.
|
||||
{"Roster of ~ts","Seznam kontaktů ~ts"}.
|
||||
{"Roster size","Velikost seznamu kontaktů"}.
|
||||
{"Roster:","Seznam kontaktů:"}.
|
||||
{"RPC Call Error","Chyba RPC volání"}.
|
||||
{"Running Nodes","Běžící uzly"}.
|
||||
{"Saturday","Sobota"}.
|
||||
|
@ -334,7 +339,7 @@
|
|||
{"September",". září"}.
|
||||
{"Server:","Server:"}.
|
||||
{"Set message of the day and send to online users","Nastavit zprávu dne a odeslat ji online uživatelům"}.
|
||||
{"Set message of the day on all hosts and send to online users","Nastavit zprávu dne a odeslat ji online uživatelům"}.
|
||||
{"Set message of the day on all hosts and send to online users","Nastavit zprávu dne na všech hostitelích a odeslat ji online uživatelům"}.
|
||||
{"Shared Roster Groups","Skupiny pro sdílený seznam kontaktů"}.
|
||||
{"Show Integral Table","Zobrazit kompletní tabulku"}.
|
||||
{"Show Ordinary Table","Zobrazit běžnou tabulku"}.
|
||||
|
@ -358,16 +363,19 @@
|
|||
{"Sunday","Neděle"}.
|
||||
{"That nickname is already in use by another occupant","Přezdívka je již používána jiným členem"}.
|
||||
{"That nickname is registered by another person","Přezdívka je zaregistrována jinou osobou"}.
|
||||
{"The account was not unregistered","Účet nebyl smazán"}.
|
||||
{"The CAPTCHA is valid.","CAPTCHA souhlasí."}.
|
||||
{"The CAPTCHA verification has failed","Ověření CAPTCHA se nezdařilo"}.
|
||||
{"The collections with which a node is affiliated","Kolekce, se kterými je uzel spřízněn"}.
|
||||
{"The feature requested is not supported by the conference","Požadovaná vlastnost není podporována touto místností"}.
|
||||
{"The number of subscribers to the node","Počet odběratelů uzlu"}.
|
||||
{"The password contains unacceptable characters","Heslo obsahuje nepovolené znaky"}.
|
||||
{"The password is too weak","Heslo je příliš slabé"}.
|
||||
{"the password is","heslo je"}.
|
||||
{"The query is only allowed from local users","Dotaz je povolen pouze pro místní uživatele"}.
|
||||
{"The query must not contain <item/> elements","Dotaz nesmí obsahovat elementy <item/>"}.
|
||||
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Stanza MUSÍ obsahovat pouze jeden element <active/>, jeden element <default/> nebo jeden element <list/>"}.
|
||||
{"There was an error changing the password: ","Při změně hesla došlo k chybě: "}.
|
||||
{"There was an error creating the account: ","Při vytváření účtu došlo k chybě: "}.
|
||||
{"There was an error deleting the account: ","Při mazání účtu došlo k chybě: "}.
|
||||
{"This room is not anonymous","Tato místnost není anonymní"}.
|
||||
|
|
|
@ -12,11 +12,6 @@
|
|||
{"A Web Page","Eine Webseite"}.
|
||||
{"Accept","Akzeptieren"}.
|
||||
{"Access denied by service policy","Zugriff aufgrund der Dienstrichtlinien verweigert"}.
|
||||
{"Access model of authorize","Zugriffsmodell von 'authorize'"}.
|
||||
{"Access model of open","Zugriffsmodell von 'open'"}.
|
||||
{"Access model of presence","Zugriffsmodell von 'presence'"}.
|
||||
{"Access model of roster","Zugriffsmodell der Kontaktliste"}.
|
||||
{"Access model of whitelist","Zugriffsmodell von 'whitelist'"}.
|
||||
{"Access model","Zugriffsmodell"}.
|
||||
{"Account doesn't exist","Konto existiert nicht"}.
|
||||
{"Action on user","Aktion auf Benutzer"}.
|
||||
|
@ -229,11 +224,12 @@
|
|||
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","Es ist nicht erlaubt Fehlermeldungen an den Raum zu senden. Der Teilnehmer (~s) hat eine Fehlermeldung (~s) gesendet und wurde aus dem Raum geworfen"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","Es ist nicht erlaubt private Nachrichten des Typs \"groupchat\" zu senden"}.
|
||||
{"It is not allowed to send private messages to the conference","Es ist nicht erlaubt private Nachrichten an die Konferenz zu senden"}.
|
||||
{"It is not allowed to send private messages","Es ist nicht erlaubt private Nachrichten zu senden"}.
|
||||
{"Jabber ID","Jabber-ID"}.
|
||||
{"January","Januar"}.
|
||||
{"JID normalization denied by service policy","JID-Normalisierung aufgrund der Dienstrichtlinien verweigert"}.
|
||||
{"JID normalization failed","JID-Normalisierung fehlgeschlagen"}.
|
||||
{"Joined MIX channels of ~ts","Beigetretene MIX-Channels von ~ts"}.
|
||||
{"Joined MIX channels:","Beigetretene MIX-Channels:"}.
|
||||
{"joins the room","betritt den Raum"}.
|
||||
{"July","Juli"}.
|
||||
{"June","Juni"}.
|
||||
|
@ -372,6 +368,7 @@
|
|||
{"Only members may query archives of this room","Nur Mitglieder dürfen den Verlauf dieses Raumes abrufen"}.
|
||||
{"Only moderators and participants are allowed to change the subject in this room","Nur Moderatoren und Teilnehmer dürfen das Thema in diesem Raum ändern"}.
|
||||
{"Only moderators are allowed to change the subject in this room","Nur Moderatoren dürfen das Thema in diesem Raum ändern"}.
|
||||
{"Only moderators are allowed to retract messages","Nur Moderatoren dürfen Nachrichten zurückziehen"}.
|
||||
{"Only moderators can approve voice requests","Nur Moderatoren können Sprachrecht-Anforderungen genehmigen"}.
|
||||
{"Only occupants are allowed to send messages to the conference","Nur Teilnehmer dürfen Nachrichten an die Konferenz senden"}.
|
||||
{"Only occupants are allowed to send queries to the conference","Nur Teilnehmer dürfen Anfragen an die Konferenz senden"}.
|
||||
|
@ -395,7 +392,6 @@
|
|||
{"Password:","Passwort:"}.
|
||||
{"Path to Dir","Pfad zum Verzeichnis"}.
|
||||
{"Path to File","Pfad zur Datei"}.
|
||||
{"Payload type","Nutzdatentyp"}.
|
||||
{"Pending","Ausstehend"}.
|
||||
{"Period: ","Zeitraum: "}.
|
||||
{"Persist items to storage","Items dauerhaft speichern"}.
|
||||
|
@ -494,6 +490,7 @@
|
|||
{"Specify the access model","Geben Sie das Zugangsmodell an"}.
|
||||
{"Specify the event message type","Geben Sie den Ereignisnachrichtentyp an"}.
|
||||
{"Specify the publisher model","Geben Sie das Veröffentlichermodell an"}.
|
||||
{"Stanza id is not valid","Stanza-ID ist ungültig"}.
|
||||
{"Stanza ID","Stanza-ID"}.
|
||||
{"Statically specify a replyto of the node owner(s)","Ein 'replyto' des/der Nodebesitzer(s) statisch angeben"}.
|
||||
{"Statistics of ~p","Statistiken von ~p"}.
|
||||
|
@ -561,7 +558,6 @@
|
|||
{"The sender of the last received message","Der Absender der letzten erhaltenen Nachricht"}.
|
||||
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Das Stanza darf nur ein <active/>-Element, ein <default/>-Element oder ein <list/>-Element enthalten"}.
|
||||
{"The subscription identifier associated with the subscription request","Die mit der Abonnement-Anforderung verknüpfte Abonnement-Bezeichnung"}.
|
||||
{"The type of node data, usually specified by the namespace of the payload (if any)","Die Art der Knotendaten, üblicherweise vom Namensraum der Nutzdaten angegeben (gegebenenfalls)"}.
|
||||
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","Die URL einer XSL-Transformation welche auf Nutzdaten angewendet werden kann, um ein geeignetes Nachrichtenkörper-Element zu generieren."}.
|
||||
{"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","Die URL einer XSL-Transformation welche auf das Nutzdaten-Format angewendet werden kann, um ein gültiges Data Forms-Ergebnis zu generieren das der Client mit Hilfe einer generischen Data Forms-Rendering-Engine anzeigen könnte"}.
|
||||
{"There was an error changing the password: ","Es trat ein Fehler beim Ändern des Passwortes auf: "}.
|
||||
|
@ -639,6 +635,7 @@
|
|||
{"Value of '~s' should be integer","Wert von '~s' sollte eine Ganzzahl sein"}.
|
||||
{"Value 'set' of 'type' attribute is not allowed","Wert 'set' des 'type'-Attributs ist nicht erlaubt"}.
|
||||
{"vCard User Search","vCard-Benutzer-Suche"}.
|
||||
{"View joined MIX channels","Beitretene MIX-Channel ansehen"}.
|
||||
{"View Queue","Warteschlange ansehen"}.
|
||||
{"View Roster","Kontaktliste ansehen"}.
|
||||
{"Virtual Hosts","Virtuelle Hosts"}.
|
||||
|
|
|
@ -12,11 +12,6 @@
|
|||
{"A Web Page","Μία ιστοσελίδα"}.
|
||||
{"Accept","Αποδοχή"}.
|
||||
{"Access denied by service policy","Άρνηση πρόσβασης, λόγω τακτικής παροχής υπηρεσιών"}.
|
||||
{"Access model of authorize","Μοντέλο πρόσβασης της πιστοποίησης"}.
|
||||
{"Access model of open","Μοντέλο πρόσβασης του ανοικτού"}.
|
||||
{"Access model of presence","Μοντέλο πρόσβασης της παρουσίας"}.
|
||||
{"Access model of roster","Μοντέλο πρόσβασης της Λίστας Επαφών"}.
|
||||
{"Access model of whitelist","Μοντέλο πρόσβασης της Λευκής Λίστας"}.
|
||||
{"Access model","Καθορίστε το μοντέλο πρόσβασης"}.
|
||||
{"Account doesn't exist","Ο λογαριασμός δεν υπάρχει"}.
|
||||
{"Action on user","Eνέργεια για το χρήστη"}.
|
||||
|
@ -219,7 +214,6 @@
|
|||
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","Δεν επιτρέπεται η αποστολή μηνυμάτων σφάλματος στο δωμάτιο. Ο συμμετέχων (~s) έχει στείλει ένα μήνυμα σφάλματος (~s) και έχει πεταχτεί έξω από την αίθουσα"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","Δεν επιτρέπεται η αποστολή προσωπικών μηνυμάτων του τύπου \"groupchat\""}.
|
||||
{"It is not allowed to send private messages to the conference","Δεν επιτρέπεται να στείλει προσωπικά μηνύματα για τη διάσκεψη"}.
|
||||
{"It is not allowed to send private messages","Δεν επιτρέπεται η αποστολή προσωπικών μηνυμάτων"}.
|
||||
{"Jabber ID","Ταυτότητα Jabber"}.
|
||||
{"January","Ιανουάριος"}.
|
||||
{"JID normalization denied by service policy","Απετράπη η κανονικοποίηση του JID, λόγω της τακτικής Παροχής Υπηρεσιών"}.
|
||||
|
@ -377,7 +371,6 @@
|
|||
{"Password:","Κωδικός πρόσβασης:"}.
|
||||
{"Path to Dir","Τοποθεσία κατάλογου αρχείων"}.
|
||||
{"Path to File","Τοποθεσία Αρχείου"}.
|
||||
{"Payload type","Τύπος φόρτου εργασιών"}.
|
||||
{"Pending","Εκκρεμεί"}.
|
||||
{"Period: ","Περίοδος: "}.
|
||||
{"Persist items to storage","Μόνιμη αποθήκευση στοιχείων"}.
|
||||
|
@ -538,7 +531,6 @@
|
|||
{"The sender of the last received message","Ο αποστολέας του τελευταίου εισερχομένου μηνύματος"}.
|
||||
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","Η stanza ΠΡΕΠΕΙ να περιέχει μόνο ένα στοιχείο <active />, ένα στοιχείο <default /> ή ένα στοιχείο <list />"}.
|
||||
{"The subscription identifier associated with the subscription request","Το αναγνωριστικό συνδρομής συσχετίστηκε με το αίτημα συνδρομής"}.
|
||||
{"The type of node data, usually specified by the namespace of the payload (if any)","Ο τύπος των δεδομένων του κόμβου συνήθως προσδιορίζεται από το namespace του φόρτου εργασιών (αν υπάρχουν)"}.
|
||||
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","Το URL ενός μετασχηματισμού XSL το οποίο μπορεί να εφαρμοστεί σε φόρτους εργασίας για να παραχθεί το κατάλληλο στοιχείο του σώματος του μηνύματος."}.
|
||||
{"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","Το URL ενός μετασχηματισμού XSL, το οποίο μπορεί να εφαρμοστεί στους τύπους φόρτου εργασίας για να παραχθεί έγκυρο αποτέλεσμα Data Forms, τέτοιο που ο πελάτης μπορεί να εμφανίσει, χρησιμοποιώντας μια ευρείας χρήσης μηχανή επεξεργασίας Data Forms"}.
|
||||
{"There was an error changing the password: ","Παρουσιάστηκε σφάλμα κατά την αλλαγή του κωδικού πρόσβασης: "}.
|
||||
|
|
|
@ -12,9 +12,6 @@
|
|||
{"A Web Page","Retpaĝo"}.
|
||||
{"Accept","Akcepti"}.
|
||||
{"Access denied by service policy","Atingo rifuzita de serv-politiko"}.
|
||||
{"Access model of open","Atingomodelo de malfermo"}.
|
||||
{"Access model of presence","Atingomodelo de ĉeesto"}.
|
||||
{"Access model of whitelist","Atingomodelo de permesolisto"}.
|
||||
{"Access model","Atingomodelo"}.
|
||||
{"Account doesn't exist","Konto ne ekzistas"}.
|
||||
{"Action on user","Ago je uzanto"}.
|
||||
|
@ -163,7 +160,6 @@
|
|||
{"is now known as","nun nomiĝas"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","Malpermesas sendi mesaĝojn de tipo \"groupchat\""}.
|
||||
{"It is not allowed to send private messages to the conference","Nur partoprenantoj rajtas sendi privatajn mesaĝojn al la babilejo"}.
|
||||
{"It is not allowed to send private messages","Ne estas permesata sendi privatajn mesaĝojn"}.
|
||||
{"Jabber ID","Jabber ID"}.
|
||||
{"January","Januaro"}.
|
||||
{"joins the room","eniras la babilejo"}.
|
||||
|
|
|
@ -12,11 +12,6 @@
|
|||
{"A Web Page","Una página web"}.
|
||||
{"Accept","Aceptar"}.
|
||||
{"Access denied by service policy","Acceso denegado por la política del servicio"}.
|
||||
{"Access model of authorize","Modelo de acceso de Autorizar"}.
|
||||
{"Access model of open","Modelo de acceso de Abierto"}.
|
||||
{"Access model of presence","Modelo de acceso de Presencia"}.
|
||||
{"Access model of roster","Modelo de acceso de Roster"}.
|
||||
{"Access model of whitelist","Modelo de acceso de Lista Blanca"}.
|
||||
{"Access model","Modelo de Acceso"}.
|
||||
{"Account doesn't exist","La cuenta no existe"}.
|
||||
{"Action on user","Acción en el usuario"}.
|
||||
|
@ -53,6 +48,7 @@
|
|||
{"Anyone with a presence subscription of both or from may subscribe and retrieve items","Cualquiera con una suscripción a la presencia de 'ambos' o 'de' puede suscribirse y recibir elementos"}.
|
||||
{"Anyone with Voice","Cualquiera con Voz"}.
|
||||
{"Anyone","Cualquiera"}.
|
||||
{"Apparently your account has no administration rights in this server. Please check how to grant admin rights in: https://docs.ejabberd.im/admin/installation/#administration-account","Aparentemente tu cuenta no tiene permisos de administración en este servidor. Por favor consulta cómo concederle privilegios de administrador en: https://docs.ejabberd.im/admin/installation/#administration-account"}.
|
||||
{"April","Abril"}.
|
||||
{"Attribute 'channel' is required for this request","El atributo 'channel' es necesario para esta petición"}.
|
||||
{"Attribute 'id' is mandatory for MIX messages","El atributo 'id' es necesario para mensajes MIX"}.
|
||||
|
@ -230,7 +226,6 @@
|
|||
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","No está permitido enviar mensajes de error a la sala. Este participante (~s) ha enviado un mensaje de error (~s) y fue expulsado de la sala"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","No está permitido enviar mensajes privados del tipo \"groupchat\""}.
|
||||
{"It is not allowed to send private messages to the conference","Impedir el envio de mensajes privados a la sala"}.
|
||||
{"It is not allowed to send private messages","No está permitido enviar mensajes privados"}.
|
||||
{"Jabber ID","Jabber ID"}.
|
||||
{"January","Enero"}.
|
||||
{"JID normalization denied by service policy","Se ha denegado la normalización del JID por política del servicio"}.
|
||||
|
@ -290,7 +285,7 @@
|
|||
{"Modified modules","Módulos modificados"}.
|
||||
{"Module failed to handle the query","El módulo falló al gestionar la petición"}.
|
||||
{"Monday","Lunes"}.
|
||||
{"Multicast","Multicast"}.
|
||||
{"Multicast","Multidifusión"}.
|
||||
{"Multiple <item/> elements are not allowed by RFC6121","No se permiten múltiples elementos <item/> en RFC6121"}.
|
||||
{"Multi-User Chat","Salas de Charla"}.
|
||||
{"Name in the rosters where this group will be displayed","Nombre del grupo con que aparecerá en las listas de contactos"}.
|
||||
|
@ -375,6 +370,7 @@
|
|||
{"Only members may query archives of this room","Solo miembros pueden consultar el archivo de mensajes de la sala"}.
|
||||
{"Only moderators and participants are allowed to change the subject in this room","Solo los moderadores y participantes pueden cambiar el asunto de esta sala"}.
|
||||
{"Only moderators are allowed to change the subject in this room","Solo los moderadores pueden cambiar el asunto de esta sala"}.
|
||||
{"Only moderators are allowed to retract messages","Solo los moderadores pueden retractarse de los mensajes"}.
|
||||
{"Only moderators can approve voice requests","Solo los moderadores pueden aprobar peticiones de voz"}.
|
||||
{"Only occupants are allowed to send messages to the conference","Solo los ocupantes pueden enviar mensajes a la sala"}.
|
||||
{"Only occupants are allowed to send queries to the conference","Solo los ocupantes pueden enviar solicitudes a la sala"}.
|
||||
|
@ -398,7 +394,7 @@
|
|||
{"Password:","Contraseña:"}.
|
||||
{"Path to Dir","Ruta al directorio"}.
|
||||
{"Path to File","Ruta al fichero"}.
|
||||
{"Payload type","Tipo de payload"}.
|
||||
{"Payload semantic type information","Información sobre el tipo semántico de la carga útil"}.
|
||||
{"Pending","Pendiente"}.
|
||||
{"Period: ","Periodo: "}.
|
||||
{"Persist items to storage","Persistir elementos al almacenar"}.
|
||||
|
@ -497,6 +493,7 @@
|
|||
{"Specify the access model","Especifica el modelo de acceso"}.
|
||||
{"Specify the event message type","Especifica el tipo del mensaje de evento"}.
|
||||
{"Specify the publisher model","Especificar el modelo del publicante"}.
|
||||
{"Stanza id is not valid","El identificador de la estrofa no es válido"}.
|
||||
{"Stanza ID","ID del paquete"}.
|
||||
{"Statically specify a replyto of the node owner(s)","Especificar de forma estática un 'replyto' de dueño(s) del nodo"}.
|
||||
{"Statistics of ~p","Estadísticas de ~p"}.
|
||||
|
@ -561,10 +558,10 @@
|
|||
{"The query is only allowed from local users","La solicitud está permitida solo para usuarios locales"}.
|
||||
{"The query must not contain <item/> elements","La solicitud no debe contener elementos <item/>"}.
|
||||
{"The room subject can be modified by participants","El asunto de la sala puede ser modificado por los participantes"}.
|
||||
{"The semantic type information of data in the node, usually specified by the namespace of the payload (if any)","La información semántica de los datos del nodo, normalmente es especificada por el espacio de los nombres de la carga útil (si existe)"}.
|
||||
{"The sender of the last received message","El emisor del último mensaje recibido"}.
|
||||
{"The stanza MUST contain only one <active/> element, one <default/> element, or one <list/> element","El paquete DEBE contener solo un elemento <active/>, un elemento <default/>, o un elemento <list/>"}.
|
||||
{"The subscription identifier associated with the subscription request","El identificador de suscripción asociado con la petición de suscripción"}.
|
||||
{"The type of node data, usually specified by the namespace of the payload (if any)","El tipo de datos del nodo, usualmente especificado por el namespace del payload (en caso de haberlo)"}.
|
||||
{"The URL of an XSL transformation which can be applied to payloads in order to generate an appropriate message body element.","La URL de una transformación XSL que puede aplicarse a payloads para generar un elemento de contenido del mensaje apropiado."}.
|
||||
{"The URL of an XSL transformation which can be applied to the payload format in order to generate a valid Data Forms result that the client could display using a generic Data Forms rendering engine","La URL de una transformación XSL que puede aplicarse al formato de payload para generar un resultado de Formulario de Datos válido, que el cliente pueda mostrar usando un mecanismo de dibujado genérico de Formulario de Datos"}.
|
||||
{"There was an error changing the password: ","Hubo uno error al cambiar la contaseña: "}.
|
||||
|
@ -663,6 +660,7 @@
|
|||
{"Whether to allow subscriptions","Permitir subscripciones"}.
|
||||
{"Whether to make all subscriptions temporary, based on subscriber presence","Si hacer que todas las suscripciones sean temporales, basado en la presencia del suscriptor"}.
|
||||
{"Whether to notify owners about new subscribers and unsubscribes","Si notificar a los dueños sobre nuevas suscripciones y desuscripciones"}.
|
||||
{"Who can send private messages","Quién puede enviar mensajes privados"}.
|
||||
{"Who may associate leaf nodes with a collection","Quien puede asociar nodos hoja con una colección"}.
|
||||
{"Wrong parameters in the web formulary","Parámetros incorrectos en el formulario web"}.
|
||||
{"Wrong xmlns","XMLNS incorrecto"}.
|
||||
|
@ -674,6 +672,7 @@
|
|||
{"XMPP Show Value of XA (Extended Away)","Valor 'Show' de XMPP: XA (Ausente Extendido)"}.
|
||||
{"XMPP URI of Associated Publish-Subscribe Node","URI XMPP del Nodo Asociado de Publicar-Subscribir"}.
|
||||
{"You are being removed from the room because of a system shutdown","Estás siendo expulsado de la sala porque el sistema se va a detener"}.
|
||||
{"You are not allowed to send private messages","No tienes permitido enviar mensajes privados"}.
|
||||
{"You are not joined to the channel","No has entrado en el canal"}.
|
||||
{"You can later change your password using an XMPP client.","Puedes cambiar tu contraseña después, usando un cliente XMPP."}.
|
||||
{"You have been banned from this room","Has sido bloqueado en esta sala"}.
|
||||
|
|
|
@ -12,11 +12,6 @@
|
|||
{"A Web Page","Une page Web"}.
|
||||
{"Accept","Accepter"}.
|
||||
{"Access denied by service policy","L'accès au service est refusé"}.
|
||||
{"Access model of authorize","Modèle d’accès de « autoriser »"}.
|
||||
{"Access model of open","Modèle d’accès de « ouvrir »"}.
|
||||
{"Access model of presence","Modèle d’accès de « présence »"}.
|
||||
{"Access model of roster","Modèle d’accès de « liste »"}.
|
||||
{"Access model of whitelist","Modèle d’accès de « liste blanche »"}.
|
||||
{"Access model","Modèle d’accès"}.
|
||||
{"Account doesn't exist","Le compte n’existe pas"}.
|
||||
{"Action on user","Action sur l'utilisateur"}.
|
||||
|
@ -220,7 +215,6 @@
|
|||
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","L'envoyer de messages d'erreur au salon n'est pas autorisé. Le participant (~s) à envoyé un message d'erreur (~s) et à été expulsé du salon"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","Il n'est pas permis d'envoyer des messages privés de type \"groupchat\""}.
|
||||
{"It is not allowed to send private messages to the conference","Il n'est pas permis d'envoyer des messages privés à la conférence"}.
|
||||
{"It is not allowed to send private messages","L'envoi de messages privés n'est pas autorisé"}.
|
||||
{"Jabber ID","Jabber ID"}.
|
||||
{"January","Janvier"}.
|
||||
{"joins the room","rejoint le salon"}.
|
||||
|
|
|
@ -159,7 +159,6 @@
|
|||
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","Non está permitido enviar mensaxes de erro á sala. Este participante (~s) enviou unha mensaxe de erro (~s) e foi expulsado da sala"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","Non está permitido enviar mensaxes privadas do tipo \"groupchat\""}.
|
||||
{"It is not allowed to send private messages to the conference","Impedir o envio de mensaxes privadas á sala"}.
|
||||
{"It is not allowed to send private messages","Non está permitido enviar mensaxes privadas"}.
|
||||
{"Jabber ID","Jabber ID"}.
|
||||
{"January","Xaneiro"}.
|
||||
{"joins the room","entra na sala"}.
|
||||
|
|
|
@ -148,7 +148,6 @@
|
|||
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","אין זה מותר לשלוח הודעות שגיאה לחדר. משתתף זה (~s) שלח הודעת שגיאה (~s) ונבעט מתוך החדר"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","אין זה מותר לשלוח הודעות פרטיות מן טיפוס \"groupchat\""}.
|
||||
{"It is not allowed to send private messages to the conference","אין זה מותר לשלוח הודעות פרטיות לועידה"}.
|
||||
{"It is not allowed to send private messages","אין זה מותר לשלוח הודעות פרטיות"}.
|
||||
{"Jabber ID","מזהה Jabber"}.
|
||||
{"January","ינואר"}.
|
||||
{"joins the room","נכנס/ת אל החדר"}.
|
||||
|
@ -337,7 +336,6 @@
|
|||
{"The collections with which a node is affiliated","האוספים עמם צומת מסונף"}.
|
||||
{"The password is too weak","הסיסמה חלשה מדי"}.
|
||||
{"the password is","הסיסמה היא"}.
|
||||
{"The type of node data, usually specified by the namespace of the payload (if any)","סוג מידע ממסר, לרוב מצוין לפי מרחב־שמות של מטען הייעוד (אם בכלל)"}.
|
||||
{"There was an error creating the account: ","אירעה שגיאה ביצירת החשבון: "}.
|
||||
{"There was an error deleting the account: ","אירעה שגיאה במחיקת החשבון: "}.
|
||||
{"This room is not anonymous","חדר זה אינו אנונימי"}.
|
||||
|
|
|
@ -170,7 +170,6 @@
|
|||
{"It is not allowed to send error messages to the room. The participant (~s) has sent an error message (~s) and got kicked from the room","Nem engedélyezett hibaüzeneteket küldeni a szobába. A résztvevő (~s) hibaüzenetet (~s) küldött, és ki lett rúgva a szobából"}.
|
||||
{"It is not allowed to send private messages of type \"groupchat\"","Nem engedélyezett „groupchat” típusú személyes üzeneteket küldeni"}.
|
||||
{"It is not allowed to send private messages to the conference","Nem engedélyezett személyes üzeneteket küldeni a konferenciába"}.
|
||||
{"It is not allowed to send private messages","Nem engedélyezett személyes üzeneteket küldeni"}.
|
||||
{"Jabber ID","Jabber-azonosító"}.
|
||||
{"January","január"}.
|
||||
{"JID normalization denied by service policy","A Jabber-azonosító normalizálása megtagadva a szolgáltatási irányelv miatt"}.
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user