mirror of
https://github.com/processone/ejabberd
synced 2025-10-03 17:59:31 +02:00
Compare commits
1429 commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
060992bafa | ||
![]() |
c0c69394b9 | ||
![]() |
2b7285e0b2 | ||
![]() |
c3a24ffdf8 | ||
![]() |
48fb446f8c | ||
![]() |
0283a501fa | ||
![]() |
fb572bf901 | ||
![]() |
7eb09295a3 | ||
![]() |
e0eae52eae | ||
![]() |
dd270f99fc | ||
![]() |
1472caab50 | ||
![]() |
ef2e62a01c | ||
![]() |
4e909fc50d | ||
![]() |
19b7106124 | ||
![]() |
4dea2f1eb6 | ||
![]() |
1d5b9bba15 | ||
![]() |
2951281115 | ||
![]() |
fd8aba6d41 | ||
![]() |
066e0a8101 | ||
![]() |
bf262a6051 | ||
![]() |
7840924b17 | ||
![]() |
60bdab4e52 | ||
![]() |
3a36a722c5 | ||
![]() |
00c75c3dc9 | ||
![]() |
cae7850a70 | ||
![]() |
ce668bef14 | ||
![]() |
3887b6d930 | ||
![]() |
b7bd0e196d | ||
![]() |
6d63842ad3 | ||
![]() |
2f3b9015e9 | ||
![]() |
6ae48eb991 | ||
![]() |
c508795ad4 | ||
![]() |
4a053807e0 | ||
![]() |
dd5bbda2dc | ||
![]() |
98469678a0 | ||
![]() |
b8550e087e | ||
![]() |
644d468b4f | ||
![]() |
74c810eeaa | ||
![]() |
a46325166a | ||
![]() |
654d4b81b1 | ||
![]() |
ff3d33dde4 | ||
![]() |
3183e2f733 | ||
![]() |
e1dc686ae7 | ||
![]() |
38b203feb1 | ||
![]() |
8b61cf0742 | ||
![]() |
a02c75aa08 | ||
![]() |
51af393baa | ||
![]() |
41318e45a5 | ||
![]() |
a94f227103 | ||
![]() |
517776acd4 | ||
![]() |
212a5ded6e | ||
![]() |
fd9c929e37 | ||
![]() |
ce828163af | ||
![]() |
97e1b419a0 | ||
![]() |
d70ac7f7c5 | ||
![]() |
7065cb69f1 | ||
![]() |
7815463ba0 | ||
![]() |
48e6631751 | ||
![]() |
903e6b70b4 | ||
![]() |
5edba59b24 | ||
![]() |
31cb4b06e4 | ||
![]() |
10f6723f00 | ||
![]() |
f594620c68 | ||
![]() |
dacfad61d8 | ||
![]() |
7c1da7e0cf | ||
![]() |
e709f99b47 | ||
![]() |
f150419891 | ||
![]() |
053fd26994 | ||
![]() |
bba1a1e3ca | ||
![]() |
e5da1efea4 | ||
![]() |
fbfd41c16e | ||
![]() |
4391921727 | ||
![]() |
4cd3c657e2 | ||
![]() |
7647b77225 | ||
![]() |
fe8710fe00 | ||
![]() |
1a9b147baf | ||
![]() |
6214e0385d | ||
![]() |
f7002c31f0 | ||
![]() |
99b75396ad | ||
![]() |
b1c3baa7bd | ||
![]() |
355eb5dfde | ||
![]() |
d269e32c3a | ||
![]() |
214b76f763 | ||
![]() |
73a8fbdfb5 | ||
![]() |
9b6f0aeb3c | ||
![]() |
45a6aed57f | ||
![]() |
9d17a160b6 | ||
![]() |
850d097660 | ||
![]() |
8ce8f67c06 | ||
![]() |
a17c2c166d | ||
![]() |
a64aa9e280 | ||
![]() |
3834a47a39 | ||
![]() |
9f6ff515ff | ||
![]() |
64a210842e | ||
![]() |
c0de52c967 | ||
![]() |
67c3df05b3 | ||
![]() |
4a66616756 | ||
![]() |
e4d424bf56 | ||
![]() |
c0fc6091b1 | ||
![]() |
ef35d19ff1 | ||
![]() |
cfa787c4b6 | ||
![]() |
611ebce0d2 | ||
![]() |
1e0b8cb547 | ||
![]() |
99d323b1dd | ||
![]() |
72bc9b6c7f | ||
![]() |
4694a482f4 | ||
![]() |
443f39bfdb | ||
![]() |
b118dd8fc6 | ||
![]() |
bf39da7b8b | ||
![]() |
ad3eee059e | ||
![]() |
e94ccabcf0 | ||
![]() |
427a29c74e | ||
![]() |
1d79edbae0 | ||
![]() |
9e4a6d09df | ||
![]() |
7b08289799 | ||
![]() |
bc937546ec | ||
![]() |
3b972fe4a3 | ||
![]() |
5e93725044 | ||
![]() |
500af47b79 | ||
![]() |
d862e04186 | ||
![]() |
5f293cb1e0 | ||
![]() |
c93ea2c22f | ||
![]() |
c567005241 | ||
![]() |
a6823d157c | ||
![]() |
bf54cc59e1 | ||
![]() |
740b0c7dd7 | ||
![]() |
c3f5083f15 | ||
![]() |
b65c11daf6 | ||
![]() |
263e1f59f7 | ||
![]() |
3d89c9199c | ||
![]() |
4a51bf90ab | ||
![]() |
a77c7e36b0 | ||
![]() |
88ae3fddf3 | ||
![]() |
bddcf0624e | ||
![]() |
6b47d3eb0d | ||
![]() |
a0c97b33e0 | ||
![]() |
5def9cef9f | ||
![]() |
c20d745028 | ||
![]() |
e099435cd6 | ||
![]() |
d6a00f5151 | ||
![]() |
653413e912 | ||
![]() |
288eecc23d | ||
![]() |
b55b6f3d26 | ||
![]() |
d00561b58c | ||
![]() |
432810db89 | ||
![]() |
f3b1b5d419 | ||
![]() |
d9a7b67f0e | ||
![]() |
85f05192c8 | ||
![]() |
149b715b4f | ||
![]() |
bae345b92b | ||
![]() |
10ec128b94 | ||
![]() |
7a6e409879 | ||
![]() |
ea19e4bc7f | ||
![]() |
6122a525d2 | ||
![]() |
b607d95a93 | ||
![]() |
ee46333def | ||
![]() |
34b40aec66 | ||
![]() |
639147be41 | ||
![]() |
c48aa38c39 | ||
![]() |
70bec7b714 | ||
![]() |
a7c15eaccf | ||
![]() |
c78e99dd54 | ||
![]() |
3196779308 | ||
![]() |
064b005ec5 | ||
![]() |
2d2b98e525 | ||
![]() |
71f623ddbf | ||
![]() |
f03b5f4c44 | ||
![]() |
aff8b47b6c | ||
![]() |
6c1452435d | ||
![]() |
38f365ffeb | ||
![]() |
ed846c4a88 | ||
![]() |
8855a304cc | ||
![]() |
95a083a6f4 | ||
![]() |
0bb99bb371 | ||
![]() |
38cc3ccb1e | ||
![]() |
c51b044b3f | ||
![]() |
363351b18c | ||
![]() |
167bbc768a | ||
![]() |
591e15f0f6 | ||
![]() |
b4a917db09 | ||
![]() |
7755fcc846 | ||
![]() |
250af8f06a | ||
![]() |
9569e407b5 | ||
![]() |
573d5525ec | ||
![]() |
f1de7b008b | ||
![]() |
c10e6ded78 | ||
![]() |
9bc991cb7d | ||
![]() |
ffa7c32d80 | ||
![]() |
038491d2ec | ||
![]() |
9d1d57cd82 | ||
![]() |
c38b2bfc21 | ||
![]() |
18e7805ef5 | ||
![]() |
010eab6e30 | ||
![]() |
30c8088d73 | ||
![]() |
354009033a | ||
![]() |
bf3f904fe9 | ||
![]() |
d65cafae64 | ||
![]() |
128103b7b2 | ||
![]() |
cbb88638d2 | ||
![]() |
f046aeeaa2 | ||
![]() |
bd5f9537c5 | ||
![]() |
838bbd70ef | ||
![]() |
e7997244af | ||
![]() |
3874e71971 | ||
![]() |
67cc0c5286 | ||
![]() |
826123db56 | ||
![]() |
05b0037462 | ||
![]() |
54796f888e | ||
![]() |
82ec0a4837 | ||
![]() |
7167df7979 | ||
![]() |
45e7d8426d | ||
![]() |
ef754939c4 | ||
![]() |
ee3a0b8b1a | ||
![]() |
2182cb60ae | ||
![]() |
4da8278e66 | ||
![]() |
629db496b5 | ||
![]() |
f79b8e166a | ||
![]() |
fae4ab97fd | ||
![]() |
da8d04a654 | ||
![]() |
ce02fc485f | ||
![]() |
69695ffe27 | ||
![]() |
6fdb467484 | ||
![]() |
d8016a6477 | ||
![]() |
e43d864184 | ||
![]() |
4d3681aba1 | ||
![]() |
d791f6ceaa | ||
![]() |
602a42f5ce | ||
![]() |
c98739d5b5 | ||
![]() |
425504454c | ||
![]() |
780031847c | ||
![]() |
c3af613db1 | ||
![]() |
babd01a87f | ||
![]() |
17b605a32b | ||
![]() |
fc813acd7b | ||
![]() |
d842d6772d | ||
![]() |
67aaf93157 | ||
![]() |
9154275431 | ||
![]() |
c343ef7aad | ||
![]() |
78093735b7 | ||
![]() |
ed6a111982 | ||
![]() |
a8a5be7a34 | ||
![]() |
5008947e32 | ||
![]() |
0827a5116f | ||
![]() |
85d0e93af5 | ||
![]() |
f677436437 | ||
![]() |
05f8992e3e | ||
![]() |
2ed7ce49a2 | ||
![]() |
9087867631 | ||
![]() |
f58a0cdbfd | ||
![]() |
91fb02d62e | ||
![]() |
d831fd4789 | ||
![]() |
322e642f19 | ||
![]() |
4967acaec9 | ||
![]() |
113e5a322e | ||
![]() |
9c29457ee2 | ||
![]() |
4fe5ee034c | ||
![]() |
78650f827e | ||
![]() |
a4fc448a52 | ||
![]() |
01a71dc189 | ||
![]() |
90a200be25 | ||
![]() |
9c92fcc92d | ||
![]() |
6f9f4b3635 | ||
![]() |
968fbc9424 | ||
![]() |
7862c6a7db | ||
![]() |
ced72f4a89 | ||
![]() |
85dbadee5c | ||
![]() |
cf13abdab6 | ||
![]() |
239d4a5bfb | ||
![]() |
51e96433ea | ||
![]() |
12274a969a | ||
![]() |
79a4dd4a26 | ||
![]() |
d9e86600dc | ||
![]() |
b8cb1bbdcf | ||
![]() |
c180349fc6 | ||
![]() |
a6fec278c3 | ||
![]() |
999ede59ce | ||
![]() |
30a7b0ef3b | ||
![]() |
16af90648e | ||
![]() |
7723951c05 | ||
![]() |
1668cde93f | ||
![]() |
418ca34c85 | ||
![]() |
6d8e588b78 | ||
![]() |
9bf2d6ce5b | ||
![]() |
496daf9220 | ||
![]() |
573e06cc0c | ||
![]() |
6d77ace5c9 | ||
![]() |
aa78362c7f | ||
![]() |
6151674e64 | ||
![]() |
1ea0dde417 | ||
![]() |
53dea7b6d7 | ||
![]() |
c87ba45a86 | ||
![]() |
6ea25e2272 | ||
![]() |
888c335c2e | ||
![]() |
4dcf97c4c1 | ||
![]() |
352ee3a318 | ||
![]() |
c8abff33c1 | ||
![]() |
998690f58c | ||
![]() |
6e68c2ec02 | ||
![]() |
896b7c7559 | ||
![]() |
69b190775c | ||
![]() |
b769de0690 | ||
![]() |
19482529ee | ||
![]() |
ad8e325139 | ||
![]() |
b901a69f5c | ||
![]() |
62a165e4cf | ||
![]() |
29616dc163 | ||
![]() |
60324d4b7a | ||
![]() |
cfa6575b4f | ||
![]() |
3b01e4e4e0 | ||
![]() |
fa4a93c465 | ||
![]() |
74d6d53ac6 | ||
![]() |
8070a656fe | ||
![]() |
105a0c2029 | ||
![]() |
e887546c27 | ||
![]() |
9305232f8c | ||
![]() |
7832a6342a | ||
![]() |
c924a47188 | ||
![]() |
1d42d55064 | ||
![]() |
dd7550dbad | ||
![]() |
7df7daa050 | ||
![]() |
090a7e664e | ||
![]() |
3d49bed0cf | ||
![]() |
9f28098d04 | ||
![]() |
e761b22c61 | ||
![]() |
4d62f545c5 | ||
![]() |
f789495c39 | ||
![]() |
46a64c0f68 | ||
![]() |
ab8a39e71f | ||
![]() |
630301a7ba | ||
![]() |
d4fd987e84 | ||
![]() |
c5abe5d882 | ||
![]() |
71dbbc1b5a | ||
![]() |
c9a9585573 | ||
![]() |
bb2f398fa2 | ||
![]() |
afc54aeb20 | ||
![]() |
9c142e5509 | ||
![]() |
27f98f50d3 | ||
![]() |
0145594adc | ||
![]() |
67ee0de7e3 | ||
![]() |
087718c47a | ||
![]() |
6bf5930703 | ||
![]() |
90c4fa2a84 | ||
![]() |
b75c3257bd | ||
![]() |
178b09f5bb | ||
![]() |
70980efe39 | ||
![]() |
c124dbdd6a | ||
![]() |
6af2a65e53 | ||
![]() |
54f89e7568 | ||
![]() |
66205cf648 | ||
![]() |
b38d8618b2 | ||
![]() |
051093f4f8 | ||
![]() |
2a85c0a474 | ||
![]() |
7018b8b164 | ||
![]() |
41232ccb39 | ||
![]() |
6bd4399aee | ||
![]() |
45dafbcdcc | ||
![]() |
a32bfd1215 | ||
![]() |
78f7a9a244 | ||
![]() |
44782001e2 | ||
![]() |
c7d7d07ee4 | ||
![]() |
27390c387d | ||
![]() |
ceee3d3be1 | ||
![]() |
983c016bba | ||
![]() |
8a7e955453 | ||
![]() |
376f7b261e | ||
![]() |
80423d7e69 | ||
![]() |
da61f3dfea | ||
![]() |
a49ec4d583 | ||
![]() |
5f849bdb3f | ||
![]() |
d875e0280c | ||
![]() |
4188c062e7 | ||
![]() |
21ae72d02e | ||
![]() |
d834a9c1c1 | ||
![]() |
07b102bb80 | ||
![]() |
480e2442ee | ||
![]() |
a9c7bf97ef | ||
![]() |
cae40c3f72 | ||
![]() |
4f90d1a0d9 | ||
![]() |
22b3d0e49f | ||
![]() |
0732603a4e | ||
![]() |
e34b6f4204 | ||
![]() |
64142de4fe | ||
![]() |
a4062f6ac0 | ||
![]() |
76baf58d5d | ||
![]() |
e134d7f0b4 | ||
![]() |
20a0051578 | ||
![]() |
eca3204e82 | ||
![]() |
a19ab9f4e3 | ||
![]() |
133d52d040 | ||
![]() |
20a77cb9c7 | ||
![]() |
cab96d2156 | ||
![]() |
9be76cce9e | ||
![]() |
e7035f3235 | ||
![]() |
6e4ac0c501 | ||
![]() |
aa612463cc | ||
![]() |
9827ad43e4 | ||
![]() |
e0bb900651 | ||
![]() |
ad1b577ca9 | ||
![]() |
f72cfa9a13 | ||
![]() |
056635119c | ||
![]() |
2e754a5557 | ||
![]() |
6959447c2c | ||
![]() |
4a363b6e76 | ||
![]() |
862cacabcb | ||
![]() |
29e6204bde | ||
![]() |
bc6c868c8a | ||
![]() |
9d87193d80 | ||
![]() |
85b660fb4b | ||
![]() |
5a6e46c32a | ||
![]() |
457d8fc6cc | ||
![]() |
8ebbb45a19 | ||
![]() |
13dae75d01 | ||
![]() |
172847bc76 | ||
![]() |
2b2551bc50 | ||
![]() |
aa8957f137 | ||
![]() |
ba9a7916db | ||
![]() |
5945dba412 | ||
![]() |
7d5413ce95 | ||
![]() |
364ee0f8ed | ||
![]() |
213a513f54 | ||
![]() |
aa65e626f4 | ||
![]() |
5b3b29565c | ||
![]() |
f38f81159d | ||
![]() |
7511307868 | ||
![]() |
1cadc6b1dc | ||
![]() |
405437b086 | ||
![]() |
51f4382b9f | ||
![]() |
e967a409d3 | ||
![]() |
eaebfc795e | ||
![]() |
3bc66a7054 | ||
![]() |
8cfcc69100 | ||
![]() |
ce3bc85d32 | ||
![]() |
1fe9e3aa67 | ||
![]() |
d93a8e341f | ||
![]() |
1107cefdb6 | ||
![]() |
92b2bb7532 | ||
![]() |
9a2a9187cd | ||
![]() |
50b57ada7c | ||
![]() |
a8649767f2 | ||
![]() |
2eb605873c | ||
![]() |
26e8679359 | ||
![]() |
2aa673e780 | ||
![]() |
06303ae7ab | ||
![]() |
2b3d588f10 | ||
![]() |
3dd7febb98 | ||
![]() |
beb5bfea36 | ||
![]() |
628f286eb6 | ||
![]() |
9e14c7a803 | ||
![]() |
863f2e019c | ||
![]() |
4334ce9c29 | ||
![]() |
7008e49675 | ||
![]() |
b84596be57 | ||
![]() |
4fd26306fe | ||
![]() |
8e9ea2d98c | ||
![]() |
1024cbe5b3 | ||
![]() |
a16ef68a49 | ||
![]() |
7726904f79 | ||
![]() |
1481734f47 | ||
![]() |
01955b867d | ||
![]() |
549a2b0790 | ||
![]() |
2caaa09c99 | ||
![]() |
da06a50072 | ||
![]() |
2b02af13ba | ||
![]() |
ae238bc984 | ||
![]() |
3d2036db61 | ||
![]() |
b8360cae08 | ||
![]() |
790cb104cd | ||
![]() |
f3c935d2e1 | ||
![]() |
e589265921 | ||
![]() |
eb6f242d99 | ||
![]() |
ce6d5aa6a0 | ||
![]() |
f269d5b613 | ||
![]() |
a84c492130 | ||
![]() |
3ae636b454 | ||
![]() |
06e3f9f0a4 | ||
![]() |
1669303a40 | ||
![]() |
39e37b6175 | ||
![]() |
c72ba1f188 | ||
![]() |
4d625e5574 | ||
![]() |
803f95050f | ||
![]() |
c021cf34be | ||
![]() |
7fce7d1049 | ||
![]() |
bd36895afe | ||
![]() |
b90c48f837 | ||
![]() |
344775aa8e | ||
![]() |
7d0c20e133 | ||
![]() |
ab5a2e8d10 | ||
![]() |
e34c1ebcba | ||
![]() |
73dbc01c2e | ||
![]() |
f0773c4ab8 | ||
![]() |
cc5c9f6008 | ||
![]() |
da9c591eed | ||
![]() |
6790ab01e8 | ||
![]() |
f9cecca362 | ||
![]() |
f4009939a6 | ||
![]() |
17b5b34e3c | ||
![]() |
c291c20a3b | ||
![]() |
22e7ce37d4 | ||
![]() |
2137602a6a | ||
![]() |
c7b29b5a9a | ||
![]() |
715b5b64c6 | ||
![]() |
c20ed8c7b3 | ||
![]() |
d3baacd78e | ||
![]() |
07e20784cb | ||
![]() |
9eb8bb6c40 | ||
![]() |
e10c0f3120 | ||
![]() |
6f7efebb56 | ||
![]() |
a657778065 | ||
![]() |
3650d94bb5 | ||
![]() |
6a428f3d02 | ||
![]() |
abe1d96c58 | ||
![]() |
29a59cfe48 | ||
![]() |
18c54f4e9e | ||
![]() |
c7d967a2b5 | ||
![]() |
b50ea7ef1f | ||
![]() |
4843cd432f | ||
![]() |
d56eae809d | ||
![]() |
af97211ecc | ||
![]() |
601fcba4cb | ||
![]() |
cc3a9f7722 | ||
![]() |
296ef8287f | ||
![]() |
b5dab24679 | ||
![]() |
319414b985 | ||
![]() |
6b0058c89c | ||
![]() |
855c828d1f | ||
![]() |
c72ef537ee | ||
![]() |
11e86811a0 | ||
![]() |
2183f60917 | ||
![]() |
05f0fbf195 | ||
![]() |
853da159de | ||
![]() |
643ae7e5f9 | ||
![]() |
322e25d18e | ||
![]() |
bdd8ba115e | ||
![]() |
71ad7c368d | ||
![]() |
8be0f8a0b0 | ||
![]() |
e9e678a994 | ||
![]() |
a89152a3d7 | ||
![]() |
73f5d950e5 | ||
![]() |
46d5ab369f | ||
![]() |
81906b74ed | ||
![]() |
74b0f64645 | ||
![]() |
50948d1619 | ||
![]() |
38f1132192 | ||
![]() |
50ef49d190 | ||
![]() |
3669ac8aed | ||
![]() |
7f8519c0af | ||
![]() |
859ba3e0c2 | ||
![]() |
94c2a115d5 | ||
![]() |
634b646711 | ||
![]() |
2a9dc2c7b2 | ||
![]() |
ef93a5359b | ||
![]() |
efb1fc9b3f | ||
![]() |
aa5faf1f36 | ||
![]() |
4723283896 | ||
![]() |
36187e07d0 | ||
![]() |
a9583b43c3 | ||
![]() |
ca54f81f58 | ||
![]() |
b4399291ef | ||
![]() |
a8df58f056 | ||
![]() |
54a89b39fb | ||
![]() |
4a931b42ab | ||
![]() |
15d73b9d20 | ||
![]() |
c2d4f73893 | ||
![]() |
31b85351f2 | ||
![]() |
c900f0ad83 | ||
![]() |
b2e6749fd2 | ||
![]() |
2437dc4e06 | ||
![]() |
115e7d08aa | ||
![]() |
d9ddbe0212 | ||
![]() |
512285e48d | ||
![]() |
642e7ecc29 | ||
![]() |
ce5a8acaf7 | ||
![]() |
3d9a5a1635 | ||
![]() |
3469a51f58 | ||
![]() |
d4b30957a3 | ||
![]() |
cc377bbebf | ||
![]() |
eec836239f | ||
![]() |
941d51a6e7 | ||
![]() |
e3243fa35b | ||
![]() |
70512c7116 | ||
![]() |
3c896d1c6a | ||
![]() |
b455d93c69 | ||
![]() |
017b2feac1 | ||
![]() |
5f47860ee1 | ||
![]() |
795498fa45 | ||
![]() |
aa1717ee77 | ||
![]() |
db6d3e63f2 | ||
![]() |
0304428d95 | ||
![]() |
74b80bfe08 | ||
![]() |
90ce65e4dc | ||
![]() |
d4d9771a71 | ||
![]() |
70ee294079 | ||
![]() |
5f4d17621f | ||
![]() |
8f4179050b | ||
![]() |
fddacd51a4 | ||
![]() |
e726ba9a8b | ||
![]() |
da1673e264 | ||
![]() |
7cd34d3709 | ||
![]() |
ec7fd05987 | ||
![]() |
34a58863e3 | ||
![]() |
3237a955e5 | ||
![]() |
8e7489c2be | ||
![]() |
df5202a2f0 | ||
![]() |
db3a5d8915 | ||
![]() |
6110f213de | ||
![]() |
e99fe98db4 | ||
![]() |
b07e28be2c | ||
![]() |
937d5fe495 | ||
![]() |
01141e5f69 | ||
![]() |
15569d0b13 | ||
![]() |
918806006c | ||
![]() |
d5e030a638 | ||
![]() |
47f1beca0c | ||
![]() |
a565b0e4c1 | ||
![]() |
10d1704899 | ||
![]() |
bc7c8e3952 | ||
![]() |
4e35515a8c | ||
![]() |
d2a3fe3ed2 | ||
![]() |
9bd1b39f9f | ||
![]() |
20a01a25e4 | ||
![]() |
68e69debff | ||
![]() |
7a333eecbe | ||
![]() |
e274bcc87d | ||
![]() |
c42cb2bbac | ||
![]() |
9ee7054823 | ||
![]() |
65e16dcac1 | ||
![]() |
97c2d6a29d | ||
![]() |
93cdee80ed | ||
![]() |
11055f61a6 | ||
![]() |
af99799e8a | ||
![]() |
926f60b2ed | ||
![]() |
0fdbb03f54 | ||
![]() |
bd0332c716 | ||
![]() |
45007809f6 | ||
![]() |
0e0fdb440c | ||
![]() |
2016cf547f | ||
![]() |
ead87e3727 | ||
![]() |
f56739fd9f | ||
![]() |
c5f2b389c3 | ||
![]() |
4cc95dda42 | ||
![]() |
0bfbe3e154 | ||
![]() |
9bd6b11007 | ||
![]() |
c013a59d16 | ||
![]() |
aa02c4de1e | ||
![]() |
fb9e2b9603 | ||
![]() |
a70bdc0776 | ||
![]() |
936460212f | ||
![]() |
8ac51e63b5 | ||
![]() |
090a8e3c95 | ||
![]() |
101cce0c1e | ||
![]() |
a935302a19 | ||
![]() |
9a0ff13cc2 | ||
![]() |
ef933c07cc | ||
![]() |
df5291e4bd | ||
![]() |
7a8c0331c1 | ||
![]() |
28e37bcaad | ||
![]() |
8a3344e78a | ||
![]() |
ce95f1f25a | ||
![]() |
f1739ce34d | ||
![]() |
1add1de23b | ||
![]() |
e25bdba16d | ||
![]() |
7c63cd1000 | ||
![]() |
4192190a96 | ||
![]() |
a733ba311c | ||
![]() |
fe472a63a0 | ||
![]() |
25b78b73d0 | ||
![]() |
b978a47925 | ||
![]() |
b44b1304b8 | ||
![]() |
a4fd756eae | ||
![]() |
8d4c1e3617 | ||
![]() |
54f5db851d | ||
![]() |
35042ebc6a | ||
![]() |
6c2dfd3d31 | ||
![]() |
543b874a10 | ||
![]() |
4258d3dc24 | ||
![]() |
949649e3a9 | ||
![]() |
82d95ac81d | ||
![]() |
3124644315 | ||
![]() |
27ba09debf | ||
![]() |
686938045b | ||
![]() |
5645858262 | ||
![]() |
410c81a51d | ||
![]() |
d19bac70ce | ||
![]() |
9b9eb409b2 | ||
![]() |
f3ad49ebc4 | ||
![]() |
394ba26d1d | ||
![]() |
cafe28fdea | ||
![]() |
22cefeb2bd | ||
![]() |
9e4cccd4db | ||
![]() |
3ff3bdf812 | ||
![]() |
45f0f983b1 | ||
![]() |
28e94513db | ||
![]() |
afe32e2c05 | ||
![]() |
0b6d40c9df | ||
![]() |
992d84c002 | ||
![]() |
9b675fe775 | ||
![]() |
35783d9a2c | ||
![]() |
f28e7b37bc | ||
![]() |
eceb9b729f | ||
![]() |
ce348596b7 | ||
![]() |
b85cd9a487 | ||
![]() |
d170885d8d | ||
![]() |
9a6bd83aa1 | ||
![]() |
0d31482647 | ||
![]() |
40c27b54b0 | ||
![]() |
0380695bba | ||
![]() |
899b77cdf4 | ||
![]() |
4819baaa07 | ||
![]() |
5a34020d23 | ||
![]() |
2b1d4ff98d | ||
![]() |
ed4843b0ed | ||
![]() |
30bd8f1570 | ||
![]() |
74d6f0a68d | ||
![]() |
5872ccc992 | ||
![]() |
9ee23d3649 | ||
![]() |
724f304e48 | ||
![]() |
a16e5a7055 | ||
![]() |
3bda858225 | ||
![]() |
701d2ce0f6 | ||
![]() |
be847a7e91 | ||
![]() |
fff0b5209c | ||
![]() |
2c5a8f0860 | ||
![]() |
103a30df2c | ||
![]() |
e4c8dbc2af | ||
![]() |
882cd8faf5 | ||
![]() |
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 |
473 changed files with 40447 additions and 11776 deletions
|
@ -1,4 +1 @@
|
||||||
# Update the VARIANT arg to pick an Elixir version: latest, 1.11.4, etc.
|
FROM ghcr.io/processone/devcontainer:latest
|
||||||
ARG VARIANT=latest
|
|
||||||
|
|
||||||
FROM ghcr.io/processone/elixir:${VARIANT}
|
|
||||||
|
|
|
@ -1,48 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "ejabberd",
|
"name": "ejabberd",
|
||||||
// "dockerComposeFile": "docker-compose.yml",
|
"build": {"dockerfile": "Dockerfile"},
|
||||||
"build": {
|
"extensions": ["erlang-ls.erlang-ls"],
|
||||||
"dockerfile": "Dockerfile",
|
"postCreateCommand": ".devcontainer/prepare-container.sh",
|
||||||
"args": {
|
"remoteUser": "vscode"
|
||||||
"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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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-*.rpm
|
||||||
/ejabberd-*.run
|
/ejabberd-*.run
|
||||||
/ejabberd-*.tar.gz
|
/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:
|
Before creating a ticket, please consider if this should fit the [discussion forum](https://github.com/processone/ejabberd/discussions) better.
|
||||||
https://github.com/processone/ejabberd/discussions
|
|
||||||
|
|
||||||
## Environment
|
## 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:
|
Before creating a ticket, please consider if this should fit the [discussion forum](https://github.com/processone/ejabberd/discussions) better.
|
||||||
https://github.com/processone/ejabberd/discussions
|
|
||||||
|
|
||||||
**Is your feature request related to a problem? Please describe.**
|
**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**
|
**Describe the solution you'd like**
|
||||||
|
|
||||||
A clear and concise description of what you want to happen.
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
**Describe alternatives you've considered**
|
**Describe alternatives you've considered**
|
||||||
|
|
||||||
A clear and concise description of any alternative solutions or features you've considered.
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
**Additional context**
|
**Additional context**
|
||||||
|
|
||||||
Add any other context or screenshots about the feature request here.
|
Add any other context or screenshots about the feature request here.
|
||||||
|
|
219
.github/container/Dockerfile
vendored
219
.github/container/Dockerfile
vendored
|
@ -1,16 +1,29 @@
|
||||||
FROM alpine:3.15.4 AS build
|
#' Define default build variables
|
||||||
ARG VERSION=master
|
ARG OTP_VSN='27.3.4.3'
|
||||||
|
ARG ELIXIR_VSN='1.18.4'
|
||||||
|
ARG UID='9000'
|
||||||
|
ARG USER='ejabberd'
|
||||||
|
ARG HOME="opt/$USER"
|
||||||
|
ARG BUILD_DIR="/$USER"
|
||||||
|
ARG VERSION='master'
|
||||||
|
|
||||||
RUN apk upgrade --update musl \
|
################################################################################
|
||||||
&& apk add \
|
#' Compile ejabberdapi
|
||||||
|
FROM docker.io/golang:1.25-alpine AS api
|
||||||
|
RUN go install -v \
|
||||||
|
github.com/processone/ejabberd-api/cmd/ejabberd@master \
|
||||||
|
&& mv bin/ejabberd bin/ejabberdapi
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
#' build and install ejabberd directly from source
|
||||||
|
FROM docker.io/erlang:${OTP_VSN}-alpine AS ejabberd
|
||||||
|
|
||||||
|
RUN apk -U add --no-cache \
|
||||||
autoconf \
|
autoconf \
|
||||||
automake \
|
automake \
|
||||||
bash \
|
bash \
|
||||||
build-base \
|
build-base \
|
||||||
curl \
|
curl \
|
||||||
elixir \
|
|
||||||
erlang-odbc \
|
|
||||||
erlang-reltool \
|
|
||||||
expat-dev \
|
expat-dev \
|
||||||
file \
|
file \
|
||||||
gd-dev \
|
gd-dev \
|
||||||
|
@ -19,37 +32,67 @@ RUN apk upgrade --update musl \
|
||||||
libpng-dev \
|
libpng-dev \
|
||||||
libwebp-dev \
|
libwebp-dev \
|
||||||
linux-pam-dev \
|
linux-pam-dev \
|
||||||
openssl \
|
|
||||||
openssl-dev \
|
openssl-dev \
|
||||||
sqlite-dev \
|
sqlite-dev \
|
||||||
yaml-dev \
|
yaml-dev \
|
||||||
zlib-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
|
||||||
|
ENV ERL_FLAGS="+JPperf true"
|
||||||
|
RUN make install clean
|
||||||
|
|
||||||
RUN mix local.hex --force \
|
RUN mix local.hex --force \
|
||||||
&& mix local.rebar --force
|
&& mix local.rebar --force
|
||||||
|
|
||||||
COPY . ./ejabberd
|
ARG BUILD_DIR
|
||||||
|
COPY / $BUILD_DIR/
|
||||||
WORKDIR ejabberd
|
|
||||||
|
|
||||||
|
WORKDIR $BUILD_DIR
|
||||||
RUN mv .github/container/ejabberdctl.template . \
|
RUN mv .github/container/ejabberdctl.template . \
|
||||||
|
&& mv .github/container/ejabberd.yml.example . \
|
||||||
&& ./autogen.sh \
|
&& ./autogen.sh \
|
||||||
&& ./configure --with-rebar=mix --enable-all \
|
&& ./configure --with-rebar=mix --enable-all \
|
||||||
&& make deps \
|
&& make deps \
|
||||||
&& make rel
|
&& make rel
|
||||||
|
|
||||||
RUN cp -r _build/prod/rel/ejabberd/ /opt/ejabberd-$VERSION \
|
WORKDIR /rootfs
|
||||||
&& mkdir -p /opt/ejabberd \
|
ARG VERSION
|
||||||
&& mv /opt/ejabberd-$VERSION/conf /opt/ejabberd/conf
|
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/ \
|
RUN cp -p $BUILD_DIR/tools/captcha*.sh $HOME-$VERSION/lib
|
||||||
&& mkdir -p $BINPATH \
|
|
||||||
&& cp tools/captcha*.sh $BINPATH
|
|
||||||
|
|
||||||
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 \
|
RUN wget -O "$HOME/conf/cacert.pem" 'https://curl.se/ca/cacert.pem'
|
||||||
&& curl -o "/opt/ejabberd/conf/cacert.pem" 'https://curl.se/ca/cacert.pem' \
|
|
||||||
|
#' Prepare ejabberd for runtime
|
||||||
|
RUN apk -U add --no-cache \
|
||||||
|
git \
|
||||||
|
libcap \
|
||||||
|
openssl
|
||||||
|
|
||||||
|
RUN mkdir -p usr/local/bin $HOME/conf $HOME/database $HOME/logs $HOME/upload
|
||||||
|
|
||||||
|
COPY --from=api /go/bin/ejabberdapi usr/local/bin/
|
||||||
|
|
||||||
|
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 \
|
&& openssl req -x509 \
|
||||||
-batch \
|
-batch \
|
||||||
-nodes \
|
-nodes \
|
||||||
|
@ -57,63 +100,107 @@ RUN export PEM=/opt/ejabberd/conf/server.pem \
|
||||||
-keyout $PEM \
|
-keyout $PEM \
|
||||||
-out $PEM \
|
-out $PEM \
|
||||||
-days 3650 \
|
-days 3650 \
|
||||||
-subj "/CN=localhost" \
|
-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"
|
|
||||||
|
|
||||||
FROM alpine:3.15.4
|
RUN sed -i 's|^#CTL_OVER_HTTP=|CTL_OVER_HTTP=../|' "$HOME/conf/ejabberdctl.cfg"
|
||||||
ENV HOME=/opt/ejabberd
|
|
||||||
ARG VERSION=master
|
|
||||||
|
|
||||||
RUN apk upgrade --update musl \
|
RUN home_root_dir=$(echo $HOME | sed 's|\(.*\)/.*|\1 |') \
|
||||||
&& apk add \
|
&& setcap 'cap_net_bind_service=+ep' $(find $home_root_dir -name beam.smp) \
|
||||||
expat \
|
&& echo -e \
|
||||||
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 \
|
|
||||||
"#!/bin/sh \
|
"#!/bin/sh \
|
||||||
\n[ -z \$ERLANG_NODE_ARG ] && export ERLANG_NODE_ARG=ejabberd@localhost \
|
\n[ -z \$ERLANG_NODE_ARG ] && export ERLANG_NODE_ARG=ejabberd@localhost \
|
||||||
\nexport CONFIG_DIR=/opt/ejabberd/conf \
|
\nexport EMA=\"\$EJABBERD_MACRO_ADMIN\" \
|
||||||
\nexport LOGS_DIR=/opt/ejabberd/logs \
|
\nexport HOST=\"\${EJABBERD_MACRO_HOST:-localhost}\" \
|
||||||
\nexport SPOOL_DIR=/opt/ejabberd/database \
|
\nif [ -n \"\$EMA\" ] \
|
||||||
\nexec /opt/ejabberd-$VERSION/bin/ejabberdctl \"\$@\"" > /usr/local/bin/ejabberdctl \
|
\nthen \
|
||||||
&& chmod +x /usr/local/bin/ejabberdctl
|
\n if [ \"\$EMA\" != \"\${EMA%%@*}\" ] \
|
||||||
|
\n then \
|
||||||
|
\n export USERNAME=\"\${EMA%%@*}\" \
|
||||||
|
\n export HOST=\"\${EMA##*@}\" \
|
||||||
|
\n else \
|
||||||
|
\n export USERNAME=\"\$EMA\" \
|
||||||
|
\n export SHOW_WARNING=\"true\" \
|
||||||
|
\n fi \
|
||||||
|
\nelif [ -n \"\$REGISTER_ADMIN_PASSWORD\" ] \
|
||||||
|
\nthen \
|
||||||
|
\n export USERNAME=\"admin\" \
|
||||||
|
\nelse \
|
||||||
|
\n export USERNAME=\"\$(od -A n -N 8 -t x8 /dev/urandom)\" \
|
||||||
|
\nfi \
|
||||||
|
\nexport EJABBERD_MACRO_ADMIN=\"\$USERNAME@\$HOST\" \
|
||||||
|
\n[ -n \"\$SHOW_WARNING\" ] && echo \"WARNING: The EJABBERD_MACRO_ADMIN environment variable was set to '\$EMA', but it should include the host... I'll overwrite it to become '\$EJABBERD_MACRO_ADMIN'.\" \
|
||||||
|
\n[ -n \"\$CTL_ON_CREATE\" ] && export SEPARATOR=\";\" \
|
||||||
|
\n[ -n \"\$REGISTER_ADMIN_PASSWORD\" ] && export CTL_ON_CREATE=\"register \${EJABBERD_MACRO_ADMIN%%@*} \${EJABBERD_MACRO_ADMIN##*@} \$REGISTER_ADMIN_PASSWORD \$SEPARATOR \$CTL_ON_CREATE\" \
|
||||||
|
\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 \
|
ARG UID
|
||||||
&& adduser -s /bin/sh -D -G ejabberd ejabberd -u 9000 \
|
RUN chown -R $UID:$UID $HOME
|
||||||
&& mkdir -p $HOME/conf $HOME/database $HOME/logs $HOME/upload \
|
|
||||||
&& chown -R ejabberd:ejabberd $HOME
|
RUN cp /rootfs/$HOME-$VERSION/lib/captcha*.sh usr/local/bin/
|
||||||
|
RUN mkdir $HOME/sql \
|
||||||
|
&& find /rootfs/$HOME-$VERSION/lib/ -name *.sql -exec cp {} $HOME/sql \; -exec cp {} $HOME/database \;
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
#' Remove erlang/OTP & rebar3
|
||||||
|
FROM docker.io/erlang:${OTP_VSN}-alpine AS runtime
|
||||||
|
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
|
||||||
|
|
||||||
|
#' Update alpine, finalize runtime environment
|
||||||
|
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 \
|
||||||
|
curl \
|
||||||
|
tini \
|
||||||
|
&& rm /tmp/runDeps \
|
||||||
|
&& 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
|
||||||
|
|
||||||
|
RUN ln -fs /usr/local/bin/ /opt/ejabberd/bin
|
||||||
|
RUN rm -rf /home \
|
||||||
|
&& ln -fs /opt /home
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
#' Build together production image
|
||||||
|
FROM scratch
|
||||||
|
ARG USER
|
||||||
|
ARG HOME
|
||||||
|
|
||||||
|
COPY --from=runtime / /
|
||||||
|
COPY --from=ejabberd /rootfs /
|
||||||
|
|
||||||
HEALTHCHECK \
|
HEALTHCHECK \
|
||||||
--interval=1m \
|
--interval=1m \
|
||||||
--timeout=5s \
|
--timeout=5s \
|
||||||
--start-period=5s \
|
--start-period=5s \
|
||||||
--retries=10 \
|
--retries=10 \
|
||||||
CMD /usr/local/bin/ejabberdctl status
|
CMD ejabberdctl status
|
||||||
|
|
||||||
WORKDIR $HOME
|
WORKDIR /$HOME
|
||||||
USER ejabberd
|
USER $USER
|
||||||
VOLUME ["$HOME/conf", "$HOME/database", "$HOME/logs", "$HOME/upload"]
|
VOLUME ["/$HOME"]
|
||||||
EXPOSE 1883 4369-4399 5210 5222 5269 5280 5443
|
EXPOSE 1880 1883 4369-4399 5210 5222 5269 5280 5443
|
||||||
|
|
||||||
ENTRYPOINT ["/usr/local/bin/ejabberdctl"]
|
ENTRYPOINT ["/sbin/tini","--","ejabberdctl"]
|
||||||
CMD ["foreground"]
|
CMD ["foreground"]
|
||||||
|
|
278
.github/container/ejabberd.yml.example
vendored
Normal file
278
.github/container/ejabberd.yml.example
vendored
Normal file
|
@ -0,0 +1,278 @@
|
||||||
|
###
|
||||||
|
### ejabberd configuration file
|
||||||
|
###
|
||||||
|
### The parameters used in this configuration file are explained at
|
||||||
|
###
|
||||||
|
### https://docs.ejabberd.im/admin/configuration
|
||||||
|
###
|
||||||
|
### The configuration file is written in YAML.
|
||||||
|
### *******************************************************
|
||||||
|
### ******* !!! WARNING !!! *******
|
||||||
|
### ******* YAML IS INDENTATION SENSITIVE *******
|
||||||
|
### ******* MAKE SURE YOU INDENT SECTIONS CORRECTLY *******
|
||||||
|
### *******************************************************
|
||||||
|
### Refer to http://en.wikipedia.org/wiki/YAML for the brief description.
|
||||||
|
###
|
||||||
|
|
||||||
|
define_macro:
|
||||||
|
HOST: localhost
|
||||||
|
## ADMIN: ... # set by /usr/local/bin/ejabberdctl
|
||||||
|
PORT_C2S: 5222
|
||||||
|
PORT_C2S_TLS: 5223
|
||||||
|
PORT_S2S: 5269
|
||||||
|
PORT_HTTP_TLS: 5443
|
||||||
|
PORT_HTTP: 5280
|
||||||
|
PORT_BROWSER: 1880
|
||||||
|
PORT_STUN: 5478
|
||||||
|
PORT_MQTT: 1883
|
||||||
|
PORT_PROXY65: 7777
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
- HOST
|
||||||
|
|
||||||
|
loglevel: info
|
||||||
|
|
||||||
|
## If you already have certificates, list them here
|
||||||
|
# certfiles:
|
||||||
|
# - /etc/letsencrypt/live/domain.tld/fullchain.pem
|
||||||
|
# - /etc/letsencrypt/live/domain.tld/privkey.pem
|
||||||
|
|
||||||
|
ca_file: /opt/ejabberd/conf/cacert.pem
|
||||||
|
certfiles:
|
||||||
|
- /opt/ejabberd/conf/server.pem
|
||||||
|
|
||||||
|
listen:
|
||||||
|
-
|
||||||
|
port: PORT_C2S
|
||||||
|
ip: "::"
|
||||||
|
module: ejabberd_c2s
|
||||||
|
max_stanza_size: 262144
|
||||||
|
shaper: c2s_shaper
|
||||||
|
access: c2s
|
||||||
|
starttls_required: true
|
||||||
|
-
|
||||||
|
port: PORT_C2S_TLS
|
||||||
|
ip: "::"
|
||||||
|
module: ejabberd_c2s
|
||||||
|
max_stanza_size: 262144
|
||||||
|
shaper: c2s_shaper
|
||||||
|
access: c2s
|
||||||
|
tls: true
|
||||||
|
-
|
||||||
|
port: PORT_S2S
|
||||||
|
ip: "::"
|
||||||
|
module: ejabberd_s2s_in
|
||||||
|
max_stanza_size: 524288
|
||||||
|
shaper: s2s_shaper
|
||||||
|
-
|
||||||
|
port: PORT_HTTP_TLS
|
||||||
|
ip: "::"
|
||||||
|
module: ejabberd_http
|
||||||
|
tls: true
|
||||||
|
request_handlers:
|
||||||
|
/admin: ejabberd_web_admin
|
||||||
|
/api: mod_http_api
|
||||||
|
/bosh: mod_bosh
|
||||||
|
/captcha: ejabberd_captcha
|
||||||
|
/upload: mod_http_upload
|
||||||
|
/ws: ejabberd_http_ws
|
||||||
|
-
|
||||||
|
port: PORT_HTTP
|
||||||
|
ip: "::"
|
||||||
|
module: ejabberd_http
|
||||||
|
request_handlers:
|
||||||
|
/admin: ejabberd_web_admin
|
||||||
|
/.well-known/acme-challenge: ejabberd_acme
|
||||||
|
-
|
||||||
|
port: PORT_BROWSER
|
||||||
|
ip: "::"
|
||||||
|
module: ejabberd_http
|
||||||
|
request_handlers:
|
||||||
|
/: ejabberd_web_admin
|
||||||
|
-
|
||||||
|
port: "unix:../sockets/ctl_over_http.sock"
|
||||||
|
module: ejabberd_http
|
||||||
|
unix_socket:
|
||||||
|
mode: '0600'
|
||||||
|
request_handlers:
|
||||||
|
/ctl: ejabberd_ctl
|
||||||
|
-
|
||||||
|
port: PORT_STUN
|
||||||
|
ip: "::"
|
||||||
|
transport: udp
|
||||||
|
module: ejabberd_stun
|
||||||
|
use_turn: true
|
||||||
|
## The server's public IPv4 address:
|
||||||
|
# turn_ipv4_address: "203.0.113.3"
|
||||||
|
## The server's public IPv6 address:
|
||||||
|
# turn_ipv6_address: "2001:db8::3"
|
||||||
|
-
|
||||||
|
port: PORT_MQTT
|
||||||
|
ip: "::"
|
||||||
|
module: mod_mqtt
|
||||||
|
backlog: 1000
|
||||||
|
|
||||||
|
s2s_use_starttls: optional
|
||||||
|
|
||||||
|
acl:
|
||||||
|
local:
|
||||||
|
user_regexp: ""
|
||||||
|
loopback:
|
||||||
|
ip:
|
||||||
|
- 127.0.0.0/8
|
||||||
|
- ::1/128
|
||||||
|
admin:
|
||||||
|
user:
|
||||||
|
- ADMIN
|
||||||
|
|
||||||
|
access_rules:
|
||||||
|
local:
|
||||||
|
allow: local
|
||||||
|
c2s:
|
||||||
|
deny: blocked
|
||||||
|
allow: all
|
||||||
|
announce:
|
||||||
|
allow: admin
|
||||||
|
configure:
|
||||||
|
allow: admin
|
||||||
|
muc_create:
|
||||||
|
allow: local
|
||||||
|
pubsub_createnode:
|
||||||
|
allow: local
|
||||||
|
trusted_network:
|
||||||
|
allow: loopback
|
||||||
|
|
||||||
|
api_permissions:
|
||||||
|
"console commands":
|
||||||
|
from: ejabberd_ctl
|
||||||
|
who: all
|
||||||
|
what: "*"
|
||||||
|
"webadmin commands":
|
||||||
|
from: ejabberd_web_admin
|
||||||
|
who: admin
|
||||||
|
what: "*"
|
||||||
|
"admin access":
|
||||||
|
who:
|
||||||
|
access:
|
||||||
|
allow:
|
||||||
|
- acl: loopback
|
||||||
|
- acl: admin
|
||||||
|
oauth:
|
||||||
|
scope: "ejabberd:admin"
|
||||||
|
access:
|
||||||
|
allow:
|
||||||
|
- acl: loopback
|
||||||
|
- acl: admin
|
||||||
|
what:
|
||||||
|
- "*"
|
||||||
|
- "!stop"
|
||||||
|
- "!start"
|
||||||
|
"public commands":
|
||||||
|
who:
|
||||||
|
ip: 127.0.0.1/8
|
||||||
|
what:
|
||||||
|
- status
|
||||||
|
- connected_users_number
|
||||||
|
|
||||||
|
shaper:
|
||||||
|
normal:
|
||||||
|
rate: 3000
|
||||||
|
burst_size: 20000
|
||||||
|
fast: 100000
|
||||||
|
|
||||||
|
shaper_rules:
|
||||||
|
max_user_sessions: 10
|
||||||
|
max_user_offline_messages:
|
||||||
|
5000: admin
|
||||||
|
100: all
|
||||||
|
c2s_shaper:
|
||||||
|
none: admin
|
||||||
|
normal: all
|
||||||
|
s2s_shaper: fast
|
||||||
|
|
||||||
|
modules:
|
||||||
|
mod_adhoc: {}
|
||||||
|
mod_admin_extra: {}
|
||||||
|
mod_announce:
|
||||||
|
access: announce
|
||||||
|
mod_avatar: {}
|
||||||
|
mod_blocking: {}
|
||||||
|
mod_bosh: {}
|
||||||
|
mod_caps: {}
|
||||||
|
mod_carboncopy: {}
|
||||||
|
mod_client_state: {}
|
||||||
|
mod_configure: {}
|
||||||
|
mod_disco: {}
|
||||||
|
mod_fail2ban: {}
|
||||||
|
mod_http_api: {}
|
||||||
|
mod_http_upload:
|
||||||
|
put_url: https://@HOST_URL_ENCODE@:5443/upload
|
||||||
|
custom_headers:
|
||||||
|
"Access-Control-Allow-Origin": "https://@HOST@"
|
||||||
|
"Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
|
||||||
|
"Access-Control-Allow-Headers": "Content-Type"
|
||||||
|
mod_last: {}
|
||||||
|
mod_mam:
|
||||||
|
## Mnesia is limited to 2GB, better to use an SQL backend
|
||||||
|
## For small servers SQLite is a good fit and is very easy
|
||||||
|
## to configure. Uncomment this when you have SQL configured:
|
||||||
|
## db_type: sql
|
||||||
|
assume_mam_usage: true
|
||||||
|
default: always
|
||||||
|
mod_mqtt: {}
|
||||||
|
mod_muc:
|
||||||
|
access:
|
||||||
|
- allow
|
||||||
|
access_admin:
|
||||||
|
- allow: admin
|
||||||
|
access_create: muc_create
|
||||||
|
access_persistent: muc_create
|
||||||
|
access_mam:
|
||||||
|
- allow
|
||||||
|
default_room_options:
|
||||||
|
mam: true
|
||||||
|
mod_muc_admin: {}
|
||||||
|
mod_offline:
|
||||||
|
access_max_user_messages: max_user_offline_messages
|
||||||
|
mod_ping: {}
|
||||||
|
mod_privacy: {}
|
||||||
|
mod_private: {}
|
||||||
|
mod_proxy65:
|
||||||
|
access: local
|
||||||
|
max_connections: 5
|
||||||
|
port: PORT_PROXY65
|
||||||
|
mod_pubsub:
|
||||||
|
access_createnode: pubsub_createnode
|
||||||
|
plugins:
|
||||||
|
- flat
|
||||||
|
- pep
|
||||||
|
force_node_config:
|
||||||
|
## Avoid buggy clients to make their bookmarks public
|
||||||
|
storage:bookmarks:
|
||||||
|
access_model: whitelist
|
||||||
|
mod_push: {}
|
||||||
|
mod_push_keepalive: {}
|
||||||
|
mod_register:
|
||||||
|
## Only accept registration requests from the "trusted"
|
||||||
|
## network (see access_rules section above).
|
||||||
|
## Think twice before enabling registration from any
|
||||||
|
## address. See the Jabber SPAM Manifesto for details:
|
||||||
|
## https://github.com/ge0rg/jabber-spam-fighting-manifesto
|
||||||
|
ip_access: trusted_network
|
||||||
|
mod_roster:
|
||||||
|
versioning: true
|
||||||
|
mod_s2s_bidi: {}
|
||||||
|
mod_s2s_dialback: {}
|
||||||
|
mod_shared_roster: {}
|
||||||
|
mod_stream_mgmt:
|
||||||
|
resend_on_timeout: if_offline
|
||||||
|
mod_stun_disco: {}
|
||||||
|
mod_vcard: {}
|
||||||
|
mod_vcard_xupdate: {}
|
||||||
|
mod_version:
|
||||||
|
show_os: false
|
||||||
|
|
||||||
|
### Local Variables:
|
||||||
|
### mode: yaml
|
||||||
|
### End:
|
||||||
|
### vim: set filetype=yaml tabstop=8
|
322
.github/container/ejabberdctl.template
vendored
322
.github/container/ejabberdctl.template
vendored
|
@ -15,10 +15,10 @@ SCRIPT_DIR="$(cd "$(dirname "$SCRIPT")" && pwd -P)"
|
||||||
# shellcheck disable=SC2034
|
# shellcheck disable=SC2034
|
||||||
ERTS_VSN="{{erts_vsn}}"
|
ERTS_VSN="{{erts_vsn}}"
|
||||||
ERL="{{erl}}"
|
ERL="{{erl}}"
|
||||||
IEX="{{bindir}}/iex"
|
|
||||||
EPMD="{{epmd}}"
|
EPMD="{{epmd}}"
|
||||||
[ -z "$ERLANG_COOKIE" ] && ERL_OPTIONS="-setcookie $(cat "${SCRIPT_DIR%/*}/releases/COOKIE")"
|
IEX="{{iexpath}}"
|
||||||
[ -n "$ERLANG_COOKIE" ] && [ ! -f "$HOME"/.erlang.cookie ] && echo "$ERLANG_COOKIE" > "$HOME"/.erlang.cookie && chmod 400 "$HOME"/.erlang.cookie
|
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
|
# check the proper system user is used
|
||||||
case $(id -un) in
|
case $(id -un) in
|
||||||
|
@ -60,7 +60,6 @@ done
|
||||||
# define ejabberd variables if not already defined from the command line
|
# define ejabberd variables if not already defined from the command line
|
||||||
: "${CONFIG_DIR:="{{config_dir}}"}"
|
: "${CONFIG_DIR:="{{config_dir}}"}"
|
||||||
: "${LOGS_DIR:="{{logs_dir}}"}"
|
: "${LOGS_DIR:="{{logs_dir}}"}"
|
||||||
: "${SPOOL_DIR:="{{spool_dir}}"}"
|
|
||||||
: "${EJABBERD_CONFIG_PATH:="$CONFIG_DIR/ejabberd.yml"}"
|
: "${EJABBERD_CONFIG_PATH:="$CONFIG_DIR/ejabberd.yml"}"
|
||||||
: "${EJABBERDCTL_CONFIG_PATH:="$CONFIG_DIR/ejabberdctl.cfg"}"
|
: "${EJABBERDCTL_CONFIG_PATH:="$CONFIG_DIR/ejabberdctl.cfg"}"
|
||||||
# Allows passing extra Erlang command-line arguments in vm.args file
|
# Allows passing extra Erlang command-line arguments in vm.args file
|
||||||
|
@ -69,16 +68,24 @@ done
|
||||||
[ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH"
|
[ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH"
|
||||||
[ -n "$ERLANG_NODE_ARG" ] && ERLANG_NODE="$ERLANG_NODE_ARG"
|
[ -n "$ERLANG_NODE_ARG" ] && ERLANG_NODE="$ERLANG_NODE_ARG"
|
||||||
[ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && S="-s"
|
[ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && S="-s"
|
||||||
|
: "${SPOOL_DIR:="{{spool_dir}}"}"
|
||||||
: "${EJABBERD_LOG_PATH:="$LOGS_DIR/ejabberd.log"}"
|
: "${EJABBERD_LOG_PATH:="$LOGS_DIR/ejabberd.log"}"
|
||||||
|
|
||||||
|
# backward support for old mnesia spool dir path
|
||||||
|
: "${SPOOL_DIR_OLD:="$SPOOL_DIR/$ERLANG_NODE"}"
|
||||||
|
[ -r "$SPOOL_DIR_OLD/schema.DAT" ] && [ ! -r "$SPOOL_DIR/schema.DAT" ] && SPOOL_DIR="$SPOOL_DIR_OLD"
|
||||||
|
|
||||||
# define erl parameters
|
# define erl parameters
|
||||||
ERLANG_OPTS="+K $POLL +P $ERL_PROCESSES $ERL_OPTIONS"
|
ERLANG_OPTS="+K $POLL +P $ERL_PROCESSES $ERL_OPTIONS"
|
||||||
if [ -n "$FIREWALL_WINDOW" ] ; then
|
if [ -n "$FIREWALL_WINDOW" ] ; then
|
||||||
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_listen_min ${FIREWALL_WINDOW%-*} inet_dist_listen_max ${FIREWALL_WINDOW#*-}"
|
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_listen_min ${FIREWALL_WINDOW%-*} inet_dist_listen_max ${FIREWALL_WINDOW#*-}"
|
||||||
fi
|
fi
|
||||||
if [ -n "$INET_DIST_INTERFACE" ] ; then
|
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 [ -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"
|
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_use_interface $INET_DIST_INTERFACE2"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
@ -90,11 +97,12 @@ ERL_CRASH_DUMP="$LOGS_DIR"/erl_crash_$(date "+%Y%m%d-%H%M%S").dump
|
||||||
ERL_INETRC="$CONFIG_DIR"/inetrc
|
ERL_INETRC="$CONFIG_DIR"/inetrc
|
||||||
|
|
||||||
# define ejabberd parameters
|
# 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_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_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_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"
|
[ -n "$EJABBERD_OPTS" ] && EJABBERD_OPTS="-ejabberd $EJABBERD_OPTS"
|
||||||
EJABBERD_OPTS="-mnesia dir \"$SPOOL_DIR\" $MNESIA_OPTIONS $EJABBERD_OPTS -s ejabberd"
|
EJABBERD_OPTS="-mnesia dir \"$SPOOL_DIR\" $MNESIA_OPTIONS $EJABBERD_OPTS -s ejabberd"
|
||||||
|
|
||||||
|
@ -129,8 +137,8 @@ run_cmd()
|
||||||
exec_cmd()
|
exec_cmd()
|
||||||
{
|
{
|
||||||
case $EXEC_CMD in
|
case $EXEC_CMD in
|
||||||
as_install_user) su -s /bin/sh -c '"$0" "$@"' "$INSTALLUSER" -- "$@" ;;
|
|
||||||
as_current_user) exec "$@" ;;
|
as_current_user) exec "$@" ;;
|
||||||
|
as_install_user) su -s /bin/sh -c 'exec "$0" "$@"' "$INSTALLUSER" -- "$@" ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
run_erl()
|
run_erl()
|
||||||
|
@ -162,9 +170,11 @@ debugwarning()
|
||||||
echo "Please be extremely cautious with your actions,"
|
echo "Please be extremely cautious with your actions,"
|
||||||
echo "and exit immediately if you are not completely sure."
|
echo "and exit immediately if you are not completely sure."
|
||||||
echo ""
|
echo ""
|
||||||
echo "To detach this shell from ejabberd, press:"
|
echo "To exit and detach this shell from ejabberd, press:"
|
||||||
echo " control+c, control+c"
|
echo " control+g and then q"
|
||||||
echo ""
|
echo ""
|
||||||
|
#vt100 echo "Please do NOT use control+c in this debug shell !"
|
||||||
|
#vt100 echo ""
|
||||||
echo "--------------------------------------------------------------------"
|
echo "--------------------------------------------------------------------"
|
||||||
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
||||||
echo " EJABBERD_BYPASS_WARNINGS=true"
|
echo " EJABBERD_BYPASS_WARNINGS=true"
|
||||||
|
@ -185,8 +195,10 @@ livewarning()
|
||||||
echo "Please be extremely cautious with your actions,"
|
echo "Please be extremely cautious with your actions,"
|
||||||
echo "and exit immediately if you are not completely sure."
|
echo "and exit immediately if you are not completely sure."
|
||||||
echo ""
|
echo ""
|
||||||
echo "To exit this LIVE mode and stop ejabberd, press:"
|
echo "To stop ejabberd gracefully:"
|
||||||
echo " q(). and press the Enter key"
|
echo " ejabberd:stop()."
|
||||||
|
echo "To quit erlang immediately, press:"
|
||||||
|
echo " control+g and then q"
|
||||||
echo ""
|
echo ""
|
||||||
echo "--------------------------------------------------------------------"
|
echo "--------------------------------------------------------------------"
|
||||||
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
||||||
|
@ -197,6 +209,39 @@ livewarning()
|
||||||
fi
|
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()
|
help()
|
||||||
{
|
{
|
||||||
echo ""
|
echo ""
|
||||||
|
@ -225,16 +270,34 @@ help()
|
||||||
}
|
}
|
||||||
|
|
||||||
# dynamic node name helper
|
# dynamic node name helper
|
||||||
uid()
|
uid() {
|
||||||
{
|
ERTSVERSION="$("$ERL" -version 2>&1 | sed 's|.* \([0-9]*[0-9]\).*|\1|g')"
|
||||||
uuid=$(uuidgen 2>/dev/null)
|
if [ $ERTSVERSION -lt 11 ] ; then # otp 23.0 includes erts 11.0
|
||||||
random=$(awk 'BEGIN { srand(); print int(rand()*32768) }' /dev/null)
|
# Erlang/OTP lower than 23, which doesn's support dynamic node code
|
||||||
[ -z "$uuid" ] && [ -f /proc/sys/kernel/random/uuid ] && uuid=$(cat /proc/sys/kernel/random/uuid)
|
N=1
|
||||||
[ -z "$uuid" ] && uuid=$(printf "%X" "${random:-$$}$(date +%M%S)")
|
PF=$(( $$ % 97 ))
|
||||||
uuid=$(printf '%s' $uuid | sed 's/^\(...\).*$/\1/')
|
while
|
||||||
[ $# -eq 0 ] && echo "${uuid}-${ERLANG_NODE}"
|
case $# in
|
||||||
[ $# -eq 1 ] && echo "${uuid}-${1}-${ERLANG_NODE}"
|
0) NN="${PF}-${N}-${ERLANG_NODE}"
|
||||||
[ $# -eq 2 ] && echo "${uuid}-${1}@${2}"
|
;;
|
||||||
|
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
|
||||||
|
if [ "$ERLANG_NODE" != "${ERLANG_NODE%.*}" ]; then
|
||||||
|
echo "undefined@${ERLANG_NODE#*@}"
|
||||||
|
else
|
||||||
|
echo "undefined"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# stop epmd if there is no other running node
|
# stop epmd if there is no other running node
|
||||||
|
@ -248,6 +311,8 @@ stop_epmd()
|
||||||
# if all ok, ensure runtime directory exists and make it current directory
|
# if all ok, ensure runtime directory exists and make it current directory
|
||||||
check_start()
|
check_start()
|
||||||
{
|
{
|
||||||
|
ECSIMAGE_DBPATH=$HOME/database/$ERLANG_NODE
|
||||||
|
[ ! -d "$ECSIMAGE_DBPATH" ] && ln -s $HOME/database $HOME/database/$ERLANG_NODE
|
||||||
[ -n "$ERL_DIST_PORT" ] && return
|
[ -n "$ERL_DIST_PORT" ] && return
|
||||||
"$EPMD" -names 2>/dev/null | grep -q " ${ERLANG_NODE%@*} " && {
|
"$EPMD" -names 2>/dev/null | grep -q " ${ERLANG_NODE%@*} " && {
|
||||||
pgrep -f "$ERLANG_NODE" >/dev/null && {
|
pgrep -f "$ERLANG_NODE" >/dev/null && {
|
||||||
|
@ -281,14 +346,32 @@ post_waiter_loop()
|
||||||
LIST=$@
|
LIST=$@
|
||||||
HEAD=${LIST%% ; *}
|
HEAD=${LIST%% ; *}
|
||||||
TAIL=${LIST#* ; }
|
TAIL=${LIST#* ; }
|
||||||
echo ":> ejabberdctl $HEAD"
|
HEAD2=${HEAD#\! *}
|
||||||
$0 $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
|
[ "$HEAD" = "$TAIL" ] || post_waiter_loop $TAIL
|
||||||
}
|
}
|
||||||
|
|
||||||
# allow sync calls
|
# allow sync calls
|
||||||
wait_status()
|
wait_status()
|
||||||
{
|
{
|
||||||
|
wait_status_node "$ERLANG_NODE" $1 $2 $3
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_status_node()
|
||||||
|
{
|
||||||
|
CONNECT_NODE=$1
|
||||||
|
shift
|
||||||
# args: status try delay
|
# args: status try delay
|
||||||
# return: 0 OK, 1 KO
|
# return: 0 OK, 1 KO
|
||||||
timeout="$2"
|
timeout="$2"
|
||||||
|
@ -299,14 +382,71 @@ wait_status()
|
||||||
if [ $timeout -eq 0 ] ; then
|
if [ $timeout -eq 0 ] ; then
|
||||||
status="$1"
|
status="$1"
|
||||||
else
|
else
|
||||||
run_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \
|
run_erl "$(uid ctl)" -hidden -noinput \
|
||||||
-extra "$ERLANG_NODE" $NO_TIMEOUT status > /dev/null
|
-eval 'net_kernel:connect_node('"'$CONNECT_NODE'"')' \
|
||||||
|
-s ejabberd_ctl \
|
||||||
|
-extra "$CONNECT_NODE" $NO_TIMEOUT status > /dev/null
|
||||||
status="$?"
|
status="$?"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
[ $timeout -gt 0 ]
|
[ $timeout -gt 0 ]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
exec_other_command()
|
||||||
|
{
|
||||||
|
exec_other_command_node $ERLANG_NODE "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
exec_other_command_node()
|
||||||
|
{
|
||||||
|
CONNECT_NODE=$1
|
||||||
|
shift
|
||||||
|
if [ -z "$CTL_OVER_HTTP" ] || [ ! -S "$CTL_OVER_HTTP" ] \
|
||||||
|
|| [ ! -x "$(command -v curl)" ] || [ -z "$1" ] || [ "$1" = "help" ] \
|
||||||
|
|| [ "$1" = "mnesia_info_ctl" ]|| [ "$1" = "print_sql_schema" ] ; then
|
||||||
|
run_erl "$(uid ctl)" -hidden -noinput \
|
||||||
|
-eval 'net_kernel:connect_node('"'$CONNECT_NODE'"')' \
|
||||||
|
-s ejabberd_ctl \
|
||||||
|
-extra "$CONNECT_NODE" $NO_TIMEOUT "$@"
|
||||||
|
result=$?
|
||||||
|
case $result in
|
||||||
|
3) help;;
|
||||||
|
*) :;;
|
||||||
|
esac
|
||||||
|
return $result
|
||||||
|
else
|
||||||
|
exec_ctl_over_http_socket "$@"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
exec_ctl_over_http_socket()
|
||||||
|
{
|
||||||
|
COMMAND=${1}
|
||||||
|
CARGS=""
|
||||||
|
while [ $# -gt 0 ]; do
|
||||||
|
[ -z "$CARGS" ] && CARGS="[" || CARGS="${CARGS}, "
|
||||||
|
CARGS="${CARGS}\"$1\""
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
CARGS="${CARGS}]"
|
||||||
|
TEMPHEADERS=temp-headers.log
|
||||||
|
curl \
|
||||||
|
--unix-socket ${CTL_OVER_HTTP} \
|
||||||
|
--header "Content-Type: application/json" \
|
||||||
|
--header "Accept: application/json" \
|
||||||
|
--data "${CARGS}" \
|
||||||
|
--dump-header ${TEMPHEADERS} \
|
||||||
|
--no-progress-meter \
|
||||||
|
"http://localhost/ctl/${COMMAND}"
|
||||||
|
result=$(sed -n 's/.*status-code: \([0-9]*\).*/\1/p' < $TEMPHEADERS)
|
||||||
|
rm ${TEMPHEADERS}
|
||||||
|
case $result in
|
||||||
|
2|3) exec_other_command help ${COMMAND};;
|
||||||
|
*) :;;
|
||||||
|
esac
|
||||||
|
exit $result
|
||||||
|
}
|
||||||
|
|
||||||
# ensure we can change current directory to SPOOL_DIR
|
# ensure we can change current directory to SPOOL_DIR
|
||||||
[ -f "$SPOOL_DIR/schema.DAT" ] || FIRST_RUN=true
|
[ -f "$SPOOL_DIR/schema.DAT" ] || FIRST_RUN=true
|
||||||
[ -d "$SPOOL_DIR" ] || run_cmd mkdir -p "$SPOOL_DIR"
|
[ -d "$SPOOL_DIR" ] || run_cmd mkdir -p "$SPOOL_DIR"
|
||||||
|
@ -315,6 +455,103 @@ cd "$SPOOL_DIR" || {
|
||||||
exit 6
|
exit 6
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printe()
|
||||||
|
{
|
||||||
|
printf "\n"
|
||||||
|
printf "\e[1;40;32m==> %s\e[0m\n" "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
## Function copied from tools/make-installers
|
||||||
|
user_agrees()
|
||||||
|
{
|
||||||
|
question="$*"
|
||||||
|
|
||||||
|
if [ -t 0 ]
|
||||||
|
then
|
||||||
|
printe "$question (y/n) [n]"
|
||||||
|
read -r response
|
||||||
|
case "$response" in
|
||||||
|
[Yy]|[Yy][Ee][Ss])
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
[Nn]|[Nn][Oo]|'')
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo 'Please respond with "yes" or "no".'
|
||||||
|
user_agrees "$question"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else # Assume 'yes' if not running interactively.
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
mnesia_change()
|
||||||
|
{
|
||||||
|
ERLANG_NODE_OLD="$1"
|
||||||
|
[ "$ERLANG_NODE_OLD" = "" ] \
|
||||||
|
&& echo "Error: Please provide the old erlang node name, for example:" \
|
||||||
|
&& echo " ejabberdctl mnesia_change ejabberd@oldmachine" \
|
||||||
|
&& exit 1
|
||||||
|
|
||||||
|
SPOOL_DIR_BACKUP=$SPOOL_DIR/$ERLANG_NODE_OLD-backup/
|
||||||
|
OLDFILE=$SPOOL_DIR_BACKUP/$ERLANG_NODE_OLD.backup
|
||||||
|
NEWFILE=$SPOOL_DIR_BACKUP/$ERLANG_NODE.backup
|
||||||
|
|
||||||
|
printe "This changes your mnesia database from node name '$ERLANG_NODE_OLD' to '$ERLANG_NODE'"
|
||||||
|
|
||||||
|
[ -d "$SPOOL_DIR_BACKUP" ] && printe "WARNING! A backup of old node already exists in $SPOOL_DIR_BACKUP"
|
||||||
|
|
||||||
|
if ! user_agrees "Do you want to proceed?"
|
||||||
|
then
|
||||||
|
echo 'Operation aborted.'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
printe "Starting ejabberd with old node name $ERLANG_NODE_OLD ..."
|
||||||
|
exec_erl "$ERLANG_NODE_OLD" $EJABBERD_OPTS -detached
|
||||||
|
wait_status_node $ERLANG_NODE_OLD 0 30 2
|
||||||
|
result=$?
|
||||||
|
case $result in
|
||||||
|
1) echo "There was a problem starting ejabberd with the old erlang node name. " \
|
||||||
|
&& echo "Check for log errors in $EJABBERD_LOG_PATH" \
|
||||||
|
&& exit $result;;
|
||||||
|
*) :;;
|
||||||
|
esac
|
||||||
|
exec_other_command_node $ERLANG_NODE_OLD "status"
|
||||||
|
|
||||||
|
printe "Making backup of old database to file $OLDFILE ..."
|
||||||
|
mkdir $SPOOL_DIR_BACKUP
|
||||||
|
exec_other_command_node $ERLANG_NODE_OLD backup "$OLDFILE"
|
||||||
|
|
||||||
|
printe "Changing node name in new backup file $NEWFILE ..."
|
||||||
|
exec_other_command_node $ERLANG_NODE_OLD mnesia_change_nodename "$ERLANG_NODE_OLD" "$ERLANG_NODE" "$OLDFILE" "$NEWFILE"
|
||||||
|
|
||||||
|
printe "Stopping old ejabberd..."
|
||||||
|
exec_other_command_node $ERLANG_NODE_OLD "stop"
|
||||||
|
wait_status_node $ERLANG_NODE_OLD 3 30 2 && stop_epmd
|
||||||
|
|
||||||
|
printe "Moving old mnesia spool files to backup subdirectory $SPOOL_DIR_BACKUP ..."
|
||||||
|
mv $SPOOL_DIR/*.DAT $SPOOL_DIR_BACKUP
|
||||||
|
mv $SPOOL_DIR/*.DCD $SPOOL_DIR_BACKUP
|
||||||
|
mv $SPOOL_DIR/*.LOG $SPOOL_DIR_BACKUP
|
||||||
|
|
||||||
|
printe "Starting ejabberd with new node name $ERLANG_NODE ..."
|
||||||
|
exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -detached
|
||||||
|
wait_status 0 30 2
|
||||||
|
exec_other_command "status"
|
||||||
|
|
||||||
|
printe "Installing fallback of new mnesia..."
|
||||||
|
exec_other_command install_fallback "$NEWFILE"
|
||||||
|
|
||||||
|
printe "Stopping new ejabberd..."
|
||||||
|
exec_other_command "stop"
|
||||||
|
wait_status 3 30 2 && stop_epmd
|
||||||
|
|
||||||
|
printe "Finished, now you can start ejabberd normally"
|
||||||
|
}
|
||||||
|
|
||||||
# main
|
# main
|
||||||
case $1 in
|
case $1 in
|
||||||
start)
|
start)
|
||||||
|
@ -342,24 +579,31 @@ case $1 in
|
||||||
;;
|
;;
|
||||||
etop)
|
etop)
|
||||||
set_dist_client
|
set_dist_client
|
||||||
exec_erl "$(uid top)" -hidden -node "$ERLANG_NODE" -s etop \
|
exec_erl "$(uid top)" -hidden -remsh "$ERLANG_NODE" \
|
||||||
-s erlang halt -output text
|
-eval 'net_kernel:connect_node('"'$ERLANG_NODE'"')' \
|
||||||
|
-s etop \
|
||||||
|
-output text
|
||||||
|
check_etop_result
|
||||||
;;
|
;;
|
||||||
iexdebug)
|
iexdebug)
|
||||||
debugwarning
|
debugwarning
|
||||||
set_dist_client
|
set_dist_client
|
||||||
exec_iex "$(uid debug)" --remsh "$ERLANG_NODE"
|
exec_iex "$(uid debug)" --remsh "$ERLANG_NODE"
|
||||||
|
check_iex_result
|
||||||
;;
|
;;
|
||||||
iexlive)
|
iexlive)
|
||||||
livewarning
|
livewarning
|
||||||
exec_iex "$ERLANG_NODE" --erl "$EJABBERD_OPTS" --app ejabberd
|
exec_iex "$ERLANG_NODE" --erl "$EJABBERD_OPTS"
|
||||||
|
check_iex_result
|
||||||
;;
|
;;
|
||||||
ping)
|
ping)
|
||||||
PEER=${2:-$ERLANG_NODE}
|
PEER=${2:-$ERLANG_NODE}
|
||||||
[ "$PEER" = "${PEER%.*}" ] && PS="-s"
|
[ "$PEER" = "${PEER%.*}" ] && PS="-s"
|
||||||
set_dist_client
|
set_dist_client
|
||||||
exec_cmd "$ERL" ${PS:--}name "$(uid ping "$(hostname $PS)")" $ERLANG_OPTS \
|
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
|
-s erlang halt -output text
|
||||||
;;
|
;;
|
||||||
started)
|
started)
|
||||||
|
@ -370,18 +614,14 @@ case $1 in
|
||||||
set_dist_client
|
set_dist_client
|
||||||
wait_status 3 30 2 && stop_epmd # wait 30x2s before timeout
|
wait_status 3 30 2 && stop_epmd # wait 30x2s before timeout
|
||||||
;;
|
;;
|
||||||
|
mnesia_change)
|
||||||
|
mnesia_change $2
|
||||||
|
;;
|
||||||
post_waiter)
|
post_waiter)
|
||||||
post_waiter_waiting
|
post_waiter_waiting
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
set_dist_client
|
set_dist_client
|
||||||
run_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \
|
exec_other_command "$@"
|
||||||
-extra "$ERLANG_NODE" $NO_TIMEOUT "$@"
|
|
||||||
result=$?
|
|
||||||
case $result in
|
|
||||||
2|3) help;;
|
|
||||||
*) :;;
|
|
||||||
esac
|
|
||||||
exit $result
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
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 '{}' ';'
|
|
158
.github/workflows/ci.yml
vendored
158
.github/workflows/ci.yml
vendored
|
@ -25,20 +25,20 @@ jobs:
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
otp: ['20.0', '21.3', '24.3', '25']
|
otp: ['25', '26', '27', '28']
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
services:
|
services:
|
||||||
redis:
|
redis:
|
||||||
image: redis
|
image: public.ecr.aws/docker/library/redis
|
||||||
ports:
|
ports:
|
||||||
- 6379:6379
|
- 6379:6379
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Test shell scripts
|
- name: Test shell scripts
|
||||||
if: matrix.otp == 25
|
if: matrix.otp == '27'
|
||||||
run: |
|
run: |
|
||||||
shellcheck test/ejabberd_SUITE_data/gencerts.sh
|
shellcheck test/ejabberd_SUITE_data/gencerts.sh
|
||||||
shellcheck tools/captcha.sh
|
shellcheck tools/captcha.sh
|
||||||
|
@ -46,35 +46,38 @@ jobs:
|
||||||
shellcheck -x ejabberdctl.template
|
shellcheck -x ejabberdctl.template
|
||||||
|
|
||||||
- name: Get specific Erlang/OTP
|
- name: Get specific Erlang/OTP
|
||||||
if: matrix.otp != 25
|
|
||||||
uses: erlef/setup-beam@v1
|
uses: erlef/setup-beam@v1
|
||||||
with:
|
with:
|
||||||
otp-version: ${{ matrix.otp }}
|
otp-version: ${{ matrix.otp }}
|
||||||
|
|
||||||
- name: Get a compatible Rebar3
|
- name: Install MS SQL Server
|
||||||
if: matrix.otp <= '21.3'
|
|
||||||
run: |
|
run: |
|
||||||
rm rebar3
|
docker run -d -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=ejabberd_Test1" \
|
||||||
wget https://github.com/processone/ejabberd/raw/21.12/rebar3
|
-v $(pwd)/test/docker/db/mssql/initdb/initdb_mssql.sql:/initdb_mssql.sql:ro \
|
||||||
chmod +x rebar3
|
-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
|
- name: Prepare databases
|
||||||
run: |
|
run: |
|
||||||
|
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -i /initdb_mssql.sql
|
||||||
|
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -d ejabberd_test -i /mssql.sql
|
||||||
sudo systemctl start mysql.service
|
sudo systemctl start mysql.service
|
||||||
sudo systemctl start postgresql.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'
|
mysql -u root -proot -e "CREATE USER 'ejabberd_test'@'localhost'
|
||||||
IDENTIFIED BY 'ejabberd_test';"
|
IDENTIFIED BY 'ejabberd_test';"
|
||||||
mysql -u root -proot -e "CREATE DATABASE ejabberd_test;"
|
|
||||||
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
|
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
|
||||||
TO 'ejabberd_test'@'localhost';"
|
TO 'ejabberd_test'@'localhost';"
|
||||||
mysql -u root -proot ejabberd_test < sql/mysql.sql
|
|
||||||
pg_isready
|
pg_isready
|
||||||
|
sudo -u postgres psql -c "CREATE DATABASE ejabberd_test;"
|
||||||
sudo -u postgres psql -c "CREATE USER ejabberd_test
|
sudo -u postgres psql -c "CREATE USER ejabberd_test
|
||||||
WITH PASSWORD '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
|
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
|
||||||
ON DATABASE ejabberd_test TO ejabberd_test;"
|
ON DATABASE ejabberd_test TO ejabberd_test;"
|
||||||
|
sudo -u postgres psql -c "GRANT ALL ON SCHEMA public TO ejabberd_test;"
|
||||||
|
sudo -u postgres psql -c "ALTER DATABASE ejabberd_test OWNER TO ejabberd_test;"
|
||||||
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
|
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
|
||||||
TABLES IN SCHEMA public
|
TABLES IN SCHEMA public
|
||||||
TO ejabberd_test;"
|
TO ejabberd_test;"
|
||||||
|
@ -89,39 +92,16 @@ jobs:
|
||||||
sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
||||||
libsqlite3-dev libwebp-dev libyaml-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
|
- name: Remove syntax_tools from release
|
||||||
run: sed -i 's|, syntax_tools||g' src/ejabberd.app.src.script
|
run: sed -i 's|, syntax_tools||g' src/ejabberd.app.src.script
|
||||||
|
|
||||||
- name: Cache rebar
|
- name: Cache Hex.pm
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
~/.cache/rebar3/
|
~/.cache/rebar3/
|
||||||
key: ${{matrix.otp}}-${{hashFiles('rebar.config')}}
|
key: ${{matrix.otp}}-${{hashFiles('rebar.config')}}
|
||||||
|
|
||||||
- name: Download test logs
|
|
||||||
if: matrix.otp == 25 && github.repository == 'processone/ejabberd'
|
|
||||||
continue-on-error: true
|
|
||||||
run: |
|
|
||||||
mkdir -p _build/test
|
|
||||||
curl -sSL https://github.com/processone/ecil/tarball/gh-pages |
|
|
||||||
tar -C _build/test --strip-components=1 --wildcards -xzf -
|
|
||||||
rm -rf _build/test/logs/last/
|
|
||||||
|
|
||||||
- name: Compile
|
- name: Compile
|
||||||
run: |
|
run: |
|
||||||
./autogen.sh
|
./autogen.sh
|
||||||
|
@ -131,7 +111,6 @@ jobs:
|
||||||
--disable-elixir \
|
--disable-elixir \
|
||||||
--disable-mssql \
|
--disable-mssql \
|
||||||
--disable-odbc
|
--disable-odbc
|
||||||
make update
|
|
||||||
make
|
make
|
||||||
|
|
||||||
- run: make install -s
|
- run: make install -s
|
||||||
|
@ -139,6 +118,9 @@ jobs:
|
||||||
- run: make options
|
- run: make options
|
||||||
- run: make xref
|
- run: make xref
|
||||||
- run: make dialyzer
|
- run: make dialyzer
|
||||||
|
- run: make test-eunit
|
||||||
|
- run: make elvis
|
||||||
|
if: matrix.otp >= '26'
|
||||||
|
|
||||||
- name: Check Production Release
|
- name: Check Production Release
|
||||||
run: |
|
run: |
|
||||||
|
@ -151,12 +133,30 @@ jobs:
|
||||||
cat $RE/logs/ejabberd.log
|
cat $RE/logs/ejabberd.log
|
||||||
grep -q "is stopped in" $RE/logs/ejabberd.log
|
grep -q "is stopped in" $RE/logs/ejabberd.log
|
||||||
|
|
||||||
- name: Check Development Release
|
- name: Start Development Release
|
||||||
run: |
|
run: |
|
||||||
make dev
|
make dev
|
||||||
RE=_build/dev/rel/ejabberd
|
RE=_build/dev/rel/ejabberd
|
||||||
|
sed -i 's/starttls_required: true/starttls_required: false/g' $RE/conf/ejabberd.yml
|
||||||
$RE/bin/ejabberdctl start
|
$RE/bin/ejabberdctl start
|
||||||
$RE/bin/ejabberdctl started
|
$RE/bin/ejabberdctl started
|
||||||
|
$RE/bin/ejabberdctl register admin localhost admin
|
||||||
|
grep -q "is started in" $RE/logs/ejabberd.log
|
||||||
|
|
||||||
|
- name: Run XMPP Interoperability Tests against CI server.
|
||||||
|
if: matrix.otp == '27'
|
||||||
|
continue-on-error: true
|
||||||
|
uses: XMPP-Interop-Testing/xmpp-interop-tests-action@v1.6.1
|
||||||
|
with:
|
||||||
|
domain: 'localhost'
|
||||||
|
adminAccountUsername: 'admin'
|
||||||
|
adminAccountPassword: 'admin'
|
||||||
|
disabledSpecifications: RFC6121,XEP-0030,XEP-0045,XEP-0054,XEP-0060,XEP-0080,XEP-0115,XEP-0118,XEP-0215,XEP-0347,XEP-0363,XEP-0384
|
||||||
|
|
||||||
|
- name: Stop Development Release
|
||||||
|
if: always()
|
||||||
|
run: |
|
||||||
|
RE=_build/dev/rel/ejabberd
|
||||||
$RE/bin/ejabberdctl stop
|
$RE/bin/ejabberdctl stop
|
||||||
$RE/bin/ejabberdctl stopped
|
$RE/bin/ejabberdctl stopped
|
||||||
cat $RE/logs/ejabberd.log
|
cat $RE/logs/ejabberd.log
|
||||||
|
@ -166,6 +166,7 @@ jobs:
|
||||||
id: ct
|
id: ct
|
||||||
run: |
|
run: |
|
||||||
(cd priv && ln -sf ../sql)
|
(cd priv && ln -sf ../sql)
|
||||||
|
sed -i -e 's/ct:pal/ct:log/' test/suite.erl
|
||||||
COMMIT=`echo $GITHUB_SHA | cut -c 1-7`
|
COMMIT=`echo $GITHUB_SHA | cut -c 1-7`
|
||||||
DATE=`date +%s`
|
DATE=`date +%s`
|
||||||
REF_NAME=`echo $GITHUB_REF_NAME | tr "/" "_"`
|
REF_NAME=`echo $GITHUB_REF_NAME | tr "/" "_"`
|
||||||
|
@ -175,7 +176,7 @@ jobs:
|
||||||
./rebar3 cover
|
./rebar3 cover
|
||||||
|
|
||||||
- name: Check results
|
- name: Check results
|
||||||
if: always() && (steps.ct.outcome != 'skipped' || steps.ct2.outcome != 'skipped')
|
if: always() && (steps.ct.outcome != 'skipped')
|
||||||
id: ctresults
|
id: ctresults
|
||||||
run: |
|
run: |
|
||||||
[[ -d _build ]] && ln -s _build/test/logs/last/ logs || true
|
[[ -d _build ]] && ln -s _build/test/logs/last/ logs || true
|
||||||
|
@ -193,7 +194,7 @@ jobs:
|
||||||
find logs/ -name exunit.log -exec cat '{}' ';'
|
find logs/ -name exunit.log -exec cat '{}' ';'
|
||||||
|
|
||||||
- name: Send to coveralls
|
- name: Send to coveralls
|
||||||
if: matrix.otp == 25
|
if: matrix.otp == '27'
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: |
|
run: |
|
||||||
|
@ -205,36 +206,60 @@ jobs:
|
||||||
"payload":{"build_num":$GITHUB_RUN_ID,
|
"payload":{"build_num":$GITHUB_RUN_ID,
|
||||||
"status":"done"}}'
|
"status":"done"}}'
|
||||||
|
|
||||||
- name: Upload test logs
|
- name: Check for changes to trigger schema upgrade test
|
||||||
if: always() && steps.ct.outcome == 'failure' && github.repository == 'processone/ejabberd'
|
uses: dorny/paths-filter@v3
|
||||||
uses: peaceiris/actions-gh-pages@v3
|
id: filter
|
||||||
with:
|
with:
|
||||||
publish_dir: _build/test
|
filters: |
|
||||||
exclude_assets: '.github,lib,plugins'
|
sql:
|
||||||
external_repository: processone/ecil
|
- 'sql/**'
|
||||||
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
|
- 'src/mod_admin_update_sql.erl'
|
||||||
keep_files: true
|
|
||||||
|
|
||||||
- name: View ECIL address
|
- name: Prepare for schema upgrade test
|
||||||
if: always() && steps.ct.outcome == 'failure' && github.repository == 'processone/ejabberd'
|
id: prepupgradetest
|
||||||
|
if: ${{ steps.filter.outputs.sql == 'true' }}
|
||||||
run: |
|
run: |
|
||||||
CTRUN=`ls -la _build/test/logs/last | sed 's|.*-> ||'`
|
[[ -d logs ]] && rm -rf logs
|
||||||
echo "::notice::View CT results: https://processone.github.io/ecil/logs/$CTRUN/"
|
[[ -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
|
- name: Prepare new schema
|
||||||
run: |
|
run: |
|
||||||
[[ -d logs ]] && rm -rf logs
|
[[ -d logs ]] && rm -rf logs
|
||||||
[[ -d _build/test/logs ]] && rm -rf _build/test/logs || true
|
[[ -d _build/test/logs ]] && rm -rf _build/test/logs || true
|
||||||
|
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -Q "drop database [ejabberd_test];"
|
||||||
|
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -Q "drop login [ejabberd_test];"
|
||||||
mysql -u root -proot -e "DROP DATABASE ejabberd_test;"
|
mysql -u root -proot -e "DROP DATABASE ejabberd_test;"
|
||||||
sudo -u postgres psql -c "DROP DATABASE ejabberd_test;"
|
sudo -u postgres psql -c "DROP DATABASE ejabberd_test;"
|
||||||
|
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -U SA -P ejabberd_Test1 -S localhost -i /initdb_mssql.sql
|
||||||
|
docker exec ejabberd-mssql /opt/mssql-tools18/bin/sqlcmd -C -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 "CREATE DATABASE ejabberd_test;"
|
||||||
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
|
mysql -u root -proot -e "GRANT ALL ON ejabberd_test.*
|
||||||
TO 'ejabberd_test'@'localhost';"
|
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 -c "CREATE DATABASE ejabberd_test;"
|
||||||
sudo -u postgres psql ejabberd_test -f sql/pg.new.sql
|
|
||||||
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
|
sudo -u postgres psql -c "GRANT ALL PRIVILEGES
|
||||||
ON DATABASE ejabberd_test TO ejabberd_test;"
|
ON DATABASE ejabberd_test TO ejabberd_test;"
|
||||||
|
sudo -u postgres psql -c "GRANT ALL ON SCHEMA public TO ejabberd_test;"
|
||||||
|
sudo -u postgres psql -c "ALTER DATABASE ejabberd_test OWNER TO ejabberd_test;"
|
||||||
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
|
sudo -u postgres psql ejabberd_test -c "GRANT ALL PRIVILEGES ON ALL
|
||||||
TABLES IN SCHEMA public
|
TABLES IN SCHEMA public
|
||||||
TO ejabberd_test;"
|
TO ejabberd_test;"
|
||||||
|
@ -242,7 +267,8 @@ jobs:
|
||||||
SEQUENCES IN SCHEMA public
|
SEQUENCES IN SCHEMA public
|
||||||
TO ejabberd_test;"
|
TO ejabberd_test;"
|
||||||
sed -i 's|new_schema, false|new_schema, true|g' test/suite.erl
|
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
|
id: ctnewschema
|
||||||
- name: Check results
|
- name: Check results
|
||||||
if: always() && steps.ctnewschema.outcome != 'skipped'
|
if: always() && steps.ctnewschema.outcome != 'skipped'
|
||||||
|
@ -259,3 +285,17 @@ jobs:
|
||||||
'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
|
'BEGIN{RS="\n=case";FS="\n"} /=result\s*failed/ {print "=case" $0}'
|
||||||
find logs/ -name error.log -exec cat '{}' ';'
|
find logs/ -name error.log -exec cat '{}' ';'
|
||||||
find logs/ -name exunit.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
|
||||||
|
|
19
.github/workflows/container.yml
vendored
19
.github/workflows/container.yml
vendored
|
@ -17,24 +17,23 @@ env:
|
||||||
jobs:
|
jobs:
|
||||||
container:
|
container:
|
||||||
name: Container
|
name: Container
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
permissions:
|
permissions:
|
||||||
packages: write
|
packages: write
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Checkout ejabberd-contrib
|
- name: Checkout ejabberd-contrib
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
repository: processone/ejabberd-contrib
|
repository: processone/ejabberd-contrib
|
||||||
path: .ejabberd-modules/sources/ejabberd-contrib
|
path: .ejabberd-modules/sources/ejabberd-contrib
|
||||||
|
|
||||||
- name: Log in to the Container registry
|
- name: Log in to the Container registry
|
||||||
uses: docker/login-action@v1.14.1
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: ${{ env.REGISTRY }}
|
registry: ${{ env.REGISTRY }}
|
||||||
username: ${{ github.actor }}
|
username: ${{ github.actor }}
|
||||||
|
@ -42,11 +41,11 @@ jobs:
|
||||||
|
|
||||||
- name: Get git describe
|
- name: Get git describe
|
||||||
id: gitdescribe
|
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
|
- name: Extract metadata (tags, labels) for Docker
|
||||||
id: meta
|
id: meta
|
||||||
uses: docker/metadata-action@v3.8.0
|
uses: docker/metadata-action@v5
|
||||||
with:
|
with:
|
||||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||||
labels: |
|
labels: |
|
||||||
|
@ -55,13 +54,13 @@ jobs:
|
||||||
org.opencontainers.image.vendor=ProcessOne
|
org.opencontainers.image.vendor=ProcessOne
|
||||||
|
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v1
|
uses: docker/setup-qemu-action@v3
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v1
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
- name: Build and push Docker image
|
- name: Build and push Docker image
|
||||||
uses: docker/build-push-action@v2.10.0
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
build-args: |
|
build-args: |
|
||||||
VERSION=${{ steps.gitdescribe.outputs.ver }}
|
VERSION=${{ steps.gitdescribe.outputs.ver }}
|
||||||
|
|
18
.github/workflows/installers.yml
vendored
18
.github/workflows/installers.yml
vendored
|
@ -21,13 +21,13 @@ on:
|
||||||
jobs:
|
jobs:
|
||||||
binaries:
|
binaries:
|
||||||
name: Binaries
|
name: Binaries
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- name: Cache build directory
|
- name: Cache build directory
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: ~/build/
|
path: ~/build/
|
||||||
key: ${{runner.os}}-ct-ng-1.25.0
|
key: ${{runner.os}}-ct-ng-1.27.0
|
||||||
- name: Install prerequisites
|
- name: Install prerequisites
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get -qq update
|
sudo apt-get -qq update
|
||||||
|
@ -39,9 +39,9 @@ jobs:
|
||||||
- name: Install FPM
|
- name: Install FPM
|
||||||
run: |
|
run: |
|
||||||
gem install --no-document --user-install fpm
|
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
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Build binary archives
|
- name: Build binary archives
|
||||||
|
@ -55,7 +55,7 @@ jobs:
|
||||||
mkdir ejabberd-packages
|
mkdir ejabberd-packages
|
||||||
mv ejabberd_*.deb ejabberd-*.rpm ejabberd-*.run ejabberd-packages
|
mv ejabberd_*.deb ejabberd-*.rpm ejabberd-*.run ejabberd-packages
|
||||||
- name: Upload packages
|
- name: Upload packages
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: ejabberd-packages
|
name: ejabberd-packages
|
||||||
#
|
#
|
||||||
|
@ -70,15 +70,15 @@ jobs:
|
||||||
release:
|
release:
|
||||||
name: Release
|
name: Release
|
||||||
needs: [binaries]
|
needs: [binaries]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-22.04
|
||||||
if: github.ref_type == 'tag'
|
if: github.ref_type == 'tag'
|
||||||
steps:
|
steps:
|
||||||
- name: Download packages
|
- name: Download packages
|
||||||
uses: actions/download-artifact@v3
|
uses: actions/download-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: ejabberd-packages
|
name: ejabberd-packages
|
||||||
- name: Draft Release
|
- name: Draft Release
|
||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v2
|
||||||
with:
|
with:
|
||||||
draft: true
|
draft: true
|
||||||
files: ejabberd-packages/*
|
files: ejabberd-packages/*
|
||||||
|
|
364
.github/workflows/runtime.yml
vendored
364
.github/workflows/runtime.yml
vendored
|
@ -31,132 +31,197 @@ jobs:
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
otp: ['19.3', '20.3', '24.3', '25']
|
otp: ['24', '25', '26', '27', '28']
|
||||||
rebar: ['rebar', 'rebar3']
|
rebar: ['rebar', 'rebar3']
|
||||||
runs-on: ubuntu-latest
|
exclude:
|
||||||
|
- otp: '24'
|
||||||
|
rebar: 'rebar'
|
||||||
|
- otp: '27'
|
||||||
|
rebar: 'rebar'
|
||||||
|
- otp: '28'
|
||||||
|
rebar: 'rebar'
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
container:
|
container:
|
||||||
image: erlang:${{ matrix.otp }}
|
image: public.ecr.aws/docker/library/erlang:${{ matrix.otp }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v5
|
||||||
|
|
||||||
|
- name: Get old 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: Get recent compatible Rebar binaries
|
||||||
|
if: matrix.otp > 23 && matrix.otp < 25
|
||||||
|
run: |
|
||||||
|
rm rebar
|
||||||
|
rm rebar3
|
||||||
|
wget https://github.com/processone/ejabberd/raw/24.12/rebar
|
||||||
|
wget https://github.com/processone/ejabberd/raw/24.12/rebar3
|
||||||
|
chmod +x rebar
|
||||||
|
chmod +x rebar3
|
||||||
|
|
||||||
- name: Prepare libraries
|
- name: Prepare libraries
|
||||||
run: |
|
run: |
|
||||||
apt-get -qq update
|
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 \
|
apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
||||||
libsqlite3-dev libwebp-dev libyaml-dev
|
libsqlite3-dev libwebp-dev libyaml-dev
|
||||||
|
|
||||||
|
- name: Cache Hex.pm
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.cache/rebar3/
|
||||||
|
key: ${{matrix.otp}}-${{hashFiles('rebar.config')}}
|
||||||
|
|
||||||
|
- name: Unlock eredis dependency
|
||||||
|
if: matrix.rebar == 'rebar3' && matrix.otp < 21
|
||||||
|
run: rebar3 unlock eredis
|
||||||
|
|
||||||
- name: Compile
|
- name: Compile
|
||||||
run: |
|
run: |
|
||||||
./autogen.sh
|
./autogen.sh
|
||||||
./configure --with-rebar=`which ${{ matrix.rebar }}` \
|
./configure --with-rebar=./${{ matrix.rebar }} \
|
||||||
--prefix=/tmp/ejabberd \
|
--prefix=/tmp/ejabberd \
|
||||||
|
--with-min-erlang=9.0.5 \
|
||||||
--enable-all \
|
--enable-all \
|
||||||
--disable-elixir \
|
--disable-elixir \
|
||||||
|
--disable-tools \
|
||||||
--disable-odbc
|
--disable-odbc
|
||||||
make update
|
|
||||||
make
|
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
|
- run: make xref
|
||||||
|
|
||||||
- name: Test rel (rebar2)
|
- run: make dialyzer
|
||||||
|
|
||||||
|
- name: Prepare rel (rebar2)
|
||||||
if: matrix.rebar == 'rebar'
|
if: matrix.rebar == 'rebar'
|
||||||
run: |
|
run: |
|
||||||
make rel
|
mkdir -p _build/prod && ln -s `pwd`/rel/ _build/prod/rel
|
||||||
rel/ejabberd/bin/ejabberdctl start \
|
mkdir -p _build/dev && ln -s `pwd`/rel/ _build/dev/rel
|
||||||
&& rel/ejabberd/bin/ejabberdctl started
|
|
||||||
rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
|
|
||||||
rel/ejabberd/bin/ejabberdctl registered_users localhost
|
|
||||||
cat rel/ejabberd/logs/*
|
|
||||||
|
|
||||||
- name: Test rel
|
- name: Run rel
|
||||||
if: matrix.rebar != 'rebar'
|
|
||||||
run: |
|
run: |
|
||||||
make rel
|
make rel
|
||||||
_build/prod/rel/ejabberd/bin/ejabberdctl start \
|
_build/prod/rel/ejabberd/bin/ejabberdctl start \
|
||||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl started
|
&& _build/prod/rel/ejabberd/bin/ejabberdctl started
|
||||||
_build/prod/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
|
_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 stop \
|
||||||
&& _build/prod/rel/ejabberd/bin/ejabberdctl stopped
|
&& _build/prod/rel/ejabberd/bin/ejabberdctl stopped
|
||||||
cat _build/prod/rel/ejabberd/logs/*
|
|
||||||
|
|
||||||
- name: Test dev
|
- name: Run dev
|
||||||
if: matrix.rebar != 'rebar'
|
|
||||||
run: |
|
run: |
|
||||||
make dev
|
make dev
|
||||||
_build/dev/rel/ejabberd/bin/ejabberdctl start \
|
_build/dev/rel/ejabberd/bin/ejabberdctl start \
|
||||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl started
|
&& _build/dev/rel/ejabberd/bin/ejabberdctl started
|
||||||
_build/dev/rel/ejabberd/bin/ejabberdctl register user1 localhost s0mePass
|
_build/dev/rel/ejabberd/bin/ejabberdctl register user2 localhost s0mePass
|
||||||
_build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost
|
_build/dev/rel/ejabberd/bin/ejabberdctl registered_users localhost >> registered.log
|
||||||
_build/dev/rel/ejabberd/bin/ejabberdctl stop \
|
_build/dev/rel/ejabberd/bin/ejabberdctl stop \
|
||||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl stopped
|
&& _build/dev/rel/ejabberd/bin/ejabberdctl stopped
|
||||||
cat _build/dev/rel/ejabberd/logs/*
|
|
||||||
|
|
||||||
mix:
|
- name: Run install
|
||||||
name: Mix
|
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:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
otp: ['21.3', '22.0', '25.0']
|
elixir: ['1.14', '1.15', '1.16', '1.17', '1.18']
|
||||||
elixir: ['1.10.3', '1.11.4', '1.12.3', '1.13.0']
|
runs-on: ubuntu-24.04
|
||||||
exclude:
|
container:
|
||||||
- otp: '21.3'
|
image: public.ecr.aws/docker/library/elixir:${{ matrix.elixir }}
|
||||||
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
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Get specific Erlang/OTP
|
|
||||||
uses: erlef/setup-beam@v1
|
|
||||||
with:
|
|
||||||
otp-version: ${{matrix.otp}}
|
|
||||||
elixir-version: ${{matrix.elixir}}
|
|
||||||
|
|
||||||
- name: Prepare libraries
|
- name: Prepare libraries
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get -qq update
|
apt-get -qq update
|
||||||
sudo apt-get -y purge libgd3 nginx
|
apt-get -y purge libgd3 nginx
|
||||||
sudo apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
apt-get -qq install libexpat1-dev libgd-dev libpam0g-dev \
|
||||||
libsqlite3-dev libwebp-dev libyaml-dev
|
libsqlite3-dev libwebp-dev libyaml-dev
|
||||||
|
|
||||||
- name: Remove Elixir Matchers
|
- name: Enable Module.Example and an Elixir dependency
|
||||||
run: |
|
run: |
|
||||||
echo "::remove-matcher owner=elixir-mixCompileWarning::"
|
sed -i "s|^modules:|modules:\n 'Ejabberd.Module.Example': {}|g" ejabberd.yml.example
|
||||||
echo "::remove-matcher owner=elixir-credoOutputDefault::"
|
cat ejabberd.yml.example
|
||||||
echo "::remove-matcher owner=elixir-mixCompileError::"
|
sed -i 's|^{deps, \[\(.*\)|{deps, [{decimal, ".*", {git, "https://github.com/ericmj/decimal", {branch, "main"}}},\n \1|g' rebar.config
|
||||||
echo "::remove-matcher owner=elixir-mixTestFailure::"
|
cat rebar.config
|
||||||
echo "::remove-matcher owner=elixir-dialyzerOutputDefault::"
|
|
||||||
|
- name: Cache Hex.pm
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.cache/rebar3/
|
||||||
|
key: ${{matrix.elixir}}-${{hashFiles('rebar.config')}}
|
||||||
|
|
||||||
|
- name: Install Hex and Rebar3 manually on older Elixir
|
||||||
|
if: matrix.elixir <= '1.14'
|
||||||
|
run: |
|
||||||
|
mix local.hex --force
|
||||||
|
mix local.rebar --force
|
||||||
|
|
||||||
- name: Compile
|
- name: Compile
|
||||||
run: |
|
run: |
|
||||||
./autogen.sh
|
./autogen.sh
|
||||||
./configure --with-rebar=mix \
|
./configure --with-rebar=./rebar3 \
|
||||||
--prefix=/tmp/ejabberd \
|
--prefix=/tmp/ejabberd \
|
||||||
--enable-all \
|
--enable-all \
|
||||||
--disable-elixir \
|
|
||||||
--disable-odbc
|
--disable-odbc
|
||||||
mix deps.get
|
|
||||||
make
|
make
|
||||||
|
|
||||||
- run: make xref
|
- run: make xref
|
||||||
|
@ -181,17 +246,46 @@ jobs:
|
||||||
_build/dev/rel/ejabberd/bin/ejabberdctl stop \
|
_build/dev/rel/ejabberd/bin/ejabberdctl stop \
|
||||||
&& _build/dev/rel/ejabberd/bin/ejabberdctl stopped
|
&& _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()
|
if: always()
|
||||||
run: |
|
run: |
|
||||||
grep -q '^user1$' registered.log
|
grep -q '^user1$' registered.log
|
||||||
grep -q '^user2$' 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 started' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||||
grep -q 'is stopped' _build/prod/rel/ejabberd/logs/ejabberd.log
|
grep -q 'is stopped' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||||
|
grep -q 'Stopping Ejabberd.Module.Example' _build/prod/rel/ejabberd/logs/ejabberd.log
|
||||||
test $(find _build/prod/ -empty -name error.log)
|
test $(find _build/prod/ -empty -name error.log)
|
||||||
grep -q 'is started' _build/dev/rel/ejabberd/logs/ejabberd.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 'is stopped' _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||||
|
grep -q 'Stopping Ejabberd.Module.Example' _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||||
test $(find _build/dev/ -empty -name error.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 'Stopping Ejabberd.Module.Example' /tmp/ejabberd/var/log/ejabberd/ejabberd.log
|
||||||
|
test $(find /tmp/ejabberd/var/log/ejabberd/ -empty -name error.log)
|
||||||
|
|
||||||
- name: View logs failures
|
- name: View logs failures
|
||||||
if: failure()
|
if: failure()
|
||||||
|
@ -200,3 +294,139 @@ jobs:
|
||||||
cat _build/prod/rel/ejabberd/logs/error.log
|
cat _build/prod/rel/ejabberd/logs/error.log
|
||||||
cat _build/dev/rel/ejabberd/logs/ejabberd.log
|
cat _build/dev/rel/ejabberd/logs/ejabberd.log
|
||||||
cat _build/dev/rel/ejabberd/logs/error.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:
|
||||||
|
elixir: ['1.14', '1.15', '1.16', '1.17', '1.18']
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
container:
|
||||||
|
image: public.ecr.aws/docker/library/elixir:${{ matrix.elixir }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
|
||||||
|
- uses: actions/checkout@v5
|
||||||
|
|
||||||
|
- name: Prepare libraries
|
||||||
|
run: |
|
||||||
|
apt-get -qq update
|
||||||
|
apt-get -y purge libgd3 nginx
|
||||||
|
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 Module.Example and an Elixir dependency
|
||||||
|
run: |
|
||||||
|
sed -i "s|^modules:|modules:\n 'Ejabberd.Module.Example': {}|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: Cache Hex.pm
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.hex/
|
||||||
|
key: ${{matrix.elixir}}-${{hashFiles('mix.exs')}}
|
||||||
|
|
||||||
|
- name: Install Hex and Rebar3 manually on older Elixir
|
||||||
|
if: matrix.elixir <= '1.14'
|
||||||
|
run: |
|
||||||
|
mix local.hex --force
|
||||||
|
mix local.rebar --force
|
||||||
|
|
||||||
|
- 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 'Stopping Ejabberd.Module.Example' _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 'Stopping Ejabberd.Module.Example' _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 'Stopping Ejabberd.Module.Example' /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
|
.edts
|
||||||
|
.tool-versions
|
||||||
*.dump
|
*.dump
|
||||||
/Makefile
|
/Makefile
|
||||||
|
/doc
|
||||||
/config.log
|
/config.log
|
||||||
/config.status
|
/config.status
|
||||||
/config/releases.exs
|
/config/releases.exs
|
||||||
|
@ -32,12 +34,14 @@
|
||||||
/priv/bin/captcha*sh
|
/priv/bin/captcha*sh
|
||||||
/priv/sql
|
/priv/sql
|
||||||
/rel/ejabberd
|
/rel/ejabberd
|
||||||
|
/recompile.log
|
||||||
/_build
|
/_build
|
||||||
/database/
|
/database/
|
||||||
/.rebar
|
/.rebar
|
||||||
/rebar.lock
|
|
||||||
/log/
|
/log/
|
||||||
Mnesia.nonode@nohost/
|
Mnesia.nonode@nohost/
|
||||||
|
/TAGS
|
||||||
|
/tags
|
||||||
# Binaries created with tools/make-{binaries,installers,packages}:
|
# Binaries created with tools/make-{binaries,installers,packages}:
|
||||||
/ejabberd_*.deb
|
/ejabberd_*.deb
|
||||||
/ejabberd-*.rpm
|
/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"
|
||||||
|
]
|
||||||
|
}
|
66
.vscode/launch.json
vendored
Normal file
66
.vscode/launch.json
vendored
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Relive (Vim)",
|
||||||
|
"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": 900,
|
||||||
|
"cwd": "."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Relive (VSCode)",
|
||||||
|
"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
|
||||||
|
|
||||||
|
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"}
|
||||||
|
}
|
||||||
|
}
|
1114
CHANGELOG.md
1114
CHANGELOG.md
File diff suppressed because it is too large
Load diff
|
@ -22,6 +22,21 @@ Examples of unacceptable behavior by participants include:
|
||||||
* Publishing others' private information, such as a physical or electronic address, without explicit permission
|
* Publishing others' private information, such as a physical or electronic address, without explicit permission
|
||||||
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||||
|
|
||||||
|
## Guidelines for Respectful and Efficient Communication on Issues, Discussions, and PRs
|
||||||
|
|
||||||
|
To ensure that our maintainers can efficiently manage issues and provide timely updates, we kindly ask that all comments on GitHub tickets remain relevant to the topic of the issue. Please avoid posting comments solely to ping maintainers or ask for updates. If you need information on the status of an issue, consider the following:
|
||||||
|
|
||||||
|
- **Check the Issue Timeline:** Review the existing comments and updates on the issue before posting.
|
||||||
|
- **Use Reactions:** If you want to show that you are interested in an issue, use GitHub's reaction feature (e.g., thumbs up) instead of commenting.
|
||||||
|
- **Be Patient:** Understand that maintainers may be working on multiple tasks and will provide updates as soon as possible.
|
||||||
|
|
||||||
|
Additionally, please be aware that:
|
||||||
|
|
||||||
|
- **User Responses:** Users who report issues may no longer be using the software, may have switched to other projects, or may simply be busy. It is their right not to respond to follow-up questions or comments.
|
||||||
|
- **Maintainer Priorities:** Maintainers have the right to define their own priorities and schedule. They will address issues based on their availability and the project's needs.
|
||||||
|
|
||||||
|
By following these guidelines, you help us maintain a productive and respectful environment for everyone involved.
|
||||||
|
|
||||||
## Our Responsibilities
|
## Our Responsibilities
|
||||||
|
|
||||||
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
|
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
|
||||||
|
@ -34,13 +49,13 @@ This Code of Conduct applies both within project spaces and in public spaces whe
|
||||||
|
|
||||||
## Enforcement
|
## 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.
|
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.
|
||||||
|
|
||||||
## Attribution
|
## Attribution
|
||||||
|
|
||||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [https://contributor-covenant.org/version/1/4][version]
|
||||||
|
|
||||||
[homepage]: http://contributor-covenant.org
|
[homepage]: https://www.contributor-covenant.org/
|
||||||
[version]: http://contributor-covenant.org/version/1/4/
|
[version]: https://www.contributor-covenant.org/version/1/4/
|
||||||
|
|
38
COMPILE.md
38
COMPILE.md
|
@ -7,7 +7,7 @@ from source code.
|
||||||
For a more detailed explanation, please check the
|
For a more detailed explanation, please check the
|
||||||
ejabberd Docs: [Source Code Installation][docs-source].
|
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
|
Requirements
|
||||||
|
@ -15,20 +15,20 @@ Requirements
|
||||||
|
|
||||||
To compile ejabberd you need:
|
To compile ejabberd you need:
|
||||||
|
|
||||||
- GNU Make
|
- GNU Make
|
||||||
- GCC
|
- GCC
|
||||||
- Libexpat ≥ 1.95
|
- Libexpat ≥ 1.95
|
||||||
- Libyaml ≥ 0.1.4
|
- Libyaml ≥ 0.1.4
|
||||||
- Erlang/OTP ≥ 19.3
|
- Erlang/OTP ≥ 25.0
|
||||||
- OpenSSL ≥ 1.0.0
|
- OpenSSL ≥ 1.0.0
|
||||||
|
|
||||||
Other optional libraries are:
|
Other optional libraries are:
|
||||||
|
|
||||||
- Zlib ≥ 1.2.3, for Stream Compression support (XEP-0138)
|
- Zlib ≥ 1.2.3, for Stream Compression support (XEP-0138)
|
||||||
- PAM library, for Pluggable Authentication Modules (PAM)
|
- PAM library, for Pluggable Authentication Modules (PAM)
|
||||||
- ImageMagick's Convert program and Ghostscript fonts, for CAPTCHA
|
- ImageMagick's Convert program and Ghostscript fonts, for CAPTCHA
|
||||||
challenges
|
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.14.0 or higher
|
||||||
|
|
||||||
If your system splits packages in libraries and development headers,
|
If your system splits packages in libraries and development headers,
|
||||||
install the development packages too.
|
install the development packages too.
|
||||||
|
@ -43,7 +43,7 @@ There are several ways to obtain the ejabberd source code:
|
||||||
- Source code package from [ejabberd GitHub Releases][ghr]
|
- Source code package from [ejabberd GitHub Releases][ghr]
|
||||||
- Latest development code from [ejabberd Git repository][gitrepo]
|
- Latest development code from [ejabberd Git repository][gitrepo]
|
||||||
|
|
||||||
[p1dl]: https://www.process-one.net/en/ejabberd/downloads/
|
[p1dl]: https://www.process-one.net/download/ejabberd/
|
||||||
[ghr]: https://github.com/processone/ejabberd/releases
|
[ghr]: https://github.com/processone/ejabberd/releases
|
||||||
[gitrepo]: https://github.com/processone/ejabberd
|
[gitrepo]: https://github.com/processone/ejabberd
|
||||||
|
|
||||||
|
@ -65,6 +65,11 @@ To configure the compilation, features, install paths...
|
||||||
|
|
||||||
./configure --help
|
./configure --help
|
||||||
|
|
||||||
|
The build tool automatically downloads and compiles the
|
||||||
|
erlang libraries that [ejabberd depends on][docs-repo].
|
||||||
|
|
||||||
|
[docs-repo]: https://docs.ejabberd.im/developer/repositories/
|
||||||
|
|
||||||
|
|
||||||
Install in the System
|
Install in the System
|
||||||
---------------------
|
---------------------
|
||||||
|
@ -89,13 +94,8 @@ Build an OTP Release
|
||||||
Instead of installing ejabberd in the system, you can 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:
|
that includes all necessary to run ejabberd in a subdirectory:
|
||||||
|
|
||||||
./configure --with-rebar=rebar3
|
./configure
|
||||||
make rel
|
make prod
|
||||||
|
|
||||||
Or, if you have Elixir available and plan to develop Elixir code:
|
|
||||||
|
|
||||||
./configure --with-rebar=mix
|
|
||||||
make dev
|
|
||||||
|
|
||||||
Check the full list of targets:
|
Check the full list of targets:
|
||||||
|
|
||||||
|
|
956
CONTAINER.md
956
CONTAINER.md
File diff suppressed because it is too large
Load diff
|
@ -3,21 +3,21 @@
|
||||||
We'd love for you to contribute to our source code and to make ejabberd even better than it is
|
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:
|
today! Here are the guidelines we'd like you to follow:
|
||||||
|
|
||||||
* [Code of Conduct](#coc)
|
* [Code of Conduct](#code-of-conduct)
|
||||||
* [Questions and Problems](#question)
|
* [Questions and Problems](#questions-bugs-features)
|
||||||
* [Issues and Bugs](#issue)
|
* [Issues and Bugs](#found-an-issue-or-bug)
|
||||||
* [Feature Requests](#feature)
|
* [Feature Requests](#missing-a-feature)
|
||||||
* [Issue Submission Guidelines](#submit)
|
* [Issue Submission Guidelines](#issue-submission-guidelines)
|
||||||
* [Pull Request Submission Guidelines](#submit-pr)
|
* [Pull Request Submission Guidelines](#pull-request-submission-guidelines)
|
||||||
* [Signing the CLA](#cla)
|
* [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].
|
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
|
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
|
and feature requests. You've got much better chances of getting your question answered on dedicated
|
||||||
|
@ -25,25 +25,25 @@ support platforms, the best being [Stack Overflow][stackoverflow].
|
||||||
|
|
||||||
Stack Overflow is a much better place to ask questions since:
|
Stack Overflow is a much better place to ask questions since:
|
||||||
|
|
||||||
- there are thousands of people willing to help on Stack Overflow
|
* there are thousands of people willing to help on Stack Overflow
|
||||||
- questions and answers stay available for public viewing so your question / answer might help
|
* questions and answers stay available for public viewing so your question / answer might help
|
||||||
someone else
|
someone else
|
||||||
- Stack Overflow's voting system assures that the best answers are prominently visible.
|
* Stack Overflow's voting system assures that the best answers are prominently visible.
|
||||||
|
|
||||||
To save your and our time, we will systematically close all issues that are requests for general
|
To save your and our time, we will systematically close all issues that are requests for general
|
||||||
support and redirect people to the section you are reading right now.
|
support and redirect people to the section you are reading right now.
|
||||||
|
|
||||||
Other channels for support are:
|
Other channels for support are:
|
||||||
- [ejabberd Mailing List][list]
|
|
||||||
- [ejabberd XMPP room][muc]: ejabberd@conference.process-one.net
|
|
||||||
- [ejabberd XMPP room logs][logs]
|
|
||||||
|
|
||||||
### <a name="issue"></a> Found an Issue or Bug?
|
* ejabberd XMPP room: [ejabberd@conference.process-one.net][muc]
|
||||||
|
* [ejabberd Mailing List][list]
|
||||||
|
|
||||||
|
### Found an Issue or Bug?
|
||||||
|
|
||||||
If you find a bug in the source code, you can help us by submitting an issue to our
|
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.
|
[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].
|
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
|
* **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.
|
[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]
|
* **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.
|
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
|
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.
|
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
|
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]
|
to grant your contribution's copyright license to ProcessOne. Please check [ProcessOne CLA][cla]
|
||||||
|
@ -80,6 +80,7 @@ Before you submit your pull request consider the following guidelines:
|
||||||
```shell
|
```shell
|
||||||
git checkout -b my-fix-branch master
|
git checkout -b my-fix-branch master
|
||||||
```
|
```
|
||||||
|
|
||||||
* Test your changes and, if relevant, expand the automated test suite.
|
* Test your changes and, if relevant, expand the automated test suite.
|
||||||
* Create your patch commit, including appropriate test cases.
|
* Create your patch commit, including appropriate test cases.
|
||||||
* If the changes affect public APIs, change or add relevant [documentation][doc-repo].
|
* If the changes affect public APIs, change or add relevant [documentation][doc-repo].
|
||||||
|
@ -88,6 +89,7 @@ Before you submit your pull request consider the following guidelines:
|
||||||
```shell
|
```shell
|
||||||
git commit -a
|
git commit -a
|
||||||
```
|
```
|
||||||
|
|
||||||
Note: the optional commit `-a` command line option will automatically "add" and "rm" edited files.
|
Note: the optional commit `-a` command line option will automatically "add" and "rm" edited files.
|
||||||
|
|
||||||
* Push your branch to GitHub:
|
* Push your branch to GitHub:
|
||||||
|
@ -123,28 +125,25 @@ restarted.
|
||||||
|
|
||||||
That's it! Thank you for your contribution!
|
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
|
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
|
so before. It's a quick process, we promise, and you will be able to do it all online
|
||||||
|
|
||||||
You can read [ProcessOne Contribution License Agreement][cla] in PDF.
|
Here's a link to the [ProcessOne Contribution License Agreement][cla].
|
||||||
|
|
||||||
This is part of the legal framework of the open-source ecosystem that adds some red tape,
|
This is part of the legal framework of the open-source ecosystem that adds some red tape,
|
||||||
but protects both the contributor and the company / foundation behind the project. It also
|
but protects both the contributor and the company / foundation behind the project. It also
|
||||||
gives us the option to relicense the code with a more permissive license in the future.
|
gives us the option to relicense the code with a more permissive license in the future.
|
||||||
|
|
||||||
|
|
||||||
[coc]: https://github.com/processone/ejabberd/blob/master/CODE_OF_CONDUCT.md
|
[coc]: https://github.com/processone/ejabberd/blob/master/CODE_OF_CONDUCT.md
|
||||||
[stackoverflow]: https://stackoverflow.com/questions/tagged/ejabberd?sort=newest
|
[stackoverflow]: https://stackoverflow.com/questions/tagged/ejabberd?sort=newest
|
||||||
[list]: https://lists.jabber.ru/mailman/listinfo/ejabberd
|
[list]: https://web.archive.org/web/20230319174915/http://lists.jabber.ru/mailman/listinfo/ejabberd
|
||||||
[muc]: xmpp:ejabberd@conference.process-one.net
|
[muc]: xmpp:ejabberd@conference.process-one.net
|
||||||
[logs]: https://process-one.net/logs/ejabberd@conference.process-one.net/
|
|
||||||
[github]: https://github.com/processone/ejabberd
|
[github]: https://github.com/processone/ejabberd
|
||||||
[github-issues]: https://github.com/processone/ejabberd/issues
|
[github-issues]: https://github.com/processone/ejabberd/issues
|
||||||
[github-new-issue]: https://github.com/processone/ejabberd/issues/new
|
[github-new-issue]: https://github.com/processone/ejabberd/issues/new
|
||||||
[github-pr]: https://github.com/processone/ejabberd/pulls
|
[github-pr]: https://github.com/processone/ejabberd/pulls
|
||||||
[doc-repo]: https://github.com/processone/docs.ejabberd.im
|
[doc-repo]: https://github.com/processone/docs.ejabberd.im
|
||||||
[developer-setup]: https://docs.ejabberd.im/developer/
|
[developer-setup]: https://docs.ejabberd.im/developer/
|
||||||
[cla]: https://www.process-one.net/resources/ejabberd-cla.pdf
|
[cla]: https://cla.process-one.net/
|
||||||
[license]: https://github.com/processone/ejabberd/blob/master/COPYING
|
|
||||||
|
|
303
Makefile.in
303
Makefile.in
|
@ -1,8 +1,23 @@
|
||||||
REBAR = @ESCRIPT@ @rebar@
|
#.
|
||||||
|
#' definitions
|
||||||
|
#
|
||||||
|
|
||||||
|
ESCRIPT = @ESCRIPT@
|
||||||
|
REBAR = @rebar@ # rebar|rebar3|mix binary (or path to binary)
|
||||||
|
REBAR3 = @REBAR3@ # path to rebar3 binary
|
||||||
MIX = @rebar@
|
MIX = @rebar@
|
||||||
|
AWK = @AWK@
|
||||||
INSTALL = @INSTALL@
|
INSTALL = @INSTALL@
|
||||||
|
MKDIR_P = @MKDIR_P@
|
||||||
SED = @SED@
|
SED = @SED@
|
||||||
ERL = @ERL@
|
ERL = @ERL@
|
||||||
|
EPMD = @EPMD@
|
||||||
|
IEX = @IEX@
|
||||||
|
|
||||||
|
INSTALLUSER=@INSTALLUSER@
|
||||||
|
INSTALLGROUP=@INSTALLGROUP@
|
||||||
|
|
||||||
|
REBAR_ENABLE_ELIXIR = @elixir@
|
||||||
|
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
exec_prefix = @exec_prefix@
|
exec_prefix = @exec_prefix@
|
||||||
|
@ -71,7 +86,10 @@ SPOOLDIR = @localstatedir@/lib/ejabberd
|
||||||
# /var/log/ejabberd/
|
# /var/log/ejabberd/
|
||||||
LOGDIR = @localstatedir@/log/ejabberd
|
LOGDIR = @localstatedir@/log/ejabberd
|
||||||
|
|
||||||
INSTALLUSER=@INSTALLUSER@
|
#.
|
||||||
|
#' install user
|
||||||
|
#
|
||||||
|
|
||||||
# if no user was enabled, don't set privileges or ownership
|
# if no user was enabled, don't set privileges or ownership
|
||||||
ifeq ($(INSTALLUSER),)
|
ifeq ($(INSTALLUSER),)
|
||||||
O_USER=
|
O_USER=
|
||||||
|
@ -86,18 +104,22 @@ else
|
||||||
CHOWN_OUTPUT=&1
|
CHOWN_OUTPUT=&1
|
||||||
INIT_USER=$(INSTALLUSER)
|
INIT_USER=$(INSTALLUSER)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# if no group was enabled, don't set privileges or ownership
|
# if no group was enabled, don't set privileges or ownership
|
||||||
INSTALLGROUP=@INSTALLGROUP@
|
|
||||||
ifneq ($(INSTALLGROUP),)
|
ifneq ($(INSTALLGROUP),)
|
||||||
G_USER=-g $(INSTALLGROUP)
|
G_USER=-g $(INSTALLGROUP)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq "$(MIX)" "mix"
|
#.
|
||||||
|
#' rebar / rebar3 / mix
|
||||||
|
#
|
||||||
|
|
||||||
|
ifeq "$(notdir $(MIX))" "mix"
|
||||||
REBAR_VER:=6
|
REBAR_VER:=6
|
||||||
REBAR_VER_318:=0
|
REBAR_VER_318:=0
|
||||||
else
|
else
|
||||||
REBAR_VER:=$(shell $(REBAR) --version | awk -F '[ .]' '/rebar / {print $$2}')
|
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_318:=$(shell $(REBAR) --version | $(AWK) -F '[ .]' '/rebar / {print ($$2 == 3 && $$3 >= 18 ? 1 : 0)}')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq "$(REBAR_VER)" "6"
|
ifeq "$(REBAR_VER)" "6"
|
||||||
|
@ -112,11 +134,26 @@ ifeq "$(REBAR_VER)" "6"
|
||||||
CONFIGURE_DEPS=(cd deps/eimp; ./configure)
|
CONFIGURE_DEPS=(cd deps/eimp; ./configure)
|
||||||
EBINDIR=$(DEPSDIR)/ejabberd/ebin
|
EBINDIR=$(DEPSDIR)/ejabberd/ebin
|
||||||
XREFOPTIONS=graph
|
XREFOPTIONS=graph
|
||||||
|
EDOCPRE=MIX_ENV=edoc
|
||||||
|
EDOCTASK=docs --proglang erlang
|
||||||
CLEANARG=--deps
|
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
|
REBARREL=MIX_ENV=prod $(REBAR) release --overwrite
|
||||||
REBARDEV=MIX_ENV=dev $(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
|
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"
|
ifeq "$(REBAR_VER)" "3"
|
||||||
SKIPDEPS=
|
SKIPDEPS=
|
||||||
LISTDEPS=tree
|
LISTDEPS=tree
|
||||||
|
@ -134,8 +171,12 @@ endif
|
||||||
XREFOPTIONS=
|
XREFOPTIONS=
|
||||||
CLEANARG=--all
|
CLEANARG=--all
|
||||||
REBARREL=$(REBAR) as prod tar
|
REBARREL=$(REBAR) as prod tar
|
||||||
REBARDEV=REBAR_PROFILE=dev $(REBAR) release
|
REBARDEV=$(REBAR) as dev release
|
||||||
RELIVECMD=$(REBAR) relive
|
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
|
else
|
||||||
SKIPDEPS=skip_deps=true
|
SKIPDEPS=skip_deps=true
|
||||||
LISTDEPS=-q list-deps
|
LISTDEPS=-q list-deps
|
||||||
|
@ -151,10 +192,16 @@ else
|
||||||
REBARREL=$(REBAR) generate
|
REBARREL=$(REBAR) generate
|
||||||
REBARDEV=
|
REBARDEV=
|
||||||
RELIVECMD=@echo "Rebar2 detected... relive not supported.\
|
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
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
#.
|
||||||
|
#' main targets
|
||||||
|
#
|
||||||
|
|
||||||
all: scripts deps src
|
all: scripts deps src
|
||||||
|
|
||||||
deps: $(DEPSDIR)/.got
|
deps: $(DEPSDIR)/.got
|
||||||
|
@ -162,7 +209,7 @@ deps: $(DEPSDIR)/.got
|
||||||
$(DEPSDIR)/.got:
|
$(DEPSDIR)/.got:
|
||||||
rm -rf $(DEPSDIR)/.got
|
rm -rf $(DEPSDIR)/.got
|
||||||
rm -rf $(DEPSDIR)/.built
|
rm -rf $(DEPSDIR)/.built
|
||||||
mkdir -p $(DEPSDIR)
|
$(MKDIR_P) $(DEPSDIR)
|
||||||
$(REBAR) $(GET_DEPS) && :> $(DEPSDIR)/.got
|
$(REBAR) $(GET_DEPS) && :> $(DEPSDIR)/.got
|
||||||
$(CONFIGURE_DEPS)
|
$(CONFIGURE_DEPS)
|
||||||
|
|
||||||
|
@ -171,6 +218,7 @@ $(DEPSDIR)/.built: $(DEPSDIR)/.got
|
||||||
|
|
||||||
src: $(DEPSDIR)/.built
|
src: $(DEPSDIR)/.built
|
||||||
$(REBAR) $(SKIPDEPS) compile
|
$(REBAR) $(SKIPDEPS) compile
|
||||||
|
$(EXPLICIT_ELIXIR_COMPILE)
|
||||||
|
|
||||||
update:
|
update:
|
||||||
rm -rf $(DEPSDIR)/.got
|
rm -rf $(DEPSDIR)/.got
|
||||||
|
@ -188,11 +236,45 @@ options: all
|
||||||
tools/opt_types.sh ejabberd_option $(EBINDIR)
|
tools/opt_types.sh ejabberd_option $(EBINDIR)
|
||||||
|
|
||||||
translations:
|
translations:
|
||||||
tools/prepare-tr.sh $(DEPSDIR)
|
$(GET_DEPS_TRANSLATIONS)
|
||||||
|
tools/prepare-tr.sh $(DEPSDIR_TRANSLATIONS)
|
||||||
|
|
||||||
edoc:
|
doap:
|
||||||
$(ERL) -noinput +B -eval \
|
tools/generate-doap.sh
|
||||||
'case edoc:application(ejabberd, ".", []) of ok -> halt(0); error -> halt(1) end.'
|
|
||||||
|
#.
|
||||||
|
#' 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
|
||||||
|
|
||||||
|
#.
|
||||||
|
#' format / indent
|
||||||
|
#
|
||||||
|
|
||||||
|
format:
|
||||||
|
tools/rebar3-format.sh $(REBAR3)
|
||||||
|
|
||||||
|
indent:
|
||||||
|
tools/emacs-indent.sh
|
||||||
|
|
||||||
|
#.
|
||||||
|
#' copy-files
|
||||||
|
#
|
||||||
|
|
||||||
JOIN_PATHS=$(if $(wordlist 2,1000,$(1)),$(firstword $(1))/$(call JOIN_PATHS,$(wordlist 2,1000,$(1))),$(1))
|
JOIN_PATHS=$(if $(wordlist 2,1000,$(1)),$(firstword $(1))/$(call JOIN_PATHS,$(wordlist 2,1000,$(1))),$(1))
|
||||||
|
|
||||||
|
@ -279,26 +361,58 @@ copy-files:
|
||||||
|
|
||||||
copy-files-sub: copy-files-sub2
|
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:
|
relive:
|
||||||
|
$(EXPLICIT_ELIXIR_COMPILE_DEV)
|
||||||
$(RELIVECMD)
|
$(RELIVECMD)
|
||||||
|
|
||||||
relivelibdir=$(shell pwd)/$(DEPSDIR)
|
relivelibdir=$(shell pwd)/$(DEPSDIR)
|
||||||
relivedir=$(shell pwd)/_build/relive
|
relivedir=$(shell pwd)/_build/relive
|
||||||
iexpath=$(shell which iex)
|
|
||||||
CONFIG_DIR = ${relivedir}/conf
|
CONFIG_DIR = ${relivedir}/conf
|
||||||
SPOOL_DIR = ${relivedir}/database
|
SPOOL_DIR = ${relivedir}/database
|
||||||
LOGS_DIR = ${relivedir}/logs
|
LOGS_DIR = ${relivedir}/logs
|
||||||
|
|
||||||
|
#.
|
||||||
|
#' scripts
|
||||||
|
#
|
||||||
|
|
||||||
ejabberdctl.relive:
|
ejabberdctl.relive:
|
||||||
$(SED) -e "s*{{installuser}}*@INSTALLUSER@*g" \
|
$(SED) -e "s*{{installuser}}*${INSTALLUSER}*g" \
|
||||||
-e "s*{{config_dir}}*${CONFIG_DIR}*g" \
|
-e "s*{{config_dir}}*${CONFIG_DIR}*g" \
|
||||||
-e "s*{{logs_dir}}*${LOGS_DIR}*g" \
|
-e "s*{{logs_dir}}*${LOGS_DIR}*g" \
|
||||||
-e "s*{{spool_dir}}*${SPOOL_DIR}*g" \
|
-e "s*{{spool_dir}}*${SPOOL_DIR}*g" \
|
||||||
-e "s*{{bindir}}/iex*$(iexpath)*g" \
|
-e "s*{{bindir}}*${BINDIR}*g" \
|
||||||
-e "s*{{bindir}}*@bindir@*g" \
|
-e "s*{{libdir}}*${relivelibdir}${ELIXIR_LIBDIR}*g" \
|
||||||
-e "s*{{libdir}}*${relivelibdir}*g" \
|
-e "s*ERTS_VSN*# ERTS_VSN*g" \
|
||||||
-e "s*{{erl}}*@ERL@*g" \
|
-e "s*{{iexpath}}*${IEX}*g" \
|
||||||
-e "s*{{epmd}}*@EPMD@*g" ejabberdctl.template \
|
-e "s*{{erl}}*${ERL}*g" \
|
||||||
|
-e "s*{{epmd}}*${EPMD}*g" ejabberdctl.template \
|
||||||
> ejabberdctl.relive
|
> ejabberdctl.relive
|
||||||
|
|
||||||
ejabberd.init:
|
ejabberd.init:
|
||||||
|
@ -314,19 +428,29 @@ ejabberd.service:
|
||||||
chmod 644 ejabberd.service
|
chmod 644 ejabberd.service
|
||||||
|
|
||||||
ejabberdctl.example: vars.config
|
ejabberdctl.example: vars.config
|
||||||
$(SED) -e "s*{{installuser}}*@INSTALLUSER@*g" \
|
$(SED) -e "s*{{installuser}}*${INSTALLUSER}*g" \
|
||||||
-e "s*{{config_dir}}*${ETCDIR}*g" \
|
-e "s*{{config_dir}}*${ETCDIR}*g" \
|
||||||
-e "s*{{logs_dir}}*${LOGDIR}*g" \
|
-e "s*{{logs_dir}}*${LOGDIR}*g" \
|
||||||
-e "s*{{spool_dir}}*${SPOOLDIR}*g" \
|
-e "s*{{spool_dir}}*${SPOOLDIR}*g" \
|
||||||
-e "s*{{bindir}}*@bindir@*g" \
|
-e "s*{{bindir}}*${BINDIR}*g" \
|
||||||
-e "s*{{libdir}}*@libdir@*g" \
|
-e "s*{{libdir}}*${LIBDIR}${ELIXIR_LIBDIR}*g" \
|
||||||
-e "s*{{erl}}*@ERL@*g" \
|
-e "s*ERTS_VSN*# ERTS_VSN*g" \
|
||||||
-e "s*{{epmd}}*@EPMD@*g" ejabberdctl.template \
|
-e "s*{{iexpath}}*${IEX}*g" \
|
||||||
|
-e "s*{{erl}}*${ERL}*g" \
|
||||||
|
-e "s*{{epmd}}*${EPMD}*g" ejabberdctl.template \
|
||||||
> ejabberdctl.example
|
> ejabberdctl.example
|
||||||
|
|
||||||
scripts: ejabberd.init ejabberd.service 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
|
# Configuration files
|
||||||
$(INSTALL) -d -m 750 $(G_USER) $(DESTDIR)$(ETCDIR)
|
$(INSTALL) -d -m 750 $(G_USER) $(DESTDIR)$(ETCDIR)
|
||||||
|
@ -349,12 +473,12 @@ install: copy-files
|
||||||
#
|
#
|
||||||
# Spool directory
|
# Spool directory
|
||||||
$(INSTALL) -d -m 750 $(O_USER) $(DESTDIR)$(SPOOLDIR)
|
$(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)
|
chmod -R 750 $(DESTDIR)$(SPOOLDIR)
|
||||||
#
|
#
|
||||||
# Log directory
|
# Log directory
|
||||||
$(INSTALL) -d -m 750 $(O_USER) $(DESTDIR)$(LOGDIR)
|
$(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)
|
chmod -R 750 $(DESTDIR)$(LOGDIR)
|
||||||
#
|
#
|
||||||
# Documentation
|
# Documentation
|
||||||
|
@ -365,8 +489,14 @@ install: copy-files
|
||||||
|| echo "Man page not included in sources"
|
|| echo "Man page not included in sources"
|
||||||
$(INSTALL) -m 644 COPYING $(DESTDIR)$(DOCDIR)
|
$(INSTALL) -m 644 COPYING $(DESTDIR)$(DOCDIR)
|
||||||
|
|
||||||
|
#.
|
||||||
|
#' uninstall
|
||||||
|
#
|
||||||
|
|
||||||
uninstall: uninstall-binary
|
uninstall: uninstall-binary
|
||||||
|
|
||||||
|
uninstall-rel: uninstall-binary uninstall-librel
|
||||||
|
|
||||||
uninstall-binary:
|
uninstall-binary:
|
||||||
rm -f $(DESTDIR)$(SBINDIR)/ejabberdctl
|
rm -f $(DESTDIR)$(SBINDIR)/ejabberdctl
|
||||||
rm -f $(DESTDIR)$(BINDIR)/iex
|
rm -f $(DESTDIR)$(BINDIR)/iex
|
||||||
|
@ -395,6 +525,7 @@ uninstall-binary:
|
||||||
rm -fr $(DESTDIR)$(LUADIR)
|
rm -fr $(DESTDIR)$(LUADIR)
|
||||||
rm -fr $(DESTDIR)$(PRIVDIR)
|
rm -fr $(DESTDIR)$(PRIVDIR)
|
||||||
rm -fr $(DESTDIR)$(EJABBERDDIR)
|
rm -fr $(DESTDIR)$(EJABBERDDIR)
|
||||||
|
rm -f $(DESTDIR)$(MANDIR)/ejabberd.yml.5
|
||||||
|
|
||||||
uninstall-all: uninstall-binary
|
uninstall-all: uninstall-binary
|
||||||
rm -rf $(DESTDIR)$(ETCDIR)
|
rm -rf $(DESTDIR)$(ETCDIR)
|
||||||
|
@ -402,6 +533,10 @@ uninstall-all: uninstall-binary
|
||||||
rm -rf $(DESTDIR)$(SPOOLDIR)
|
rm -rf $(DESTDIR)$(SPOOLDIR)
|
||||||
rm -rf $(DESTDIR)$(LOGDIR)
|
rm -rf $(DESTDIR)$(LOGDIR)
|
||||||
|
|
||||||
|
#.
|
||||||
|
#' clean
|
||||||
|
#
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf $(DEPSDIR)/.got
|
rm -rf $(DEPSDIR)/.got
|
||||||
rm -rf $(DEPSDIR)/.built
|
rm -rf $(DEPSDIR)/.built
|
||||||
|
@ -424,27 +559,53 @@ distclean: clean clean-rel
|
||||||
rm -f Makefile
|
rm -f Makefile
|
||||||
rm -f vars.config
|
rm -f vars.config
|
||||||
|
|
||||||
rel:
|
#.
|
||||||
|
#' releases
|
||||||
|
#
|
||||||
|
|
||||||
|
rel: prod
|
||||||
|
|
||||||
|
prod:
|
||||||
|
$(PREPARE_ELIXIR_SCRIPTS)
|
||||||
$(REBARREL)
|
$(REBARREL)
|
||||||
|
|
||||||
DEV_CONFIG = _build/dev/rel/ejabberd/conf/ejabberd.yml
|
DEV_CONFIG = _build/dev/rel/ejabberd/conf/ejabberd.yml
|
||||||
|
|
||||||
dev $(DEV_CONFIG):
|
dev $(DEV_CONFIG):
|
||||||
|
$(PREPARE_ELIXIR_SCRIPTS)
|
||||||
$(REBARDEV)
|
$(REBARDEV)
|
||||||
|
|
||||||
|
#.
|
||||||
|
#' tags
|
||||||
|
#
|
||||||
|
|
||||||
TAGS:
|
TAGS:
|
||||||
etags *.erl
|
etags src/*.erl
|
||||||
|
|
||||||
|
#.
|
||||||
|
#' makefile
|
||||||
|
#
|
||||||
|
|
||||||
Makefile: Makefile.in
|
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:
|
dialyzer:
|
||||||
$(REBAR) dialyzer
|
$(REBAR) dialyzer
|
||||||
else
|
|
||||||
|
else # Rebar2
|
||||||
deps := $(wildcard $(DEPSDIR)/*/ebin)
|
deps := $(wildcard $(DEPSDIR)/*/ebin)
|
||||||
|
|
||||||
dialyzer/erlang.plt:
|
dialyzer/erlang.plt:
|
||||||
@mkdir -p dialyzer
|
@$(MKDIR_P) dialyzer
|
||||||
@dialyzer --build_plt --output_plt dialyzer/erlang.plt \
|
@dialyzer --build_plt --output_plt dialyzer/erlang.plt \
|
||||||
-o dialyzer/erlang.log --apps kernel stdlib sasl crypto \
|
-o dialyzer/erlang.log --apps kernel stdlib sasl crypto \
|
||||||
public_key ssl mnesia inets odbc compiler erts \
|
public_key ssl mnesia inets odbc compiler erts \
|
||||||
|
@ -452,13 +613,13 @@ dialyzer/erlang.plt:
|
||||||
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
|
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
|
||||||
|
|
||||||
dialyzer/deps.plt:
|
dialyzer/deps.plt:
|
||||||
@mkdir -p dialyzer
|
@$(MKDIR_P) dialyzer
|
||||||
@dialyzer --build_plt --output_plt dialyzer/deps.plt \
|
@dialyzer --build_plt --output_plt dialyzer/deps.plt \
|
||||||
-o dialyzer/deps.log $(deps); \
|
-o dialyzer/deps.log $(deps); \
|
||||||
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
|
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
|
||||||
|
|
||||||
dialyzer/ejabberd.plt:
|
dialyzer/ejabberd.plt:
|
||||||
@mkdir -p dialyzer
|
@$(MKDIR_P) dialyzer
|
||||||
@dialyzer --build_plt --output_plt dialyzer/ejabberd.plt \
|
@dialyzer --build_plt --output_plt dialyzer/ejabberd.plt \
|
||||||
-o dialyzer/ejabberd.log ebin; \
|
-o dialyzer/ejabberd.log ebin; \
|
||||||
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
|
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
|
||||||
|
@ -480,6 +641,18 @@ dialyzer: erlang_plt deps_plt ejabberd_plt
|
||||||
--get_warnings -o dialyzer/error.log ebin; \
|
--get_warnings -o dialyzer/error.log ebin; \
|
||||||
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
|
status=$$? ; if [ $$status -ne 2 ]; then exit $$status; else exit 0; fi
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
#.
|
||||||
|
#' elvis
|
||||||
|
#
|
||||||
|
|
||||||
|
elvis:
|
||||||
|
$(REBAR) lint
|
||||||
|
|
||||||
|
#.
|
||||||
|
#' test
|
||||||
|
#
|
||||||
|
|
||||||
test:
|
test:
|
||||||
@echo "************************** NOTICE ***************************************"
|
@echo "************************** NOTICE ***************************************"
|
||||||
|
@ -488,9 +661,32 @@ test:
|
||||||
@cd priv && ln -sf ../sql
|
@cd priv && ln -sf ../sql
|
||||||
$(REBAR) $(SKIPDEPS) ct
|
$(REBAR) $(SKIPDEPS) ct
|
||||||
|
|
||||||
.PHONY: src edoc dialyzer Makefile TAGS clean clean-rel distclean rel \
|
.PHONY: test-%
|
||||||
install uninstall uninstall-binary uninstall-all translations deps test \
|
define test-group-target
|
||||||
quicktest erlang_plt deps_plt ejabberd_plt xref hooks options
|
test-$1:
|
||||||
|
$(REBAR) $(SKIPDEPS) ct --suite=test/ejabberd_SUITE --group=$1
|
||||||
|
endef
|
||||||
|
|
||||||
|
ifneq ($(filter test-%,$(MAKECMDGOALS)),)
|
||||||
|
group_to_test := $(patsubst test-%,%,$(filter test-%,$(MAKECMDGOALS)))
|
||||||
|
$(eval $(call test-group-target,$(group_to_test)))
|
||||||
|
endif
|
||||||
|
|
||||||
|
test-eunit:
|
||||||
|
$(REBAR) $(SKIPDEPS) eunit --verbose
|
||||||
|
|
||||||
|
#.
|
||||||
|
#' phony
|
||||||
|
#
|
||||||
|
|
||||||
|
.PHONY: src edoc dialyzer Makefile TAGS clean clean-rel distclean prod rel \
|
||||||
|
install uninstall uninstall-binary uninstall-all translations deps test test-eunit \
|
||||||
|
all dev doap help install-rel relive scripts uninstall-rel update \
|
||||||
|
erlang_plt deps_plt ejabberd_plt xref hooks options format indent
|
||||||
|
|
||||||
|
#.
|
||||||
|
#' help
|
||||||
|
#
|
||||||
|
|
||||||
help:
|
help:
|
||||||
@echo ""
|
@echo ""
|
||||||
|
@ -498,24 +694,37 @@ help:
|
||||||
@echo " scripts Prepare ejabberd start scripts"
|
@echo " scripts Prepare ejabberd start scripts"
|
||||||
@echo " deps Get and configure dependencies"
|
@echo " deps Get and configure dependencies"
|
||||||
@echo " src Compile dependencies and ejabberd"
|
@echo " src Compile dependencies and ejabberd"
|
||||||
@echo " update Update dependencies' source code"
|
@echo " update Update dependencies source code"
|
||||||
@echo " clean Clean binary files"
|
@echo " clean Clean binary files"
|
||||||
@echo " distclean Clean completely the development files"
|
@echo " distclean Clean completely the development files"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo " install Install ejabberd to /usr/local"
|
@echo " install Install ejabberd to /usr/local"
|
||||||
|
@echo " install-rel Install ejabberd to /usr/local (using release)"
|
||||||
@echo " uninstall Uninstall ejabberd (buggy)"
|
@echo " uninstall Uninstall ejabberd (buggy)"
|
||||||
|
@echo " uninstall-rel Uninstall ejabberd (using release)"
|
||||||
@echo " uninstall-all Uninstall also configuration, logs, mnesia... (buggy)"
|
@echo " uninstall-all Uninstall also configuration, logs, mnesia... (buggy)"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo " rel Build a production release"
|
@echo " prod Build a production release"
|
||||||
@echo " dev Build a development release"
|
@echo " dev Build a development release"
|
||||||
@echo " relive Start a live ejabberd in _build/relive/"
|
@echo " relive Start a live ejabberd in _build/relive/"
|
||||||
@echo ""
|
@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 " options Generate ejabberd_option.erl"
|
||||||
@echo " translations Extract translation files (requires --enable-tools)"
|
@echo " translations Extract translation files"
|
||||||
@echo " tags Generate tags file for text editors"
|
@echo " TAGS Generate tags file for text editors"
|
||||||
|
@echo ""
|
||||||
|
@echo " format Format source code using rebar3_format"
|
||||||
|
@echo " indent Indent source code using erlang-mode [emacs]"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo " dialyzer Run Dialyzer static analyzer"
|
@echo " dialyzer Run Dialyzer static analyzer"
|
||||||
|
@echo " elvis Run Elvis source code style reviewer [rebar3]"
|
||||||
@echo " hooks Run hooks validator"
|
@echo " hooks Run hooks validator"
|
||||||
@echo " test Run Common Tests suite"
|
@echo " test Run Common Tests suite [rebar3]"
|
||||||
@echo " xref Run cross reference analysis"
|
@echo " test-eunit Run EUnit suite [rebar3]"
|
||||||
|
@echo " test-<group> Run Common Test suite for specific group only [rebar3]"
|
||||||
|
@echo " xref Run cross reference analysis [rebar3]"
|
||||||
|
|
||||||
|
#.
|
||||||
|
#'
|
||||||
|
# vim: foldmarker=#',#. foldmethod=marker:
|
||||||
|
|
70
README.md
70
README.md
|
@ -1,36 +1,36 @@
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="https://www.process-one.net/wp-content/uploads/2022/05/ejabberd-logo-rounded-index.png"
|
<img src="https://www.process-one.net/wp-content/uploads/2022/05/ejabberd-logo-rounded-index.png">
|
||||||
height="216">
|
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/processone/ejabberd/tags" alt="GitHub tag (latest SemVer)">
|
<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>
|
<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">
|
<a href="https://hex.pm/packages/ejabberd" alt="Hex version">
|
||||||
<img src="https://img.shields.io/hexpm/v/ejabberd.svg" /></a>
|
<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">
|
<a href="https://formulae.brew.sh/formula/ejabberd" alt="homebrew version">
|
||||||
<img src="https://img.shields.io/homebrew/v/ejabberd" /></a>
|
<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 />
|
<br />
|
||||||
<a href="https://github.com/processone/ejabberd/actions/workflows/ci.yml" alt="CI">
|
<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>
|
<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">
|
<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">
|
<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>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
[ejabberd][im] is an open-source,
|
[ejabberd][im] is an open-source,
|
||||||
robust, scalable and extensible realtime platform built using [Erlang/OTP][erlang],
|
robust, scalable and extensible realtime platform built using [Erlang/OTP][erlang],
|
||||||
that includes [XMPP][xmpp] Server, [MQTT][mqtt] Broker and [SIP][sip] Service.
|
that includes [XMPP][xmpp] Server, [MQTT][mqtt] Broker and [SIP][sip] Service.
|
||||||
|
|
||||||
Check the features in [ejabberd.im][im], [ejabberd Docs][features],
|
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
|
Installation
|
||||||
------------
|
------------
|
||||||
|
@ -38,12 +38,16 @@ Installation
|
||||||
There are several ways to install ejabberd:
|
There are several ways to install ejabberd:
|
||||||
|
|
||||||
- Source code: compile yourself, see [COMPILE](COMPILE.md)
|
- Source code: compile yourself, see [COMPILE](COMPILE.md)
|
||||||
- Installers from [ejabberd GitHub Releases][releases] (run/deb/rpm for x64 and arm64)
|
- Installers:
|
||||||
- Container image from [ejabberd Docker Hub][hubecs], see [ecs README][docker-ecs-readme] (for x64)
|
- [ProcessOne Download Page][p1download] or [GitHub Releases][releases] for releases.
|
||||||
- Container image from [ejabberd Github Packages][packages], see [CONTAINER](CONTAINER.md) (for x64 and arm64)
|
- [GitHub Actions](https://github.com/processone/ejabberd/actions/workflows/installers.yml) for master branch (`run`/`deb`/`rpm` for `x64` and `arm64`)
|
||||||
|
- Docker Containers:
|
||||||
|
- `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 your [Operating System package][osp]
|
||||||
- Using the [Homebrew][homebrew] package manager
|
- Using the [Homebrew][homebrew] package manager
|
||||||
|
|
||||||
|
More info can be found in the `Installation` part of [ejabberd Docs](https://docs.ejabberd.im/admin/install/).
|
||||||
|
|
||||||
Documentation
|
Documentation
|
||||||
-------------
|
-------------
|
||||||
|
@ -60,7 +64,6 @@ Once ejabberd is installed, try:
|
||||||
ejabberdctl help
|
ejabberdctl help
|
||||||
man ejabberd.yml
|
man ejabberd.yml
|
||||||
|
|
||||||
|
|
||||||
Development
|
Development
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
|
@ -72,31 +75,37 @@ or in your local machine as explained in [Localization][localization].
|
||||||
|
|
||||||
Documentation for developers is available in [ejabberd docs: Developers][docs-dev].
|
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,
|
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].
|
or some other method from [ProcessOne Contact][p1contact].
|
||||||
|
|
||||||
For commercial offering and support, including [ejabberd Business Edition][p1home]
|
For commercial offering and support, including [ejabberd Business Edition][p1home]
|
||||||
and [Fluux (ejabberd in the Cloud)][fluux], please check [ProcessOne ejabberd page][p1home].
|
and [Fluux (ejabberd in the Cloud)][fluux], please check [ProcessOne ejabberd page][p1home].
|
||||||
|
|
||||||
|
Security
|
||||||
|
--------
|
||||||
|
|
||||||
|
For information on how to report security vulnerabilities, please refer to the [SECURITY.md](SECURITY.md) file. It contains guidelines on how to report vulnerabilities privately and securely, ensuring that any issues are addressed in a timely and confidential manner.
|
||||||
|
|
||||||
Community
|
Community
|
||||||
---------
|
---------
|
||||||
|
|
||||||
There are several places to get in touch with other ejabberd developers and administrators:
|
There are several places to get in touch with other ejabberd developers and administrators:
|
||||||
|
|
||||||
- [ejabberd XMPP chatroom][muc]: ejabberd@conference.process-one.net
|
- ejabberd XMPP chatroom: [ejabberd@conference.process-one.net][muc]
|
||||||
- [Mailing list][list]
|
|
||||||
- [GitHub Discussions][discussions]
|
- [GitHub Discussions][discussions]
|
||||||
- [Stack Overflow][stackoverflow]
|
- [Stack Overflow][stackoverflow]
|
||||||
|
|
||||||
|
|
||||||
License
|
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.
|
- [ejabberd translations](https://github.com/processone/ejabberd-po/) under __MIT License__.
|
||||||
|
|
||||||
|
|
||||||
[discussions]: https://github.com/processone/ejabberd/discussions
|
[discussions]: https://github.com/processone/ejabberd/discussions
|
||||||
[docker-ecs-readme]: https://github.com/processone/docker-ejabberd/tree/master/ecs#readme
|
[docker-ecs-readme]: https://github.com/processone/docker-ejabberd/tree/master/ecs#readme
|
||||||
|
@ -105,22 +114,23 @@ and [ejabberd translations](https://github.com/processone/ejabberd-po/) under MI
|
||||||
[erlang]: https://www.erlang.org/
|
[erlang]: https://www.erlang.org/
|
||||||
[features]: https://docs.ejabberd.im/admin/introduction/
|
[features]: https://docs.ejabberd.im/admin/introduction/
|
||||||
[fluux]: https://fluux.io/
|
[fluux]: https://fluux.io/
|
||||||
[github]: https://github.com/processone/ejabberd
|
[homebrew]: https://docs.ejabberd.im/admin/install/homebrew/
|
||||||
[homebrew]: https://docs.ejabberd.im/admin/installation/#homebrew
|
|
||||||
[hubecs]: https://hub.docker.com/r/ejabberd/ecs/
|
[hubecs]: https://hub.docker.com/r/ejabberd/ecs/
|
||||||
[im]: https://ejabberd.im/
|
[im]: https://www.ejabberd.im/
|
||||||
[issues]: https://github.com/processone/ejabberd/issues
|
[issues]: https://github.com/processone/ejabberd/issues
|
||||||
[list]: https://lists.jabber.ru/mailman/listinfo/ejabberd
|
|
||||||
[localization]: https://docs.ejabberd.im/developer/extending-ejabberd/localization/
|
[localization]: https://docs.ejabberd.im/developer/extending-ejabberd/localization/
|
||||||
[mqtt]: https://mqtt.org/
|
[mqtt]: https://mqtt.org/
|
||||||
[muc]: xmpp:ejabberd@conference.process-one.net
|
[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/
|
[p1contact]: https://www.process-one.net/contact/
|
||||||
[p1home]: https://www.process-one.net/en/ejabberd/
|
[p1download]: https://www.process-one.net/download/ejabberd/
|
||||||
|
[p1home]: https://www.process-one.net/ejabberd/
|
||||||
[packages]: https://github.com/processone/ejabberd/pkgs/container/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
|
[releases]: https://github.com/processone/ejabberd/releases
|
||||||
[sip]: https://en.wikipedia.org/wiki/Session_Initiation_Protocol
|
[sip]: https://en.wikipedia.org/wiki/Session_Initiation_Protocol
|
||||||
[stackoverflow]: https://stackoverflow.com/questions/tagged/ejabberd?sort=newest
|
[stackoverflow]: https://stackoverflow.com/questions/tagged/ejabberd?sort=newest
|
||||||
[weblate]: https://hosted.weblate.org/projects/ejabberd/ejabberd-po/
|
[weblate]: https://hosted.weblate.org/projects/ejabberd/ejabberd-po/
|
||||||
[xeps]: https://www.process-one.net/en/ejabberd/protocols/
|
[xeps]: https://www.process-one.net/ejabberd-features/
|
||||||
[xmpp]: https://xmpp.org/
|
[xmpp]: https://xmpp.org/
|
||||||
|
[xmppej]: https://xmpp.org/software/servers/ejabberd/
|
||||||
|
|
45
SECURITY.md
Normal file
45
SECURITY.md
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Supported Versions
|
||||||
|
|
||||||
|
We recommend that all users always use the latest version of ejabberd.
|
||||||
|
|
||||||
|
To ensure the best experience and security, upgrade to the latest version available on [this repo](https://github.com/processone/ejabberd).
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
### Private Reporting
|
||||||
|
|
||||||
|
**Preferred Method**: Use GitHub's private vulnerability reporting system by clicking the "Report a Vulnerability" button in the [Security tab of this repository](https://github.com/processone/ejabberd/security). This ensures your report is securely transmitted and tracked.
|
||||||
|
|
||||||
|
**Alternative**: If you cannot use the GitHub system, send an email to **`contact@process-one.net`** with the following details:
|
||||||
|
|
||||||
|
- A clear description of the vulnerability.
|
||||||
|
- Steps to reproduce the issue.
|
||||||
|
- Any potential impact or exploitation scenarios.
|
||||||
|
|
||||||
|
### Response Time
|
||||||
|
|
||||||
|
We aim to acknowledge receipt of your report within 72 hours. You can expect regular updates on the status of your report.
|
||||||
|
|
||||||
|
### Resolution
|
||||||
|
|
||||||
|
If the vulnerability is confirmed, we will work on a patch or mitigation strategy.
|
||||||
|
We will notify you once the issue is resolved and coordinate a public disclosure if needed.
|
||||||
|
|
||||||
|
### Acknowledgements
|
||||||
|
|
||||||
|
We value and appreciate the contributions of security researchers and community members.
|
||||||
|
If you wish, we are happy to acknowledge your efforts publicly by listing your name (or alias) below in this document.
|
||||||
|
Please let us know if you would like to be recognized when reporting the vulnerability.
|
||||||
|
|
||||||
|
## Public Discussion
|
||||||
|
|
||||||
|
For general inquiries or discussions about the project’s security, feel free to chat with us here:
|
||||||
|
|
||||||
|
- XMPP room: `ejabberd@conference.process-one.net`
|
||||||
|
- [GitHub Discussions](https://github.com/processone/ejabberd/discussions)
|
||||||
|
|
||||||
|
However, please note that if the issue is **critical** or potentially exploitable, **do not share it publicly**. Instead, we strongly recommend you contact the maintainers directly via the private reporting methods outlined above to ensure a secure and timely response.
|
||||||
|
|
||||||
|
Thank you for helping us improve the security of ejabberd!
|
|
@ -8,6 +8,8 @@ end
|
||||||
rootpath = System.get_env("RELEASE_ROOT", rootdefault)
|
rootpath = System.get_env("RELEASE_ROOT", rootdefault)
|
||||||
config :ejabberd,
|
config :ejabberd,
|
||||||
file: Path.join(rootpath, "conf/ejabberd.yml"),
|
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,
|
config :mnesia,
|
||||||
dir: Path.join(rootpath, 'database/')
|
dir: Path.join(rootpath, "database/")
|
||||||
|
config :exsync,
|
||||||
|
reload_callback: {:ejabberd_admin, :update, []}
|
||||||
|
|
80
configure.ac
80
configure.ac
|
@ -2,15 +2,26 @@
|
||||||
# Process this file with autoconf to produce a configure script.
|
# Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
AC_PREREQ(2.59)
|
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])
|
AC_INIT(ejabberd, m4_esyscmd([echo `git describe --tags 2>/dev/null || echo 25.08` | sed 's/-g.*//;s/-/./' | tr -d '\012']), [ejabberd@process-one.net], [ejabberd])
|
||||||
REQUIRE_ERLANG_MIN="8.3 (Erlang/OTP 19.3)"
|
|
||||||
|
AC_ARG_WITH(min-erlang,
|
||||||
|
AS_HELP_STRING([--with-min-erlang=version],[set minimal required erlang version, default to OTP25]),
|
||||||
|
[if test "X$withval" = "X"; then
|
||||||
|
REQUIRE_ERLANG_MIN="13.0 (Erlang/OTP 25.0)"
|
||||||
|
else
|
||||||
|
REQUIRE_ERLANG_MIN="$withval"
|
||||||
|
fi
|
||||||
|
], [REQUIRE_ERLANG_MIN="13.0 (Erlang/OTP 25.0)"])
|
||||||
|
|
||||||
REQUIRE_ERLANG_MAX="100.0.0 (No Max)"
|
REQUIRE_ERLANG_MAX="100.0.0 (No Max)"
|
||||||
|
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
|
|
||||||
# Checks for programs.
|
# Checks for programs.
|
||||||
AC_PROG_MAKE_SET
|
AC_PROG_MAKE_SET
|
||||||
|
AC_PROG_AWK
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
|
AC_PROG_MKDIR_P
|
||||||
AC_PROG_SED
|
AC_PROG_SED
|
||||||
|
|
||||||
if test "x$GCC" = "xyes"; then
|
if test "x$GCC" = "xyes"; then
|
||||||
|
@ -28,18 +39,42 @@ fi
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_ARG_WITH(rebar,
|
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
|
[if test "$withval" = "yes" -o "$withval" = "no" -o "X$with_rebar" = "X"; then
|
||||||
rebar="rebar"
|
rebar="rebar3"
|
||||||
else
|
else
|
||||||
rebar="$with_rebar"
|
rebar="$with_rebar"
|
||||||
fi
|
fi
|
||||||
], [rebar="rebar"])
|
], [rebar="unconfigured"])
|
||||||
|
|
||||||
AC_PATH_TOOL(ERL, erl, , [${extra_erl_path}$PATH])
|
AC_PATH_TOOL(ERL, erl, , [${extra_erl_path}$PATH])
|
||||||
AC_PATH_TOOL(ERLC, erlc, , [${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(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_ERL
|
||||||
AC_ERLANG_NEED_ERLC
|
AC_ERLANG_NEED_ERLC
|
||||||
|
|
||||||
|
@ -84,7 +119,7 @@ AC_ARG_ENABLE(debug,
|
||||||
esac],[if test "x$debug" = "x"; then debug=true; fi])
|
esac],[if test "x$debug" = "x"; then debug=true; fi])
|
||||||
|
|
||||||
AC_ARG_ENABLE(elixir,
|
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
|
[case "${enableval}" in
|
||||||
yes) elixir=true ;;
|
yes) elixir=true ;;
|
||||||
no) elixir=false ;;
|
no) elixir=false ;;
|
||||||
|
@ -112,7 +147,7 @@ esac],[full_xml=false])
|
||||||
|
|
||||||
ENABLEGROUP=""
|
ENABLEGROUP=""
|
||||||
AC_ARG_ENABLE(group,
|
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
|
[case "${enableval}" in
|
||||||
yes) ENABLEGROUP=`groups |head -n 1` ;;
|
yes) ENABLEGROUP=`groups |head -n 1` ;;
|
||||||
no) ENABLEGROUP="" ;;
|
no) ENABLEGROUP="" ;;
|
||||||
|
@ -237,7 +272,7 @@ AC_ARG_ENABLE(system_deps,
|
||||||
esac],[if test "x$system_deps" = "x"; then system_deps=false; fi])
|
esac],[if test "x$system_deps" = "x"; then system_deps=false; fi])
|
||||||
|
|
||||||
AC_ARG_ENABLE(tools,
|
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
|
[case "${enableval}" in
|
||||||
yes) tools=true ;;
|
yes) tools=true ;;
|
||||||
no) tools=false ;;
|
no) tools=false ;;
|
||||||
|
@ -246,7 +281,7 @@ esac],[if test "x$tools" = "x"; then tools=false; fi])
|
||||||
|
|
||||||
ENABLEUSER=""
|
ENABLEUSER=""
|
||||||
AC_ARG_ENABLE(user,
|
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
|
[case "${enableval}" in
|
||||||
yes) ENABLEUSER=`whoami` ;;
|
yes) ENABLEUSER=`whoami` ;;
|
||||||
no) ENABLEUSER="" ;;
|
no) ENABLEUSER="" ;;
|
||||||
|
@ -280,6 +315,8 @@ case "`uname`" in
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
AC_MSG_RESULT([build tool to use (change using --with-rebar): $rebar])
|
||||||
|
|
||||||
AC_SUBST(roster_gateway_workaround)
|
AC_SUBST(roster_gateway_workaround)
|
||||||
AC_SUBST(new_sql_schema)
|
AC_SUBST(new_sql_schema)
|
||||||
AC_SUBST(full_xml)
|
AC_SUBST(full_xml)
|
||||||
|
@ -305,3 +342,28 @@ AC_SUBST(CPPFLAGS)
|
||||||
AC_SUBST(LDFLAGS)
|
AC_SUBST(LDFLAGS)
|
||||||
|
|
||||||
AC_OUTPUT
|
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"])
|
||||||
|
])
|
||||||
|
|
849
ejabberd.doap
Normal file
849
ejabberd.doap
Normal file
|
@ -0,0 +1,849 @@
|
||||||
|
<?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/download/ejabberd/"/>
|
||||||
|
<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>0.5.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>0.5.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>complete</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>0.5.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>0.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>0.7.5</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>0.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>complete</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>0.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>0.5.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note>mod_muc</xmpp:note>
|
||||||
|
</xmpp:SupportedXep>
|
||||||
|
</implements>
|
||||||
|
<implements>
|
||||||
|
<xmpp:SupportedXep>
|
||||||
|
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0048.html"/>
|
||||||
|
<xmpp:version>1.2</xmpp:version>
|
||||||
|
<xmpp:since>0.5.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note>mod_pubsub</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>0.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>1.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>0.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>0.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>2.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>0.5.0</xmpp:since>
|
||||||
|
<xmpp:status>partial</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>2.0.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>0.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>17.03</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note>mod_legacy_auth</xmpp:note>
|
||||||
|
</xmpp:SupportedXep>
|
||||||
|
</implements>
|
||||||
|
<implements>
|
||||||
|
<xmpp:SupportedXep>
|
||||||
|
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0082.html"/>
|
||||||
|
<xmpp:version>1.1.1</xmpp:version>
|
||||||
|
<xmpp:since>2.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note></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>2.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>0.5.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>0.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>0.5.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>0.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>2.1.4</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>16.12</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>partial</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>1.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>17.09</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>complete</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>2.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>2.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>16.01</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>2.0.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>17.12</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>1.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note>ejabberd_auth_anonymous</xmpp:note>
|
||||||
|
</xmpp:SupportedXep>
|
||||||
|
</implements>
|
||||||
|
<implements>
|
||||||
|
<xmpp:SupportedXep>
|
||||||
|
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0178.html"/>
|
||||||
|
<xmpp:version>1.1</xmpp:version>
|
||||||
|
<xmpp:since>17.03</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note></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>17.03</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>2.1.7</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>complete</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>2.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>2.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>2.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>1.1.2</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>16.12</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note>ejabberd_bosh</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>complete</xmpp:status>
|
||||||
|
<xmpp:note>mod_stun_disco</xmpp:note>
|
||||||
|
</xmpp:SupportedXep>
|
||||||
|
</implements>
|
||||||
|
<implements>
|
||||||
|
<xmpp:SupportedXep>
|
||||||
|
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0220.html"/>
|
||||||
|
<xmpp:version>1.1.1</xmpp:version>
|
||||||
|
<xmpp:since>17.03</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note>mod_s2s_dialback</xmpp:note>
|
||||||
|
</xmpp:SupportedXep>
|
||||||
|
</implements>
|
||||||
|
<implements>
|
||||||
|
<xmpp:SupportedXep>
|
||||||
|
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0223.html"/>
|
||||||
|
<xmpp:version>1.1.1</xmpp:version>
|
||||||
|
<xmpp:since>2.0.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note>mod_pubsub</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>2.1.0</xmpp:since>
|
||||||
|
<xmpp:status>partial</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>2.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>2.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note>mod_roster</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>2.1.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>0.5.0</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note>mod_muc</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>2.1.3</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>1.0.1</xmpp:version>
|
||||||
|
<xmpp:since>13.06</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note>mod_carboncopy</xmpp:note>
|
||||||
|
</xmpp:SupportedXep>
|
||||||
|
</implements>
|
||||||
|
<implements>
|
||||||
|
<xmpp:SupportedXep>
|
||||||
|
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0288.html"/>
|
||||||
|
<xmpp:version>1.0.1</xmpp:version>
|
||||||
|
<xmpp:since>24.10</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note>mod_s2s_bidi</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>complete</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.3.1</xmpp:version>
|
||||||
|
<xmpp:since>21.12</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note>mod_muc_room, 0.3.1 since 25.xx</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>complete</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>16.01</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>complete</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>complete</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.4.1</xmpp:version>
|
||||||
|
<xmpp:since>24.10</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>complete</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>15.09</xmpp:since>
|
||||||
|
<xmpp:status>complete</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.3.0</xmpp:version>
|
||||||
|
<xmpp:since>15.10</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>17.09</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>complete</xmpp:status>
|
||||||
|
<xmpp:note>mod_mix</xmpp:note>
|
||||||
|
</xmpp:SupportedXep>
|
||||||
|
</implements>
|
||||||
|
<implements>
|
||||||
|
<xmpp:SupportedXep>
|
||||||
|
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0384.html"/>
|
||||||
|
<xmpp:version>0.8.3</xmpp:version>
|
||||||
|
<xmpp:since>21.12</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note>node_pep</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>complete</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>complete</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>complete</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>complete</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>19.02</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>complete</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>complete</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>complete</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.2</xmpp:version>
|
||||||
|
<xmpp:since>24.02</xmpp:since>
|
||||||
|
<xmpp:status>partial</xmpp:status>
|
||||||
|
<xmpp:note>mod_mam, Tombstones not implemented</xmpp:note>
|
||||||
|
</xmpp:SupportedXep>
|
||||||
|
</implements>
|
||||||
|
<implements>
|
||||||
|
<xmpp:SupportedXep>
|
||||||
|
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0425.html"/>
|
||||||
|
<xmpp:version>0.3.0</xmpp:version>
|
||||||
|
<xmpp:since>24.06</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note>mod_mam</xmpp:note>
|
||||||
|
</xmpp:SupportedXep>
|
||||||
|
</implements>
|
||||||
|
<implements>
|
||||||
|
<xmpp:SupportedXep>
|
||||||
|
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0431.html"/>
|
||||||
|
<xmpp:version>0.2.0</xmpp:version>
|
||||||
|
<xmpp:since>24.12</xmpp:since>
|
||||||
|
<xmpp:status>complete</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>complete</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>15.06</xmpp:since>
|
||||||
|
<xmpp:status>complete</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.4.0</xmpp:version>
|
||||||
|
<xmpp:since>24.02</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note>, 0.4.0 since 25.03</xmpp:note>
|
||||||
|
</xmpp:SupportedXep>
|
||||||
|
</implements>
|
||||||
|
<implements>
|
||||||
|
<xmpp:SupportedXep>
|
||||||
|
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0480.html"/>
|
||||||
|
<xmpp:version>0.2.0</xmpp:version>
|
||||||
|
<xmpp:since>24.10</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note>mod_scram_upgrade</xmpp:note>
|
||||||
|
</xmpp:SupportedXep>
|
||||||
|
</implements>
|
||||||
|
<implements>
|
||||||
|
<xmpp:SupportedXep>
|
||||||
|
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0484.html"/>
|
||||||
|
<xmpp:version>0.2.0</xmpp:version>
|
||||||
|
<xmpp:since>24.12</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note>mod_auth_fast</xmpp:note>
|
||||||
|
</xmpp:SupportedXep>
|
||||||
|
</implements>
|
||||||
|
<implements>
|
||||||
|
<xmpp:SupportedXep>
|
||||||
|
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0485.html"/>
|
||||||
|
<xmpp:version>0.1.1</xmpp:version>
|
||||||
|
<xmpp:since>25.07</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note>mod_pubsub_serverinfo</xmpp:note>
|
||||||
|
</xmpp:SupportedXep>
|
||||||
|
</implements>
|
||||||
|
<implements>
|
||||||
|
<xmpp:SupportedXep>
|
||||||
|
<xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0486.html"/>
|
||||||
|
<xmpp:version>0.1.0</xmpp:version>
|
||||||
|
<xmpp:since>24.07</xmpp:since>
|
||||||
|
<xmpp:status>complete</xmpp:status>
|
||||||
|
<xmpp:note>mod_muc</xmpp:note>
|
||||||
|
</xmpp:SupportedXep>
|
||||||
|
</implements>
|
||||||
|
</Project>
|
||||||
|
</rdf:RDF>
|
|
@ -9,7 +9,6 @@ Group=@installuser@
|
||||||
LimitNOFILE=65536
|
LimitNOFILE=65536
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
RestartSec=5
|
RestartSec=5
|
||||||
WatchdogSec=30
|
|
||||||
ExecStart=@ctlscriptpath@/ejabberdctl foreground
|
ExecStart=@ctlscriptpath@/ejabberdctl foreground
|
||||||
ExecStop=/bin/sh -c '@ctlscriptpath@/ejabberdctl stop && @ctlscriptpath@/ejabberdctl stopped'
|
ExecStop=/bin/sh -c '@ctlscriptpath@/ejabberdctl stop && @ctlscriptpath@/ejabberdctl stopped'
|
||||||
ExecReload=@ctlscriptpath@/ejabberdctl reload_config
|
ExecReload=@ctlscriptpath@/ejabberdctl reload_config
|
||||||
|
|
|
@ -36,17 +36,17 @@ listen:
|
||||||
-
|
-
|
||||||
port: 5223
|
port: 5223
|
||||||
ip: "::"
|
ip: "::"
|
||||||
tls: true
|
|
||||||
module: ejabberd_c2s
|
module: ejabberd_c2s
|
||||||
max_stanza_size: 262144
|
max_stanza_size: 262144
|
||||||
shaper: c2s_shaper
|
shaper: c2s_shaper
|
||||||
access: c2s
|
access: c2s
|
||||||
starttls_required: true
|
tls: true
|
||||||
-
|
-
|
||||||
port: 5269
|
port: 5269
|
||||||
ip: "::"
|
ip: "::"
|
||||||
module: ejabberd_s2s_in
|
module: ejabberd_s2s_in
|
||||||
max_stanza_size: 524288
|
max_stanza_size: 524288
|
||||||
|
shaper: s2s_shaper
|
||||||
-
|
-
|
||||||
port: 5443
|
port: 5443
|
||||||
ip: "::"
|
ip: "::"
|
||||||
|
@ -67,7 +67,7 @@ listen:
|
||||||
/admin: ejabberd_web_admin
|
/admin: ejabberd_web_admin
|
||||||
/.well-known/acme-challenge: ejabberd_acme
|
/.well-known/acme-challenge: ejabberd_acme
|
||||||
-
|
-
|
||||||
port: 3478
|
port: 5478
|
||||||
ip: "::"
|
ip: "::"
|
||||||
transport: udp
|
transport: udp
|
||||||
module: ejabberd_stun
|
module: ejabberd_stun
|
||||||
|
@ -111,11 +111,19 @@ access_rules:
|
||||||
|
|
||||||
api_permissions:
|
api_permissions:
|
||||||
"console commands":
|
"console commands":
|
||||||
from:
|
from: ejabberd_ctl
|
||||||
- ejabberd_ctl
|
|
||||||
who: all
|
who: all
|
||||||
what: "*"
|
what: "*"
|
||||||
"admin access":
|
"webadmin commands":
|
||||||
|
from: ejabberd_web_admin
|
||||||
|
who: admin
|
||||||
|
what: "*"
|
||||||
|
"adhoc commands":
|
||||||
|
from: mod_adhoc_api
|
||||||
|
who: admin
|
||||||
|
what: "*"
|
||||||
|
"http access":
|
||||||
|
from: mod_http_api
|
||||||
who:
|
who:
|
||||||
access:
|
access:
|
||||||
allow:
|
allow:
|
||||||
|
@ -156,6 +164,7 @@ shaper_rules:
|
||||||
|
|
||||||
modules:
|
modules:
|
||||||
mod_adhoc: {}
|
mod_adhoc: {}
|
||||||
|
mod_adhoc_api: {}
|
||||||
mod_admin_extra: {}
|
mod_admin_extra: {}
|
||||||
mod_announce:
|
mod_announce:
|
||||||
access: announce
|
access: announce
|
||||||
|
@ -170,7 +179,7 @@ modules:
|
||||||
mod_fail2ban: {}
|
mod_fail2ban: {}
|
||||||
mod_http_api: {}
|
mod_http_api: {}
|
||||||
mod_http_upload:
|
mod_http_upload:
|
||||||
put_url: https://@HOST@:5443/upload
|
put_url: https://@HOST_URL_ENCODE@:5443/upload
|
||||||
custom_headers:
|
custom_headers:
|
||||||
"Access-Control-Allow-Origin": "https://@HOST@"
|
"Access-Control-Allow-Origin": "https://@HOST@"
|
||||||
"Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
|
"Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
|
||||||
|
@ -196,6 +205,7 @@ modules:
|
||||||
default_room_options:
|
default_room_options:
|
||||||
mam: true
|
mam: true
|
||||||
mod_muc_admin: {}
|
mod_muc_admin: {}
|
||||||
|
mod_muc_occupantid: {}
|
||||||
mod_offline:
|
mod_offline:
|
||||||
access_max_user_messages: max_user_offline_messages
|
access_max_user_messages: max_user_offline_messages
|
||||||
mod_ping: {}
|
mod_ping: {}
|
||||||
|
@ -224,6 +234,7 @@ modules:
|
||||||
ip_access: trusted_network
|
ip_access: trusted_network
|
||||||
mod_roster:
|
mod_roster:
|
||||||
versioning: true
|
versioning: true
|
||||||
|
mod_s2s_bidi: {}
|
||||||
mod_s2s_dialback: {}
|
mod_s2s_dialback: {}
|
||||||
mod_shared_roster: {}
|
mod_shared_roster: {}
|
||||||
mod_stream_mgmt:
|
mod_stream_mgmt:
|
||||||
|
|
|
@ -108,10 +108,11 @@
|
||||||
#.
|
#.
|
||||||
#' ERL_OPTIONS: Additional Erlang options
|
#' ERL_OPTIONS: Additional Erlang options
|
||||||
#
|
#
|
||||||
# The next variable allows to specify additional options passed to erlang while
|
# The next variable allows to specify additional options passed to
|
||||||
# starting ejabberd. Some useful options are -noshell, -detached, -heart. When
|
# all commands using erlang interpreter. This applies to starting
|
||||||
# ejabberd is started from an init.d script options -noshell and -detached are
|
# ejabberd server itself but also auxiliary commands like for example
|
||||||
# added implicitly. See erl(1) for more info.
|
# 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
|
# It might be useful to add "-pa /usr/local/lib/ejabberd/ebin" if you
|
||||||
# want to add local modules in this path.
|
# want to add local modules in this path.
|
||||||
|
@ -120,6 +121,20 @@
|
||||||
#
|
#
|
||||||
#ERL_OPTIONS=""
|
#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
|
#' ERLANG_NODE: Erlang node name
|
||||||
#
|
#
|
||||||
|
@ -183,6 +198,17 @@
|
||||||
#
|
#
|
||||||
#CONTRIB_MODULES_CONF_DIR=/etc/ejabberd/modules
|
#CONTRIB_MODULES_CONF_DIR=/etc/ejabberd/modules
|
||||||
|
|
||||||
|
#.
|
||||||
|
#' CTL_OVER_HTTP: Path to ejabberdctl HTTP listener socket
|
||||||
|
#
|
||||||
|
# To speedup ejabberdctl execution time for ejabberd commands,
|
||||||
|
# you can setup an ejabberd_http listener with ejabberd_ctl handling requests,
|
||||||
|
# listening in a unix domain socket.
|
||||||
|
#
|
||||||
|
# Default: disabled
|
||||||
|
#
|
||||||
|
#CTL_OVER_HTTP=sockets/ctl_over_http.sock
|
||||||
|
|
||||||
#.
|
#.
|
||||||
#'
|
#'
|
||||||
# vim: foldmarker=#',#. foldmethod=marker:
|
# vim: foldmarker=#',#. foldmethod=marker:
|
||||||
|
|
|
@ -15,8 +15,8 @@ SCRIPT_DIR="$(cd "$(dirname "$SCRIPT")" && pwd -P)"
|
||||||
# shellcheck disable=SC2034
|
# shellcheck disable=SC2034
|
||||||
ERTS_VSN="{{erts_vsn}}"
|
ERTS_VSN="{{erts_vsn}}"
|
||||||
ERL="{{erl}}"
|
ERL="{{erl}}"
|
||||||
IEX="{{bindir}}/iex"
|
|
||||||
EPMD="{{epmd}}"
|
EPMD="{{epmd}}"
|
||||||
|
IEX="{{iexpath}}"
|
||||||
INSTALLUSER="{{installuser}}"
|
INSTALLUSER="{{installuser}}"
|
||||||
|
|
||||||
# check the proper system user is used
|
# check the proper system user is used
|
||||||
|
@ -66,18 +66,26 @@ done
|
||||||
# shellcheck source=ejabberdctl.cfg.example
|
# shellcheck source=ejabberdctl.cfg.example
|
||||||
[ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH"
|
[ -f "$EJABBERDCTL_CONFIG_PATH" ] && . "$EJABBERDCTL_CONFIG_PATH"
|
||||||
[ -n "$ERLANG_NODE_ARG" ] && ERLANG_NODE="$ERLANG_NODE_ARG"
|
[ -n "$ERLANG_NODE_ARG" ] && ERLANG_NODE="$ERLANG_NODE_ARG"
|
||||||
|
[ "$ERLANG_NODE" = "${ERLANG_NODE%@*}" ] && ERLANG_NODE="$ERLANG_NODE@$(hostname -s)"
|
||||||
[ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && S="-s"
|
[ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && S="-s"
|
||||||
: "${SPOOL_DIR:="{{spool_dir}}"}"
|
: "${SPOOL_DIR:="{{spool_dir}}"}"
|
||||||
: "${EJABBERD_LOG_PATH:="$LOGS_DIR/ejabberd.log"}"
|
: "${EJABBERD_LOG_PATH:="$LOGS_DIR/ejabberd.log"}"
|
||||||
|
|
||||||
|
# backward support for old mnesia spool dir path
|
||||||
|
: "${SPOOL_DIR_OLD:="$SPOOL_DIR/$ERLANG_NODE"}"
|
||||||
|
[ -r "$SPOOL_DIR_OLD/schema.DAT" ] && [ ! -r "$SPOOL_DIR/schema.DAT" ] && SPOOL_DIR="$SPOOL_DIR_OLD"
|
||||||
|
|
||||||
# define erl parameters
|
# define erl parameters
|
||||||
ERLANG_OPTS="+K $POLL +P $ERL_PROCESSES $ERL_OPTIONS"
|
ERLANG_OPTS="+K $POLL +P $ERL_PROCESSES $ERL_OPTIONS"
|
||||||
if [ -n "$FIREWALL_WINDOW" ] ; then
|
if [ -n "$FIREWALL_WINDOW" ] ; then
|
||||||
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_listen_min ${FIREWALL_WINDOW%-*} inet_dist_listen_max ${FIREWALL_WINDOW#*-}"
|
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_listen_min ${FIREWALL_WINDOW%-*} inet_dist_listen_max ${FIREWALL_WINDOW#*-}"
|
||||||
fi
|
fi
|
||||||
if [ -n "$INET_DIST_INTERFACE" ] ; then
|
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 [ -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"
|
ERLANG_OPTS="$ERLANG_OPTS -kernel inet_dist_use_interface $INET_DIST_INTERFACE2"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
@ -89,11 +97,12 @@ ERL_CRASH_DUMP="$LOGS_DIR"/erl_crash_$(date "+%Y%m%d-%H%M%S").dump
|
||||||
ERL_INETRC="$CONFIG_DIR"/inetrc
|
ERL_INETRC="$CONFIG_DIR"/inetrc
|
||||||
|
|
||||||
# define ejabberd parameters
|
# 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_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_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_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"
|
[ -n "$EJABBERD_OPTS" ] && EJABBERD_OPTS="-ejabberd $EJABBERD_OPTS"
|
||||||
EJABBERD_OPTS="-mnesia dir \"$SPOOL_DIR\" $MNESIA_OPTIONS $EJABBERD_OPTS -s ejabberd"
|
EJABBERD_OPTS="-mnesia dir \"$SPOOL_DIR\" $MNESIA_OPTIONS $EJABBERD_OPTS -s ejabberd"
|
||||||
|
|
||||||
|
@ -121,7 +130,7 @@ set_dist_client()
|
||||||
exec_cmd()
|
exec_cmd()
|
||||||
{
|
{
|
||||||
case $EXEC_CMD in
|
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) "$@" ;;
|
as_current_user) "$@" ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
@ -149,9 +158,11 @@ debugwarning()
|
||||||
echo "Please be extremely cautious with your actions,"
|
echo "Please be extremely cautious with your actions,"
|
||||||
echo "and exit immediately if you are not completely sure."
|
echo "and exit immediately if you are not completely sure."
|
||||||
echo ""
|
echo ""
|
||||||
echo "To detach this shell from ejabberd, press:"
|
echo "To exit and detach this shell from ejabberd, press:"
|
||||||
echo " control+c, control+c"
|
echo " control+g and then q"
|
||||||
echo ""
|
echo ""
|
||||||
|
#vt100 echo "Please do NOT use control+c in this debug shell !"
|
||||||
|
#vt100 echo ""
|
||||||
echo "--------------------------------------------------------------------"
|
echo "--------------------------------------------------------------------"
|
||||||
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
||||||
echo " EJABBERD_BYPASS_WARNINGS=true"
|
echo " EJABBERD_BYPASS_WARNINGS=true"
|
||||||
|
@ -172,8 +183,10 @@ livewarning()
|
||||||
echo "Please be extremely cautious with your actions,"
|
echo "Please be extremely cautious with your actions,"
|
||||||
echo "and exit immediately if you are not completely sure."
|
echo "and exit immediately if you are not completely sure."
|
||||||
echo ""
|
echo ""
|
||||||
echo "To exit this LIVE mode and stop ejabberd, press:"
|
echo "To stop ejabberd gracefully:"
|
||||||
echo " q(). and press the Enter key"
|
echo " ejabberd:stop()."
|
||||||
|
echo "To quit erlang immediately, press:"
|
||||||
|
echo " control+g and then q"
|
||||||
echo ""
|
echo ""
|
||||||
echo "--------------------------------------------------------------------"
|
echo "--------------------------------------------------------------------"
|
||||||
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
echo "To bypass permanently this warning, add to ejabberdctl.cfg the line:"
|
||||||
|
@ -184,6 +197,39 @@ livewarning()
|
||||||
fi
|
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()
|
help()
|
||||||
{
|
{
|
||||||
echo ""
|
echo ""
|
||||||
|
@ -212,16 +258,34 @@ help()
|
||||||
}
|
}
|
||||||
|
|
||||||
# dynamic node name helper
|
# dynamic node name helper
|
||||||
uid()
|
uid() {
|
||||||
{
|
ERTSVERSION="$("$ERL" -version 2>&1 | sed 's|.* \([0-9]*[0-9]\).*|\1|g')"
|
||||||
uuid=$(uuidgen 2>/dev/null)
|
if [ $ERTSVERSION -lt 11 ] ; then # otp 23.0 includes erts 11.0
|
||||||
random=$(awk 'BEGIN { srand(); print int(rand()*32768) }' /dev/null)
|
# Erlang/OTP lower than 23, which doesn's support dynamic node code
|
||||||
[ -z "$uuid" ] && [ -f /proc/sys/kernel/random/uuid ] && uuid=$(cat /proc/sys/kernel/random/uuid)
|
N=1
|
||||||
[ -z "$uuid" ] && uuid=$(printf "%X" "${random:-$$}$(date +%M%S)")
|
PF=$(( $$ % 97 ))
|
||||||
uuid=$(printf '%s' $uuid | sed 's/^\(...\).*$/\1/')
|
while
|
||||||
[ $# -eq 0 ] && echo "${uuid}-${ERLANG_NODE}"
|
case $# in
|
||||||
[ $# -eq 1 ] && echo "${uuid}-${1}-${ERLANG_NODE}"
|
0) NN="${PF}-${N}-${ERLANG_NODE}"
|
||||||
[ $# -eq 2 ] && echo "${uuid}-${1}@${2}"
|
;;
|
||||||
|
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
|
||||||
|
if [ "$ERLANG_NODE" != "${ERLANG_NODE%.*}" ]; then
|
||||||
|
echo "undefined@${ERLANG_NODE#*@}"
|
||||||
|
else
|
||||||
|
echo "undefined"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# stop epmd if there is no other running node
|
# stop epmd if there is no other running node
|
||||||
|
@ -254,6 +318,13 @@ check_start()
|
||||||
# allow sync calls
|
# allow sync calls
|
||||||
wait_status()
|
wait_status()
|
||||||
{
|
{
|
||||||
|
wait_status_node "$ERLANG_NODE" $1 $2 $3
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_status_node()
|
||||||
|
{
|
||||||
|
CONNECT_NODE=$1
|
||||||
|
shift
|
||||||
# args: status try delay
|
# args: status try delay
|
||||||
# return: 0 OK, 1 KO
|
# return: 0 OK, 1 KO
|
||||||
timeout="$2"
|
timeout="$2"
|
||||||
|
@ -264,14 +335,71 @@ wait_status()
|
||||||
if [ $timeout -eq 0 ] ; then
|
if [ $timeout -eq 0 ] ; then
|
||||||
status="$1"
|
status="$1"
|
||||||
else
|
else
|
||||||
exec_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \
|
exec_erl "$(uid ctl)" -hidden -noinput \
|
||||||
-extra "$ERLANG_NODE" $NO_TIMEOUT status > /dev/null
|
-eval 'net_kernel:connect_node('"'$CONNECT_NODE'"')' \
|
||||||
|
-s ejabberd_ctl \
|
||||||
|
-extra "$CONNECT_NODE" $NO_TIMEOUT status > /dev/null
|
||||||
status="$?"
|
status="$?"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
[ $timeout -gt 0 ]
|
[ $timeout -gt 0 ]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
exec_other_command()
|
||||||
|
{
|
||||||
|
exec_other_command_node $ERLANG_NODE "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
exec_other_command_node()
|
||||||
|
{
|
||||||
|
CONNECT_NODE=$1
|
||||||
|
shift
|
||||||
|
if [ -z "$CTL_OVER_HTTP" ] || [ ! -S "$CTL_OVER_HTTP" ] \
|
||||||
|
|| [ ! -x "$(command -v curl)" ] || [ -z "$1" ] || [ "$1" = "help" ] \
|
||||||
|
|| [ "$1" = "mnesia_info_ctl" ]|| [ "$1" = "print_sql_schema" ] ; then
|
||||||
|
exec_erl "$(uid ctl)" -hidden -noinput \
|
||||||
|
-eval 'net_kernel:connect_node('"'$CONNECT_NODE'"')' \
|
||||||
|
-s ejabberd_ctl \
|
||||||
|
-extra "$CONNECT_NODE" $NO_TIMEOUT "$@"
|
||||||
|
result=$?
|
||||||
|
case $result in
|
||||||
|
3) help;;
|
||||||
|
*) :;;
|
||||||
|
esac
|
||||||
|
return $result
|
||||||
|
else
|
||||||
|
exec_ctl_over_http_socket "$@"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
exec_ctl_over_http_socket()
|
||||||
|
{
|
||||||
|
COMMAND=${1}
|
||||||
|
CARGS=""
|
||||||
|
while [ $# -gt 0 ]; do
|
||||||
|
[ -z "$CARGS" ] && CARGS="[" || CARGS="${CARGS}, "
|
||||||
|
CARGS="${CARGS}\"$1\""
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
CARGS="${CARGS}]"
|
||||||
|
TEMPHEADERS=temp-headers.log
|
||||||
|
curl \
|
||||||
|
--unix-socket ${CTL_OVER_HTTP} \
|
||||||
|
--header "Content-Type: application/json" \
|
||||||
|
--header "Accept: application/json" \
|
||||||
|
--data "${CARGS}" \
|
||||||
|
--dump-header ${TEMPHEADERS} \
|
||||||
|
--no-progress-meter \
|
||||||
|
"http://localhost/ctl/${COMMAND}"
|
||||||
|
result=$(sed -n 's/.*status-code: \([0-9]*\).*/\1/p' < $TEMPHEADERS)
|
||||||
|
rm ${TEMPHEADERS}
|
||||||
|
case $result in
|
||||||
|
2|3) exec_other_command help ${COMMAND};;
|
||||||
|
*) :;;
|
||||||
|
esac
|
||||||
|
exit $result
|
||||||
|
}
|
||||||
|
|
||||||
# ensure we can change current directory to SPOOL_DIR
|
# ensure we can change current directory to SPOOL_DIR
|
||||||
[ -d "$SPOOL_DIR" ] || exec_cmd mkdir -p "$SPOOL_DIR"
|
[ -d "$SPOOL_DIR" ] || exec_cmd mkdir -p "$SPOOL_DIR"
|
||||||
cd "$SPOOL_DIR" || {
|
cd "$SPOOL_DIR" || {
|
||||||
|
@ -279,6 +407,103 @@ cd "$SPOOL_DIR" || {
|
||||||
exit 6
|
exit 6
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printe()
|
||||||
|
{
|
||||||
|
printf "\n"
|
||||||
|
printf "\e[1;40;32m==> %s\e[0m\n" "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
## Function copied from tools/make-installers
|
||||||
|
user_agrees()
|
||||||
|
{
|
||||||
|
question="$*"
|
||||||
|
|
||||||
|
if [ -t 0 ]
|
||||||
|
then
|
||||||
|
printe "$question (y/n) [n]"
|
||||||
|
read -r response
|
||||||
|
case "$response" in
|
||||||
|
[Yy]|[Yy][Ee][Ss])
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
[Nn]|[Nn][Oo]|'')
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo 'Please respond with "yes" or "no".'
|
||||||
|
user_agrees "$question"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else # Assume 'yes' if not running interactively.
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
mnesia_change()
|
||||||
|
{
|
||||||
|
ERLANG_NODE_OLD="$1"
|
||||||
|
[ "$ERLANG_NODE_OLD" = "" ] \
|
||||||
|
&& echo "Error: Please provide the old erlang node name, for example:" \
|
||||||
|
&& echo " ejabberdctl mnesia_change ejabberd@oldmachine" \
|
||||||
|
&& exit 1
|
||||||
|
|
||||||
|
SPOOL_DIR_BACKUP=$SPOOL_DIR/$ERLANG_NODE_OLD-backup/
|
||||||
|
OLDFILE=$SPOOL_DIR_BACKUP/$ERLANG_NODE_OLD.backup
|
||||||
|
NEWFILE=$SPOOL_DIR_BACKUP/$ERLANG_NODE.backup
|
||||||
|
|
||||||
|
printe "This changes your mnesia database from node name '$ERLANG_NODE_OLD' to '$ERLANG_NODE'"
|
||||||
|
|
||||||
|
[ -d "$SPOOL_DIR_BACKUP" ] && printe "WARNING! A backup of old node already exists in $SPOOL_DIR_BACKUP"
|
||||||
|
|
||||||
|
if ! user_agrees "Do you want to proceed?"
|
||||||
|
then
|
||||||
|
echo 'Operation aborted.'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
printe "Starting ejabberd with old node name $ERLANG_NODE_OLD ..."
|
||||||
|
exec_erl "$ERLANG_NODE_OLD" $EJABBERD_OPTS -detached
|
||||||
|
wait_status_node $ERLANG_NODE_OLD 0 30 2
|
||||||
|
result=$?
|
||||||
|
case $result in
|
||||||
|
1) echo "There was a problem starting ejabberd with the old erlang node name. " \
|
||||||
|
&& echo "Check for log errors in $EJABBERD_LOG_PATH" \
|
||||||
|
&& exit $result;;
|
||||||
|
*) :;;
|
||||||
|
esac
|
||||||
|
exec_other_command_node $ERLANG_NODE_OLD "status"
|
||||||
|
|
||||||
|
printe "Making backup of old database to file $OLDFILE ..."
|
||||||
|
mkdir $SPOOL_DIR_BACKUP
|
||||||
|
exec_other_command_node $ERLANG_NODE_OLD backup "$OLDFILE"
|
||||||
|
|
||||||
|
printe "Changing node name in new backup file $NEWFILE ..."
|
||||||
|
exec_other_command_node $ERLANG_NODE_OLD mnesia_change_nodename "$ERLANG_NODE_OLD" "$ERLANG_NODE" "$OLDFILE" "$NEWFILE"
|
||||||
|
|
||||||
|
printe "Stopping old ejabberd..."
|
||||||
|
exec_other_command_node $ERLANG_NODE_OLD "stop"
|
||||||
|
wait_status_node $ERLANG_NODE_OLD 3 30 2 && stop_epmd
|
||||||
|
|
||||||
|
printe "Moving old mnesia spool files to backup subdirectory $SPOOL_DIR_BACKUP ..."
|
||||||
|
mv $SPOOL_DIR/*.DAT $SPOOL_DIR_BACKUP
|
||||||
|
mv $SPOOL_DIR/*.DCD $SPOOL_DIR_BACKUP
|
||||||
|
mv $SPOOL_DIR/*.LOG $SPOOL_DIR_BACKUP
|
||||||
|
|
||||||
|
printe "Starting ejabberd with new node name $ERLANG_NODE ..."
|
||||||
|
exec_erl "$ERLANG_NODE" $EJABBERD_OPTS -detached
|
||||||
|
wait_status 0 30 2
|
||||||
|
exec_other_command "status"
|
||||||
|
|
||||||
|
printe "Installing fallback of new mnesia..."
|
||||||
|
exec_other_command install_fallback "$NEWFILE"
|
||||||
|
|
||||||
|
printe "Stopping new ejabberd..."
|
||||||
|
exec_other_command "stop"
|
||||||
|
wait_status 3 30 2 && stop_epmd
|
||||||
|
|
||||||
|
printe "Finished, now you can start ejabberd normally"
|
||||||
|
}
|
||||||
|
|
||||||
# main
|
# main
|
||||||
case $1 in
|
case $1 in
|
||||||
start)
|
start)
|
||||||
|
@ -305,25 +530,31 @@ case $1 in
|
||||||
;;
|
;;
|
||||||
etop)
|
etop)
|
||||||
set_dist_client
|
set_dist_client
|
||||||
exec_erl "$(uid top)" -hidden -node "$ERLANG_NODE" -s etop \
|
exec_erl "$(uid top)" -hidden -remsh "$ERLANG_NODE" -s etop \
|
||||||
-s erlang halt -output text
|
-output text
|
||||||
|
check_etop_result
|
||||||
;;
|
;;
|
||||||
iexdebug)
|
iexdebug)
|
||||||
debugwarning
|
debugwarning
|
||||||
set_dist_client
|
set_dist_client
|
||||||
exec_iex "$(uid debug)" --remsh "$ERLANG_NODE"
|
exec_iex "$(uid debug)" --remsh "$ERLANG_NODE"
|
||||||
|
check_iex_result
|
||||||
;;
|
;;
|
||||||
iexlive)
|
iexlive)
|
||||||
livewarning
|
livewarning
|
||||||
exec_iex "$ERLANG_NODE" --erl "$EJABBERD_OPTS" --app ejabberd
|
exec_iex "$ERLANG_NODE" --erl "$EJABBERD_OPTS"
|
||||||
|
check_iex_result
|
||||||
;;
|
;;
|
||||||
ping)
|
ping)
|
||||||
PEER=${2:-$ERLANG_NODE}
|
PEER=${2:-$ERLANG_NODE}
|
||||||
[ "$PEER" = "${PEER%.*}" ] && PS="-s"
|
[ "$PEER" = "${PEER%.*}" ] && PS="-s"
|
||||||
set_dist_client
|
set_dist_client
|
||||||
exec_cmd "$ERL" ${PS:--}name "$(uid ping "$(hostname $PS)")" $ERLANG_OPTS \
|
exec_cmd "$ERL" ${PS:--}name "$(uid ping "$(hostname $PS)")" $ERLANG_OPTS \
|
||||||
-noinput -hidden -eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \
|
-noinput -hidden \
|
||||||
-s erlang halt -output text
|
-eval 'net_kernel:connect_node('"'$PEER'"')' \
|
||||||
|
-eval 'io:format("~p~n",[net_adm:ping('"'$PEER'"')])' \
|
||||||
|
-eval 'halt(case net_adm:ping('"'$PEER'"') of pong -> 0; pang -> 1 end).' \
|
||||||
|
-output text
|
||||||
;;
|
;;
|
||||||
started)
|
started)
|
||||||
set_dist_client
|
set_dist_client
|
||||||
|
@ -333,15 +564,11 @@ case $1 in
|
||||||
set_dist_client
|
set_dist_client
|
||||||
wait_status 3 30 2 && stop_epmd # wait 30x2s before timeout
|
wait_status 3 30 2 && stop_epmd # wait 30x2s before timeout
|
||||||
;;
|
;;
|
||||||
|
mnesia_change)
|
||||||
|
mnesia_change $2
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
set_dist_client
|
set_dist_client
|
||||||
exec_erl "$(uid ctl)" -hidden -noinput -s ejabberd_ctl \
|
exec_other_command "$@"
|
||||||
-extra "$ERLANG_NODE" $NO_TIMEOUT "$@"
|
|
||||||
result=$?
|
|
||||||
case $result in
|
|
||||||
2|3) help;;
|
|
||||||
*) :;;
|
|
||||||
esac
|
|
||||||
exit $result
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
59
elvis.config
Normal file
59
elvis.config
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
elvis,
|
||||||
|
[
|
||||||
|
{config,
|
||||||
|
[#{dirs => ["src"],
|
||||||
|
filter => "*.erl",
|
||||||
|
ignore => ['ELDAPv3', eldap_filter_yecc],
|
||||||
|
ruleset => erl_files,
|
||||||
|
rules => [{elvis_text_style, line_length, #{limit => 1000, skip_comments => false}},
|
||||||
|
{elvis_text_style, no_tabs, disable},
|
||||||
|
{elvis_style, atom_naming_convention, disable},
|
||||||
|
{elvis_style, consistent_variable_casing, disable},
|
||||||
|
{elvis_style, dont_repeat_yourself, #{min_complexity => 70}},
|
||||||
|
{elvis_style, export_used_types, disable},
|
||||||
|
{elvis_style, function_naming_convention, disable},
|
||||||
|
{elvis_style, god_modules, #{limit => 300}},
|
||||||
|
{elvis_style, invalid_dynamic_call, disable},
|
||||||
|
{elvis_style, macro_names, disable},
|
||||||
|
{elvis_style, max_function_arity, disable}, % #{max_arity => 15}},
|
||||||
|
{elvis_style, nesting_level, disable},
|
||||||
|
{elvis_style, no_author, disable},
|
||||||
|
{elvis_style, no_boolean_in_comparison, disable},
|
||||||
|
{elvis_style, no_catch_expressions, disable},
|
||||||
|
{elvis_style, no_debug_call, disable},
|
||||||
|
{elvis_style, no_if_expression, disable},
|
||||||
|
{elvis_style, no_import, disable},
|
||||||
|
{elvis_style, no_nested_try_catch, disable},
|
||||||
|
{elvis_style, no_operation_on_same_value, disable},
|
||||||
|
{elvis_style, no_receive_without_timeout, disable},
|
||||||
|
{elvis_style, no_single_clause_case, disable},
|
||||||
|
{elvis_style, no_spec_with_records, disable},
|
||||||
|
{elvis_style, no_throw, disable},
|
||||||
|
{elvis_style, operator_spaces, disable},
|
||||||
|
{elvis_style, param_pattern_matching, disable},
|
||||||
|
{elvis_style, private_data_types, disable},
|
||||||
|
{elvis_style, variable_naming_convention, disable}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
%#{dirs => ["include"],
|
||||||
|
% filter => "*.hrl",
|
||||||
|
% ruleset => hrl_files},
|
||||||
|
|
||||||
|
#{dirs => ["."],
|
||||||
|
filter => "Makefile.in",
|
||||||
|
ruleset => makefiles,
|
||||||
|
rules => [{elvis_text_style, line_length, #{limit => 400,
|
||||||
|
skip_comments => false}},
|
||||||
|
{elvis_style, dont_repeat_yourself, #{min_complexity => 20}}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
].
|
||||||
|
|
||||||
|
%% vim: set filetype=erlang tabstop=8:
|
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_27
|
||||||
|
- 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -18,5 +18,5 @@
|
||||||
%%%
|
%%%
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
|
|
||||||
-record(passwd, {us = {<<"">>, <<"">>} :: {binary(), binary()} | '$1',
|
-record(passwd, {us = {<<"">>, <<"">>} :: {binary(), binary()} | {binary(), binary(), atom()} | '$1',
|
||||||
password = <<"">> :: binary() | scram() | '_'}).
|
password = <<"">> :: binary() | scram() | '_'}).
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -19,13 +19,30 @@
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
|
|
||||||
-type aterm() :: {atom(), atype()}.
|
-type aterm() :: {atom(), atype()}.
|
||||||
-type atype() :: integer | string | binary |
|
-type atype() :: integer | string | binary | any | atom |
|
||||||
{tuple, [aterm()]} | {list, aterm()}.
|
{tuple, [aterm()]} | {list, aterm()}.
|
||||||
-type rterm() :: {atom(), rtype()}.
|
-type rterm() :: {atom(), rtype()}.
|
||||||
-type rtype() :: integer | string | atom |
|
-type rtype() :: integer | string | atom | any |
|
||||||
{tuple, [rterm()]} | {list, rterm()} |
|
{tuple, [rterm()]} | {list, rterm()} |
|
||||||
rescode | restuple.
|
rescode | restuple.
|
||||||
|
|
||||||
|
%% The 'any' and 'atom' argument types and 'any' result type
|
||||||
|
%% should only be used %% by commands with tag 'internal',
|
||||||
|
%% which are meant to be used only internally in ejabberd,
|
||||||
|
%% and not called using external frontends.
|
||||||
|
|
||||||
|
%% The purpose of a command can either be:
|
||||||
|
%% - informative: its purpose is to obtain information
|
||||||
|
%% - modifier: its purpose is to produce some change in the server
|
||||||
|
%%
|
||||||
|
%% A modifier command should be designed just to produce its desired side-effect,
|
||||||
|
%% and its result term should just be success or failure: rescode or restuple.
|
||||||
|
%%
|
||||||
|
%% ejabberd_web_admin:make_command/2 considers that commands
|
||||||
|
%% with result type different than rescode or restuple
|
||||||
|
%% are commands that can be safely executed automatically
|
||||||
|
%% to get information and build the web page.
|
||||||
|
|
||||||
-type oauth_scope() :: atom().
|
-type oauth_scope() :: atom().
|
||||||
|
|
||||||
%% ejabberd_commands OAuth ReST ACL definition:
|
%% ejabberd_commands OAuth ReST ACL definition:
|
||||||
|
@ -67,42 +84,24 @@
|
||||||
args_example = none :: none | [any()] | '_',
|
args_example = none :: none | [any()] | '_',
|
||||||
result_example = none :: any()}).
|
result_example = none :: any()}).
|
||||||
|
|
||||||
%% TODO Fix me: Type is not up to date
|
|
||||||
-type ejabberd_commands() :: #ejabberd_commands{name :: atom(),
|
-type ejabberd_commands() :: #ejabberd_commands{name :: atom(),
|
||||||
tags :: [atom()],
|
tags :: [atom()],
|
||||||
desc :: string(),
|
desc :: string(),
|
||||||
longdesc :: string(),
|
longdesc :: string(),
|
||||||
version :: integer(),
|
version :: integer(),
|
||||||
|
note :: string(),
|
||||||
|
weight :: integer(),
|
||||||
module :: atom(),
|
module :: atom(),
|
||||||
function :: atom(),
|
function :: atom(),
|
||||||
args :: [aterm()],
|
args :: [aterm()],
|
||||||
policy :: open | restricted | admin | user,
|
policy :: open | restricted | admin | user,
|
||||||
access :: [{atom(),atom(),atom()}|atom()],
|
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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -34,12 +34,14 @@
|
||||||
format_query :: fun(),
|
format_query :: fun(),
|
||||||
format_res :: fun(),
|
format_res :: fun(),
|
||||||
args :: fun(),
|
args :: fun(),
|
||||||
|
flags :: non_neg_integer(),
|
||||||
loc :: {module(), pos_integer()}}).
|
loc :: {module(), pos_integer()}}).
|
||||||
-else.
|
-else.
|
||||||
-record(sql_query, {hash :: binary(),
|
-record(sql_query, {hash :: binary(),
|
||||||
format_query :: fun(),
|
format_query :: fun(),
|
||||||
format_res :: fun(),
|
format_res :: fun(),
|
||||||
args :: fun(),
|
args :: fun(),
|
||||||
|
flags :: non_neg_integer(),
|
||||||
loc :: {module(), {pos_integer(), pos_integer()}}}).
|
loc :: {module(), {pos_integer(), pos_integer()}}}).
|
||||||
-endif.
|
-endif.
|
||||||
|
|
||||||
|
@ -48,3 +50,26 @@
|
||||||
boolean :: fun((boolean()) -> binary()),
|
boolean :: fun((boolean()) -> binary()),
|
||||||
in_array_string :: fun((binary()) -> binary()),
|
in_array_string :: fun((binary()) -> binary()),
|
||||||
like_escape :: fun(() -> 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -62,6 +62,11 @@
|
||||||
[{<<"type">>, Type}, {<<"name">>, Name},
|
[{<<"type">>, Type}, {<<"name">>, Name},
|
||||||
{<<"value">>, Value}])).
|
{<<"value">>, Value}])).
|
||||||
|
|
||||||
|
-define(INPUTPH(Type, Name, Value, PlaceHolder),
|
||||||
|
?XA(<<"input">>,
|
||||||
|
[{<<"type">>, Type}, {<<"name">>, Name},
|
||||||
|
{<<"value">>, Value}, {<<"placeholder">>, PlaceHolder}])).
|
||||||
|
|
||||||
-define(INPUTT(Type, Name, Value),
|
-define(INPUTT(Type, Name, Value),
|
||||||
?INPUT(Type, Name, (translate:translate(Lang, Value)))).
|
?INPUT(Type, Name, (translate:translate(Lang, Value)))).
|
||||||
|
|
||||||
|
@ -95,16 +100,27 @@
|
||||||
-define(XRES(Text),
|
-define(XRES(Text),
|
||||||
?XAC(<<"p">>, [{<<"class">>, <<"result">>}], Text)).
|
?XAC(<<"p">>, [{<<"class">>, <<"result">>}], Text)).
|
||||||
|
|
||||||
|
-define(DIVRES(Elements),
|
||||||
|
?XAE(<<"div">>, [{<<"class">>, <<"result">>}], Elements)).
|
||||||
|
|
||||||
%% Guide Link
|
%% Guide Link
|
||||||
-define(XREST(Text), ?XRES((translate:translate(Lang, Text)))).
|
-define(XREST(Text), ?XRES((translate:translate(Lang, Text)))).
|
||||||
|
|
||||||
-define(GL(Ref, Title),
|
-define(GL(Ref, Title),
|
||||||
?XAE(<<"div">>, [{<<"class">>, <<"guidelink">>}],
|
?XAE(<<"div">>, [{<<"class">>, <<"guidelink">>}],
|
||||||
[?XAE(<<"a">>,
|
[?XAE(<<"a">>,
|
||||||
[{<<"href">>, <<"https://docs.ejabberd.im/admin/configuration/", Ref/binary>>},
|
[{<<"href">>, <<"https://docs.ejabberd.im/", Ref/binary>>},
|
||||||
{<<"target">>, <<"_blank">>}],
|
{<<"target">>, <<"_blank">>}],
|
||||||
[?C(<<"docs: ", Title/binary>>)])])).
|
[?C(<<"docs: ", Title/binary>>)])])).
|
||||||
|
|
||||||
%% h1 with a Guide Link
|
%% h1 with a Guide Link
|
||||||
-define(H1GL(Name, Ref, Title),
|
-define(H1GLraw(Name, Ref, Title),
|
||||||
[?XC(<<"h1">>, Name), ?GL(Ref, Title)]).
|
[?XC(<<"h1">>, Name), ?GL(Ref, Title), ?BR, ?BR]).
|
||||||
|
-define(H1GL(Name, RefConf, Title),
|
||||||
|
?H1GLraw(Name, <<"admin/configuration/", RefConf/binary>>, Title)).
|
||||||
|
|
||||||
|
-define(ANCHORL(Ref),
|
||||||
|
?XAE(<<"div">>, [{<<"class">>, <<"anchorlink">>}],
|
||||||
|
[?XAE(<<"a">>,
|
||||||
|
[{<<"href">>, <<"#", Ref/binary>>}],
|
||||||
|
[?C(unicode:characters_to_binary("¶"))])])).
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -39,20 +39,46 @@
|
||||||
-else.
|
-else.
|
||||||
-include_lib("kernel/include/logger.hrl").
|
-include_lib("kernel/include/logger.hrl").
|
||||||
|
|
||||||
|
-define(CLEAD, "\e[1"). % bold
|
||||||
|
-define(CMID, "\e[0"). % normal
|
||||||
|
-define(CCLEAN, "\e[0m"). % clean
|
||||||
|
|
||||||
|
-define(CDEFAULT, ";49;95m"). % light magenta
|
||||||
|
-define(CDEBUG, ";49;90m"). % dark gray
|
||||||
|
-define(CINFO, ";49;92m"). % green
|
||||||
|
-define(CWARNING, ";49;93m"). % light yellow
|
||||||
|
-define(CERROR, ";49;91m"). % light magenta
|
||||||
|
-define(CCRITICAL,";49;31m"). % light red
|
||||||
|
|
||||||
-define(DEBUG(Format, Args),
|
-define(DEBUG(Format, Args),
|
||||||
begin ?LOG_DEBUG(Format, Args), ok end).
|
begin ?LOG_DEBUG(Format, Args,
|
||||||
|
#{clevel => ?CLEAD ++ ?CDEBUG,
|
||||||
|
ctext => ?CMID ++ ?CDEBUG}),
|
||||||
|
ok end).
|
||||||
|
|
||||||
-define(INFO_MSG(Format, Args),
|
-define(INFO_MSG(Format, Args),
|
||||||
begin ?LOG_INFO(Format, Args), ok end).
|
begin ?LOG_INFO(Format, Args,
|
||||||
|
#{clevel => ?CLEAD ++ ?CINFO,
|
||||||
|
ctext => ?CCLEAN}),
|
||||||
|
ok end).
|
||||||
|
|
||||||
-define(WARNING_MSG(Format, Args),
|
-define(WARNING_MSG(Format, Args),
|
||||||
begin ?LOG_WARNING(Format, Args), ok end).
|
begin ?LOG_WARNING(Format, Args,
|
||||||
|
#{clevel => ?CLEAD ++ ?CWARNING,
|
||||||
|
ctext => ?CMID ++ ?CWARNING}),
|
||||||
|
ok end).
|
||||||
|
|
||||||
-define(ERROR_MSG(Format, Args),
|
-define(ERROR_MSG(Format, Args),
|
||||||
begin ?LOG_ERROR(Format, Args), ok end).
|
begin ?LOG_ERROR(Format, Args,
|
||||||
|
#{clevel => ?CLEAD ++ ?CERROR,
|
||||||
|
ctext => ?CMID ++ ?CERROR}),
|
||||||
|
ok end).
|
||||||
|
|
||||||
-define(CRITICAL_MSG(Format, Args),
|
-define(CRITICAL_MSG(Format, Args),
|
||||||
begin ?LOG_CRITICAL(Format, Args), ok end).
|
begin ?LOG_CRITICAL(Format, Args,
|
||||||
|
#{clevel => ?CLEAD++ ?CCRITICAL,
|
||||||
|
ctext => ?CMID ++ ?CCRITICAL}),
|
||||||
|
ok end).
|
||||||
-endif.
|
-endif.
|
||||||
|
|
||||||
%% Use only when trying to troubleshoot test problem with ExUnit
|
%% Use only when trying to troubleshoot test problem with ExUnit
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -18,10 +18,19 @@
|
||||||
%%%
|
%%%
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
|
|
||||||
-ifdef(DEPRECATED_GET_STACKTRACE).
|
-define(MODULE_ANTISPAM, mod_antispam).
|
||||||
-define(EX_RULE(Class, Reason, Stack), Class:Reason:Stack).
|
|
||||||
-define(EX_STACK(Stack), Stack).
|
-type url() :: binary().
|
||||||
-else.
|
-type filename() :: binary() | none | false.
|
||||||
-define(EX_RULE(Class, Reason, _), Class:Reason).
|
-type jid_set() :: sets:set(ljid()).
|
||||||
-define(EX_STACK(_), erlang:get_stacktrace()).
|
-type url_set() :: sets:set(url()).
|
||||||
-endif.
|
|
||||||
|
-define(DEFAULT_RTBL_DOMAINS_NODE, <<"spam_source_domains">>).
|
||||||
|
|
||||||
|
-record(rtbl_service,
|
||||||
|
{host = none :: binary() | none,
|
||||||
|
node = ?DEFAULT_RTBL_DOMAINS_NODE :: binary(),
|
||||||
|
subscribed = false :: boolean(),
|
||||||
|
retry_timer = undefined :: reference() | undefined}).
|
||||||
|
|
||||||
|
-type rtbl_service() :: #rtbl_service{}.
|
|
@ -1,6 +1,6 @@
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -26,7 +26,8 @@
|
||||||
bare_peer = {<<"">>, <<"">>, <<"">>} :: ljid(),
|
bare_peer = {<<"">>, <<"">>, <<"">>} :: ljid(),
|
||||||
packet = #xmlel{} :: xmlel() | message(),
|
packet = #xmlel{} :: xmlel() | message(),
|
||||||
nick = <<"">> :: binary(),
|
nick = <<"">> :: binary(),
|
||||||
type = chat :: chat | groupchat}).
|
type = chat :: chat | groupchat,
|
||||||
|
origin_id = <<"">> :: binary()}).
|
||||||
|
|
||||||
-record(archive_prefs,
|
-record(archive_prefs,
|
||||||
{us = {<<"">>, <<"">>} :: {binary(), binary()},
|
{us = {<<"">>, <<"">>} :: {binary(), binary()},
|
||||||
|
|
36
include/mod_matrix_gw.hrl
Normal file
36
include/mod_matrix_gw.hrl
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
%%%----------------------------------------------------------------------
|
||||||
|
%%%
|
||||||
|
%%% ejabberd, Copyright (C) 2002-2025 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
|
||||||
|
enforce_key_validity :: boolean(),
|
||||||
|
special_case_aliases_auth :: boolean(),
|
||||||
|
strict_canonicaljson :: boolean(),
|
||||||
|
limit_notifications_power_levels :: boolean(),
|
||||||
|
knock_join_rule :: boolean(),
|
||||||
|
restricted_join_rule :: boolean(),
|
||||||
|
restricted_join_rule_fix :: boolean(),
|
||||||
|
knock_restricted_join_rule :: boolean(),
|
||||||
|
enforce_int_power_levels :: boolean(),
|
||||||
|
implicit_room_creator :: boolean(),
|
||||||
|
updated_redaction_rules :: boolean(),
|
||||||
|
hydra :: boolean()
|
||||||
|
}).
|
|
@ -1,6 +1,6 @@
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
@ -38,13 +38,13 @@
|
||||||
description = <<"">> :: binary(),
|
description = <<"">> :: binary(),
|
||||||
allow_change_subj = true :: boolean(),
|
allow_change_subj = true :: boolean(),
|
||||||
allow_query_users = 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_private_messages_from_visitors = anyone :: anyone | moderators | nobody ,
|
||||||
allow_visitor_status = true :: boolean(),
|
allow_visitor_status = true :: boolean(),
|
||||||
allow_visitor_nickchange = true :: boolean(),
|
allow_visitor_nickchange = true :: boolean(),
|
||||||
public = true :: boolean(),
|
public = true :: boolean(),
|
||||||
public_list = true :: boolean(),
|
public_list = true :: boolean(),
|
||||||
persistent = false :: boolean(),
|
persistent = false :: boolean() | {destroying, boolean()},
|
||||||
moderated = true :: boolean(),
|
moderated = true :: boolean(),
|
||||||
captcha_protected = false :: boolean(),
|
captcha_protected = false :: boolean(),
|
||||||
members_by_default = true :: boolean(),
|
members_by_default = true :: boolean(),
|
||||||
|
@ -125,8 +125,9 @@
|
||||||
roles = #{} :: roles(),
|
roles = #{} :: roles(),
|
||||||
history = #lqueue{} :: lqueue(),
|
history = #lqueue{} :: lqueue(),
|
||||||
subject = [] :: [text()],
|
subject = [] :: [text()],
|
||||||
subject_author = <<"">> :: binary(),
|
subject_author = {<<"">>, #jid{}} :: {binary(), jid()},
|
||||||
hats_users = #{} :: map(), % FIXME on OTP 21+: #{ljid() => #{binary() => binary()}},
|
hats_defs = #{} :: #{binary() => {binary(), binary()}},
|
||||||
|
hats_users = #{} :: #{ljid() => [binary()]},
|
||||||
just_created = erlang:system_time(microsecond) :: true | integer(),
|
just_created = erlang:system_time(microsecond) :: true | integer(),
|
||||||
activity = treap:empty() :: treap:treap(),
|
activity = treap:empty() :: treap:treap(),
|
||||||
room_shaper = none :: ejabberd_shaper:shaper(),
|
room_shaper = none :: ejabberd_shaper:shaper(),
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
%%% RFC 1928 constants.
|
%%% RFC 1928 constants.
|
||||||
%%%
|
%%%
|
||||||
%%%
|
%%%
|
||||||
%%% ejabberd, Copyright (C) 2002-2022 ProcessOne
|
%%% ejabberd, Copyright (C) 2002-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
%%%-------------------------------------------------------------------
|
%%%-------------------------------------------------------------------
|
||||||
%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net>
|
%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net>
|
||||||
%%% @copyright (C) 2002-2022 ProcessOne, SARL. All Rights Reserved.
|
%%% @copyright (C) 2002-2025 ProcessOne, SARL. All Rights Reserved.
|
||||||
%%%
|
%%%
|
||||||
%%% Licensed under the Apache License, Version 2.0 (the "License");
|
%%% Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
%%% you may not use this file except in compliance with 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-2025 ProcessOne
|
||||||
%%%
|
%%%
|
||||||
%%% This program is free software; you can redistribute it and/or
|
%%% This program is free software; you can redistribute it and/or
|
||||||
%%% modify it under the terms of the GNU General Public License as
|
%%% 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()}]
|
@spec validate([attr]) :: [{:ok, attr}] | [{:error, attr, atom()}]
|
||||||
def validate(attrs) when is_list(attrs), do: Enum.map(attrs, &valid_attr?/1)
|
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 """
|
@doc """
|
||||||
Returns the type of an attribute, given its name.
|
Returns the type of an attribute, given its name.
|
||||||
|
|
|
@ -36,8 +36,8 @@ defmodule Ejabberd.Config do
|
||||||
|
|
||||||
case force do
|
case force do
|
||||||
true ->
|
true ->
|
||||||
Ejabberd.Config.Store.stop
|
Ejabberd.Config.Store.stop()
|
||||||
Ejabberd.Config.Store.start_link
|
Ejabberd.Config.Store.start_link()
|
||||||
do_init(file_path)
|
do_init(file_path)
|
||||||
false ->
|
false ->
|
||||||
if not init_already_executed, do: do_init(file_path)
|
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()
|
Code.eval_file(file_path) |> extract_and_store_module_name()
|
||||||
|
|
||||||
# Getting start/0 config
|
# Getting start/0 config
|
||||||
Ejabberd.Config.Store.get(:module_name)
|
[module] = Ejabberd.Config.Store.get(:module_name)
|
||||||
|> case do
|
call_start_func_and_store_data(module)
|
||||||
nil -> IO.puts "[ ERR ] Configuration module not found."
|
|
||||||
[module] -> call_start_func_and_store_data(module)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Fetching git modules and install them
|
# Fetching git modules and install them
|
||||||
get_modules_parsed_in_order()
|
get_modules_parsed_in_order()
|
||||||
|
|
|
@ -13,7 +13,6 @@ defmodule Ejabberd.Config.EjabberdHook do
|
||||||
@doc """
|
@doc """
|
||||||
Register a hook to ejabberd.
|
Register a hook to ejabberd.
|
||||||
"""
|
"""
|
||||||
@spec start(EjabberdHook.t) :: none
|
|
||||||
def start(%EjabberdHook{hook: hook, opts: opts, fun: fun}) do
|
def start(%EjabberdHook{hook: hook, opts: opts, fun: fun}) do
|
||||||
host = Keyword.get(opts, :host, :global)
|
host = Keyword.get(opts, :host, :global)
|
||||||
priority = Keyword.get(opts, :priority, 50)
|
priority = Keyword.get(opts, :priority, 50)
|
||||||
|
|
|
@ -7,12 +7,13 @@ defmodule Ejabberd.Config.EjabberdModule do
|
||||||
the already existing Elixir.Module.
|
the already existing Elixir.Module.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@type t :: %{module: atom, attrs: [Attr.t]}
|
|
||||||
|
|
||||||
defstruct [:module, :attrs]
|
|
||||||
|
|
||||||
alias Ejabberd.Config.EjabberdModule
|
alias Ejabberd.Config.EjabberdModule
|
||||||
alias Ejabberd.Config.Validation
|
alias Ejabberd.Config.Validation
|
||||||
|
alias Ejabberd.Config.Attr
|
||||||
|
|
||||||
|
@type t :: %{module: atom, attrs: [Attr.attr]}
|
||||||
|
|
||||||
|
defstruct [:module, :attrs]
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Given a list of modules / single module
|
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,
|
a git attribute and tries to fetch the repo,
|
||||||
then, it install them through :ext_mod.install/1
|
then, it install them through :ext_mod.install/1
|
||||||
"""
|
"""
|
||||||
@spec fetch_git_repos([EjabberdModule.t]) :: none()
|
|
||||||
def fetch_git_repos(modules) do
|
def fetch_git_repos(modules) do
|
||||||
modules
|
modules
|
||||||
|> Enum.filter(&is_git_module?/1)
|
|> 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
|
defp fetch_and_store_repo_source_if_not_exists(path, repo) do
|
||||||
unless File.exists?(path) do
|
unless File.exists?(path) do
|
||||||
IO.puts "[info] Fetching: #{repo}"
|
IO.puts "[info] Fetching: #{repo}"
|
||||||
:os.cmd('git clone #{repo} #{path}')
|
:os.cmd(~c"git clone #{repo} #{path}")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -17,9 +17,9 @@ defmodule Ejabberd.Config.EjabberdLogger do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp do_log_errors({:ok, _mod}), do: nil
|
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({: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({: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({:dependency, errors}), do: (Enum.each errors, &log_dependency_error/1)
|
||||||
|
|
||||||
defp log_attribute_error({{attr_name, _val}, :attr_not_supported}), do:
|
defp log_attribute_error({{attr_name, _val}, :attr_not_supported}), do:
|
||||||
IO.puts "[ WARN ] Annotation @#{attr_name} is not supported."
|
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
|
Look at how Config.get_ejabberd_opts/0 is constructed for
|
||||||
more informations.
|
more informations.
|
||||||
"""
|
"""
|
||||||
@spec format_opts_for_ejabberd([{atom(), any()}]) :: list()
|
@spec format_opts_for_ejabberd(map) :: list()
|
||||||
def format_opts_for_ejabberd(opts) do
|
def format_opts_for_ejabberd(opts) do
|
||||||
opts
|
opts
|
||||||
|> format_attrs_for_ejabberd
|
|> format_attrs_for_ejabberd
|
||||||
end
|
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}),
|
defp format_attrs_for_ejabberd({:listeners, mods}),
|
||||||
do: {:listen, format_listeners_for_ejabberd(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),
|
defp format_attrs_for_ejabberd({key, opts}) when is_atom(key),
|
||||||
do: {key, opts}
|
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
|
defp format_mods_for_ejabberd(mods) do
|
||||||
Enum.map mods, fn %EjabberdModule{module: mod, attrs: attrs} ->
|
Enum.map mods, fn %EjabberdModule{module: mod, attrs: attrs} ->
|
||||||
{mod, attrs[:opts]}
|
{mod, attrs[:opts]}
|
||||||
|
|
|
@ -3,12 +3,12 @@ defmodule Ejabberd.Config.Validation do
|
||||||
Module used to validate a list of modules.
|
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.EjabberdModule
|
||||||
alias Ejabberd.Config.Validator
|
alias Ejabberd.Config.Validator
|
||||||
|
|
||||||
|
@type mod_validation :: {[EjabberdModule.t], EjabberdModule.t, map}
|
||||||
|
@type mod_validation_result :: {:ok, EjabberdModule.t} | {:error, EjabberdModule.t, map}
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Given a module or a list of modules it runs validators on them
|
Given a module or a list of modules it runs validators on them
|
||||||
and returns {:ok, mod} or {:error, mod, errors}, for each
|
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.
|
Validator module used to validate attributes.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# TODO: Duplicated from validator.ex !!!
|
|
||||||
@type mod_validation :: {[EjabberdModule.t], EjabberdModule.t, map}
|
|
||||||
|
|
||||||
import Ejabberd.Config.ValidatorUtility
|
import Ejabberd.Config.ValidatorUtility
|
||||||
alias Ejabberd.Config.Attr
|
alias Ejabberd.Config.Attr
|
||||||
|
alias Ejabberd.Config.EjabberdModule
|
||||||
|
|
||||||
|
# TODO: Duplicated from validator.ex !!!
|
||||||
|
@type mod_validation :: {[EjabberdModule.t], EjabberdModule.t, map}
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Given a module (with the form used for validation)
|
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
|
@spec validate(mod_validation) :: mod_validation
|
||||||
def validate({modules, mod, errors}) do
|
def validate({modules, mod, errors}) do
|
||||||
errors = Enum.reduce mod.attrs, errors, fn(attr, err) ->
|
errors = Enum.reduce mod.attrs, errors, fn(attr, err) ->
|
||||||
case Attr.validate(attr) do
|
case Attr.validate([attr]) do
|
||||||
{:ok, _attr} -> err
|
[{:ok, _attr}] -> err
|
||||||
{:error, attr, cause} -> put_error(err, :attribute, {attr, cause})
|
[{:error, attr, cause}] -> put_error(err, :attribute, {attr, cause})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,8 @@ defmodule Ejabberd.Config.Validator.Dependencies do
|
||||||
with the @dependency annotation.
|
with the @dependency annotation.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
alias Ejabberd.Config.EjabberdModule
|
||||||
|
|
||||||
# TODO: Duplicated from validator.ex !!!
|
# TODO: Duplicated from validator.ex !!!
|
||||||
@type mod_validation :: {[EjabberdModule.t], EjabberdModule.t, map}
|
@type mod_validation :: {[EjabberdModule.t], EjabberdModule.t, map}
|
||||||
import Ejabberd.Config.ValidatorUtility
|
import Ejabberd.Config.ValidatorUtility
|
||||||
|
|
|
@ -4,8 +4,6 @@ defmodule Ejabberd.Config.ValidatorUtility do
|
||||||
Imports utility functions for working with validation structures.
|
Imports utility functions for working with validation structures.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
alias Ejabberd.Config.EjabberdModule
|
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Inserts an error inside the errors collection, for the given key.
|
Inserts an error inside the errors collection, for the given key.
|
||||||
If the key doesn't exists then it creates an empty collection
|
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
|
Given a list of modules it extracts and returns a list
|
||||||
of the module names (which are Elixir.Module).
|
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
|
def extract_module_names(modules) when is_list(modules) do
|
||||||
modules
|
modules
|
||||||
|> Enum.map(&Map.get(&1, :module))
|
|> Enum.map(&Map.get(&1, :module))
|
||||||
|
|
|
@ -7,7 +7,7 @@ defmodule Ejabberd.ConfigUtil do
|
||||||
@doc """
|
@doc """
|
||||||
Returns true when the config file is based on elixir.
|
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
|
def is_elixir_config(filename) when is_list(filename) do
|
||||||
is_elixir_config(to_string(filename))
|
is_elixir_config(to_string(filename))
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
defmodule Ejabberd.Module do
|
|
||||||
|
|
||||||
defmacro __using__(opts) do
|
|
||||||
logger_enabled = Keyword.get(opts, :logger, true)
|
|
||||||
|
|
||||||
quote do
|
|
||||||
@behaviour :gen_mod
|
|
||||||
import Ejabberd.Module
|
|
||||||
|
|
||||||
unquote(if logger_enabled do
|
|
||||||
quote do: import Ejabberd.Logger
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# gen_mod callbacks
|
|
||||||
def depends(_host, _opts), do: []
|
|
||||||
def mod_opt_type(_), do: []
|
|
||||||
end
|
|
44
lib/ejabberd_auth_example.ex
Normal file
44
lib/ejabberd_auth_example.ex
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
defmodule Ejabberd.Auth.Example do
|
||||||
|
|
||||||
|
@moduledoc """
|
||||||
|
Example ejabberd auth method written in Elixir.
|
||||||
|
|
||||||
|
This is an example to demonstrate the usage of Elixir to
|
||||||
|
create ejabberd auth methods.
|
||||||
|
|
||||||
|
Example configuration:
|
||||||
|
auth_method: 'Ejabberd.Auth.Example'
|
||||||
|
"""
|
||||||
|
|
||||||
|
@behaviour :ejabberd_auth
|
||||||
|
import Ejabberd.Logger
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def start(host) do
|
||||||
|
info("Starting Ejabberd.Auth.Example to authenticate '#{host}' users")
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def stop(host) do
|
||||||
|
info("Stopping Ejabberd.Auth.Example to authenticate '#{host}' users")
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def check_password("alice", _authz_id, _host, "secret"), do: {:nocache, true}
|
||||||
|
def check_password(_username, _authz_id, _host, _secret), do: {:nocache, false}
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def user_exists("alice", _host), do: {:nocache, true}
|
||||||
|
def user_exists(_username, _host), do: {:nocache, false}
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def plain_password_required(_binary), do: true
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def store_type(_host), do: :external
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def use_cache(_host), do: false
|
||||||
|
end
|
|
@ -14,15 +14,15 @@ defmodule Mix.Tasks.Ejabberd.Deps.Tree do
|
||||||
def run(_argv) do
|
def run(_argv) do
|
||||||
# First we need to start manually the store to be available
|
# First we need to start manually the store to be available
|
||||||
# during the compilation of the config file.
|
# during the compilation of the config file.
|
||||||
Ejabberd.Config.Store.start_link
|
Ejabberd.Config.Store.start_link()
|
||||||
Ejabberd.Config.init(:ejabberd_config.path())
|
Ejabberd.Config.init(:ejabberd_config.path())
|
||||||
|
|
||||||
Mix.shell.info "ejabberd modules"
|
Mix.shell().info "ejabberd modules"
|
||||||
|
|
||||||
Ejabberd.Config.Store.get(:modules)
|
Ejabberd.Config.Store.get(:modules)
|
||||||
|> Enum.reverse # Because of how mods are stored inside the store
|
|> Enum.reverse # Because of how mods are stored inside the store
|
||||||
|> format_mods
|
|> format_mods
|
||||||
|> Mix.shell.info
|
|> Mix.shell().info
|
||||||
end
|
end
|
||||||
|
|
||||||
defp format_mods(mods) when is_list(mods) do
|
defp format_mods(mods) when is_list(mods) do
|
||||||
|
|
46
lib/mod_example.ex
Normal file
46
lib/mod_example.ex
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
defmodule Ejabberd.Module.Example do
|
||||||
|
|
||||||
|
@moduledoc """
|
||||||
|
Example ejabberd module written in Elixir.
|
||||||
|
|
||||||
|
This is an example to demonstrate the usage of Elixir to
|
||||||
|
create ejabberd modules.
|
||||||
|
|
||||||
|
Example configuration:
|
||||||
|
modules:
|
||||||
|
'Ejabberd.Module.Example': {}
|
||||||
|
"""
|
||||||
|
|
||||||
|
@behaviour :gen_mod
|
||||||
|
import Ejabberd.Logger
|
||||||
|
|
||||||
|
def start(host, _opts) do
|
||||||
|
info("Starting Ejabberd.Module.Example for host '#{host}'")
|
||||||
|
Ejabberd.Hooks.add(:set_presence_hook, host, __MODULE__, :on_presence, 50)
|
||||||
|
:ok
|
||||||
|
end
|
||||||
|
|
||||||
|
def stop(host) do
|
||||||
|
info("Stopping Ejabberd.Module.Example for host '#{host}'")
|
||||||
|
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}")
|
||||||
|
:none
|
||||||
|
end
|
||||||
|
|
||||||
|
def depends(_host, _opts) do
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
|
||||||
|
def mod_options(_host) do
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
|
||||||
|
def mod_doc() do
|
||||||
|
%{:desc => "This is just a demonstration."}
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
|
@ -1,33 +0,0 @@
|
||||||
defmodule ModPresenceDemo do
|
|
||||||
use Ejabberd.Module
|
|
||||||
|
|
||||||
def start(host, _opts) do
|
|
||||||
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')
|
|
||||||
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}')
|
|
||||||
:none
|
|
||||||
end
|
|
||||||
|
|
||||||
def depends(_host, _opts) do
|
|
||||||
[]
|
|
||||||
end
|
|
||||||
|
|
||||||
def mod_options(_host) do
|
|
||||||
[]
|
|
||||||
end
|
|
||||||
|
|
||||||
def mod_doc() do
|
|
||||||
%{:desc => 'This is just a demonstration.'}
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -75,7 +75,7 @@ EOF
|
||||||
if test "x`cat conftest.out`" != "xok"; then
|
if test "x`cat conftest.out`" != "xok"; then
|
||||||
AC_MSG_RESULT([failed])
|
AC_MSG_RESULT([failed])
|
||||||
X="`cat conftest.out`"
|
X="`cat conftest.out`"
|
||||||
if test "[$3]" == "warn"; then
|
if test "[$3]" = "warn"; then
|
||||||
AC_MSG_WARN([$X])
|
AC_MSG_WARN([$X])
|
||||||
else
|
else
|
||||||
AC_MSG_FAILURE([$X])
|
AC_MSG_FAILURE([$X])
|
||||||
|
|
2232
man/ejabberd.yml.5
2232
man/ejabberd.yml.5
File diff suppressed because it is too large
Load diff
178
mix.exs
178
mix.exs
|
@ -3,31 +3,34 @@ defmodule Ejabberd.MixProject do
|
||||||
|
|
||||||
def project do
|
def project do
|
||||||
[app: :ejabberd,
|
[app: :ejabberd,
|
||||||
|
source_url: "https://github.com/processone/ejabberd",
|
||||||
version: version(),
|
version: version(),
|
||||||
description: description(),
|
description: description(),
|
||||||
elixir: elixir_required_version(),
|
elixir: elixir_required_version(),
|
||||||
elixirc_paths: ["lib"],
|
elixirc_paths: ["lib"],
|
||||||
compile_path: ".",
|
compile_path: ".",
|
||||||
compilers: [:asn1] ++ Mix.compilers,
|
compilers: [:asn1, :yecc] ++ Mix.compilers(),
|
||||||
erlc_options: erlc_options(),
|
erlc_options: erlc_options(),
|
||||||
erlc_paths: ["asn1", "src"],
|
erlc_paths: ["asn1", "src"],
|
||||||
# Elixir tests are starting the part of ejabberd they need
|
# Elixir tests are starting the part of ejabberd they need
|
||||||
aliases: [test: "test --no-start"],
|
aliases: [test: "test --no-start"],
|
||||||
start_permanent: Mix.env() == :prod,
|
start_permanent: Mix.env() == :prod,
|
||||||
language: :erlang,
|
language: :erlang,
|
||||||
|
dialyzer: dialyzer(),
|
||||||
releases: releases(),
|
releases: releases(),
|
||||||
package: package(),
|
package: package(),
|
||||||
|
docs: docs(),
|
||||||
deps: deps()]
|
deps: deps()]
|
||||||
end
|
end
|
||||||
|
|
||||||
def version do
|
def version do
|
||||||
case config(:vsn) do
|
case config(:vsn) do
|
||||||
:false -> "0.0.0" # ./configure wasn't run: vars.config not created
|
:false -> "0.0.0" # ./configure wasn't run: vars.config not created
|
||||||
'0.0' -> "0.0.0" # the full git repository wasn't downloaded
|
~c"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"latest.0" -> "0.0.0" # running 'docker-ejabberd/ecs/build.sh latest'
|
||||||
[_, _, ?., _, _] = x ->
|
[_, _, ?., _, _] = x ->
|
||||||
head = String.replace(:erlang.list_to_binary(x), ~r/\.0+([0-9])/, ".\\1")
|
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")
|
vsn -> String.replace(:erlang.list_to_binary(vsn), ~r/\.0+([0-9])/, ".\\1")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -40,14 +43,24 @@ defmodule Ejabberd.MixProject do
|
||||||
|
|
||||||
def application do
|
def application do
|
||||||
[mod: {:ejabberd_app, []},
|
[mod: {:ejabberd_app, []},
|
||||||
extra_applications: [:mix],
|
extra_applications: [:inets, :kernel, :sasl, :ssl, :stdlib, :syntax_tools,
|
||||||
applications: [:idna, :inets, :kernel, :sasl, :ssl, :stdlib,
|
:logger, :mix]
|
||||||
:base64url, :fast_tls, :fast_xml, :fast_yaml, :jiffy, :jose,
|
++ cond_apps(),
|
||||||
:p1_utils, :stringprep, :syntax_tools, :yconf],
|
|
||||||
included_applications: [:mnesia, :os_mon,
|
included_applications: [:mnesia, :os_mon,
|
||||||
:cache_tab, :eimp, :mqtree, :p1_acme,
|
:cache_tab, :eimp, :mqtree, :p1_acme,
|
||||||
:p1_oauth2, :pkix, :xmpp]
|
:p1_oauth2, :pkix]
|
||||||
++ cond_apps()]
|
++ 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
|
end
|
||||||
|
|
||||||
defp if_version_above(ver, okResult) do
|
defp if_version_above(ver, okResult) do
|
||||||
|
@ -68,20 +81,24 @@ defmodule Ejabberd.MixProject do
|
||||||
|
|
||||||
defp erlc_options do
|
defp erlc_options do
|
||||||
# Use our own includes + includes from all dependencies
|
# 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}] ++
|
result = [{:d, :ELIXIR_ENABLED}] ++
|
||||||
cond_options() ++
|
cond_options() ++
|
||||||
Enum.map(includes, fn (path) -> {:i, path} end) ++
|
Enum.map(includes, fn (path) -> {:i, path} end) ++
|
||||||
if_version_above('20', [{:d, :DEPRECATED_GET_STACKTRACE}]) ++
|
if_version_above(~c"20", [{:d, :HAVE_URI_STRING}]) ++
|
||||||
if_version_above('20', [{:d, :HAVE_URI_STRING}]) ++
|
if_version_above(~c"20", [{:d, :HAVE_ERL_ERROR}]) ++
|
||||||
if_version_above('20', [{:d, :HAVE_ERL_ERROR}]) ++
|
if_version_below(~c"21", [{:d, :USE_OLD_HTTP_URI}]) ++
|
||||||
if_version_below('21', [{:d, :USE_OLD_HTTP_URI}]) ++
|
if_version_below(~c"22", [{:d, :LAGER}]) ++
|
||||||
if_version_below('22', [{:d, :LAGER}]) ++
|
if_version_below(~c"21", [{:d, :NO_CUSTOMIZE_HOSTNAME_CHECK}]) ++
|
||||||
if_version_below('21', [{:d, :NO_CUSTOMIZE_HOSTNAME_CHECK}]) ++
|
if_version_below(~c"23", [{:d, :USE_OLD_CRYPTO_HMAC}]) ++
|
||||||
if_version_below('23', [{:d, :USE_OLD_CRYPTO_HMAC}]) ++
|
if_version_below(~c"23", [{:d, :USE_OLD_PG2}]) ++
|
||||||
if_version_below('23', [{:d, :USE_OLD_PG2}]) ++
|
if_version_below(~c"24", [{:d, :COMPILER_REPORTS_ONLY_LINES}]) ++
|
||||||
if_version_below('24', [{:d, :COMPILER_REPORTS_ONLY_LINES}]) ++
|
if_version_below(~c"24", [{:d, :SYSTOOLS_APP_DEF_WITHOUT_OPTIONAL}]) ++
|
||||||
if_version_below('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"26", [{:d, :OTP_BELOW_26}]) ++
|
||||||
|
if_version_below(~c"27", [{:d, :OTP_BELOW_27}]) ++
|
||||||
|
if_version_below(~c"28", [{:d, :OTP_BELOW_28}])
|
||||||
defines = for {:d, value} <- result, do: {:d, value}
|
defines = for {:d, value} <- result, do: {:d, value}
|
||||||
result ++ [{:d, :ALL_DEFS, defines}]
|
result ++ [{:d, :ALL_DEFS, defines}]
|
||||||
end
|
end
|
||||||
|
@ -98,29 +115,27 @@ defmodule Ejabberd.MixProject do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp deps do
|
defp deps do
|
||||||
[{:base64url, "~> 1.0"},
|
[{:cache_tab, "~> 1.0"},
|
||||||
{:cache_tab, "~> 1.0"},
|
{:dialyxir, "~> 1.2", only: [:test], runtime: false},
|
||||||
{:eimp, "~> 1.0"},
|
{:eimp, "~> 1.0"},
|
||||||
{:ex_doc, ">= 0.0.0", only: :dev},
|
{:ex_doc, "~> 0.31", only: [:edoc], runtime: false},
|
||||||
{:fast_tls, "~> 1.1"},
|
{:fast_tls, "~> 1.1.24"},
|
||||||
{:fast_xml, "~> 1.1"},
|
{:fast_xml, "~> 1.1.56"},
|
||||||
{:fast_yaml, "~> 1.0"},
|
{:fast_yaml, "~> 1.0"},
|
||||||
{:idna, "~> 6.0"},
|
{:idna, "~> 6.0"},
|
||||||
{:jiffy, "~> 1.1.1"},
|
|
||||||
{:jose, "~> 1.11.1"},
|
|
||||||
{:mqtree, "~> 1.0"},
|
{:mqtree, "~> 1.0"},
|
||||||
{:p1_acme, "~> 1.0"},
|
{:p1_acme, ">= 1.0.28"},
|
||||||
{:p1_oauth2, "~> 0.6"},
|
{:p1_oauth2, "~> 0.6"},
|
||||||
{:p1_utils, "~> 1.0"},
|
{:p1_utils, "~> 1.0"},
|
||||||
{:pkix, "~> 1.0"},
|
{:pkix, "~> 1.0"},
|
||||||
{:stringprep, ">= 1.0.26"},
|
{:stringprep, ">= 1.0.26"},
|
||||||
{:xmpp, ">= 1.6.0"},
|
{:xmpp, git: "https://github.com/processone/xmpp", ref: "e9d901ea84fd3910ad32b715853397eb1155b41c", override: true},
|
||||||
{:yconf, "~> 1.0"}]
|
{:yconf, git: "https://github.com/processone/yconf", ref: "95692795a8a8d950ba560e5b07e6b80660557259", override: true}]
|
||||||
++ cond_deps()
|
++ cond_deps()
|
||||||
end
|
end
|
||||||
|
|
||||||
defp deps_include(deps) do
|
defp deps_include() do
|
||||||
base = if Mix.Project.umbrella?() do
|
if Mix.Project.umbrella?() do
|
||||||
"../../deps"
|
"../../deps"
|
||||||
else
|
else
|
||||||
case Mix.Project.deps_paths()[:ejabberd] do
|
case Mix.Project.deps_paths()[:ejabberd] do
|
||||||
|
@ -128,28 +143,45 @@ defmodule Ejabberd.MixProject do
|
||||||
_ -> ".."
|
_ -> ".."
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
Enum.map(deps, fn dep -> base<>"/#{dep}/include" end)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
defp cond_deps do
|
defp cond_deps do
|
||||||
for {:true, dep} <- [{config(:pam), {:epam, "~> 1.0"}},
|
for {:true, dep} <- [{config(:pam), {:epam, "~> 1.0"}},
|
||||||
{config(:redis), {:eredis, "~> 1.2.0"}},
|
{Mix.env() == :translations,
|
||||||
|
{:ejabberd_po, git: "https://github.com/processone/ejabberd-po.git"}},
|
||||||
|
{Mix.env() == :dev,
|
||||||
|
{:exsync, "~> 0.2", optional: true, runtime: false}},
|
||||||
|
{config(:redis), {:eredis, "~> 1.7.1"}},
|
||||||
{config(:sip), {:esip, "~> 1.0"}},
|
{config(:sip), {:esip, "~> 1.0"}},
|
||||||
{config(:zlib), {:ezlib, "~> 1.0"}},
|
{config(:zlib), {:ezlib, "~> 1.0"}},
|
||||||
{if_version_below('22', true), {:lager, "~> 3.9.1"}},
|
{if_version_above(~c"23", true), {:jose, "~> 1.11.10"}},
|
||||||
{config(:lua), {:luerl, "~> 1.0"}},
|
{if_version_below(~c"24", true), {:jose, "1.11.1", override: true}},
|
||||||
{config(:mysql), {:p1_mysql, "~> 1.0.20"}},
|
{if_version_below(~c"27", true), {:jiffy, "~> 1.1.1"}},
|
||||||
{config(:pgsql), {:p1_pgsql, "~> 1.1"}},
|
{if_version_below(~c"22", true), {:lager, "~> 3.9.1"}},
|
||||||
|
{config(:lua), {:luerl, "~> 1.2.0"}},
|
||||||
|
{config(:mysql), {:p1_mysql, ">= 1.0.24"}},
|
||||||
|
{config(:pgsql), {:p1_pgsql, ">= 1.1.32"}},
|
||||||
{config(:sqlite), {:sqlite3, "~> 1.1"}},
|
{config(:sqlite), {:sqlite3, "~> 1.1"}},
|
||||||
{config(:stun), {:stun, "~> 1.0"}}], do:
|
{config(:stun), {:stun, "~> 1.0"}}], do:
|
||||||
dep
|
dep
|
||||||
end
|
end
|
||||||
|
|
||||||
defp cond_apps do
|
defp cond_apps do
|
||||||
|
for {:true, app} <- [{config(:stun), :stun},
|
||||||
|
{if_version_below(~c"27", true), :jiffy},
|
||||||
|
{config(:tools), :debugger},
|
||||||
|
{config(:tools), :observer},
|
||||||
|
{config(:tools), :wx}], do:
|
||||||
|
app
|
||||||
|
end
|
||||||
|
|
||||||
|
defp cond_included_apps do
|
||||||
for {:true, app} <- [{config(:pam), :epam},
|
for {:true, app} <- [{config(:pam), :epam},
|
||||||
{config(:lua), :luerl},
|
{config(:lua), :luerl},
|
||||||
{config(:redis), :eredis},
|
{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(:mysql), :p1_mysql},
|
||||||
{config(:sip), :esip},
|
{config(:sip), :esip},
|
||||||
{config(:odbc), :odbc},
|
{config(:odbc), :odbc},
|
||||||
|
@ -162,19 +194,30 @@ defmodule Ejabberd.MixProject do
|
||||||
[# These are the default files included in the package
|
[# These are the default files included in the package
|
||||||
files: ["include", "lib", "priv", "sql", "src",
|
files: ["include", "lib", "priv", "sql", "src",
|
||||||
"COPYING", "README.md",
|
"COPYING", "README.md",
|
||||||
|
"ejabberd.yml.example", "config/runtime.exs",
|
||||||
"mix.exs", "rebar.config", "rebar.config.script", "vars.config"],
|
"mix.exs", "rebar.config", "rebar.config.script", "vars.config"],
|
||||||
maintainers: ["ProcessOne"],
|
maintainers: ["ProcessOne"],
|
||||||
licenses: ["GPL-2.0-or-later"],
|
licenses: ["GPL-2.0-or-later"],
|
||||||
links: %{"Site" => "https://www.ejabberd.im",
|
links: %{"ejabberd.im" => "https://www.ejabberd.im",
|
||||||
"Documentation" => "http://docs.ejabberd.im",
|
"ejabberd Docs" => "https://docs.ejabberd.im",
|
||||||
"Source" => "https://github.com/processone/ejabberd",
|
"GitHub" => "https://github.com/processone/ejabberd",
|
||||||
"ProcessOne" => "http://www.process-one.net/"}]
|
"ProcessOne" => "https://www.process-one.net/"}]
|
||||||
end
|
end
|
||||||
|
|
||||||
defp vars do
|
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
|
{: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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -203,7 +246,7 @@ defmodule Ejabberd.MixProject do
|
||||||
_ -> :ok
|
_ -> :ok
|
||||||
end
|
end
|
||||||
case Version.match?(System.version(), "< 1.11.4")
|
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 ->
|
true ->
|
||||||
IO.puts("ERROR: To build releases with Elixir lower than 1.11.4, Erlang/OTP lower than 24 is required.")
|
IO.puts("ERROR: To build releases with Elixir lower than 1.11.4, Erlang/OTP lower than 24 is required.")
|
||||||
_ -> :ok
|
_ -> :ok
|
||||||
|
@ -223,6 +266,7 @@ defmodule Ejabberd.MixProject do
|
||||||
ejabberd: [
|
ejabberd: [
|
||||||
include_executables_for: [:unix],
|
include_executables_for: [:unix],
|
||||||
# applications: [runtime_tools: :permanent]
|
# applications: [runtime_tools: :permanent]
|
||||||
|
strip_beams: Mix.env() != :dev,
|
||||||
steps: [©_extra_files/1, :assemble | maybe_tar]
|
steps: [©_extra_files/1, :assemble | maybe_tar]
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
@ -239,6 +283,8 @@ defmodule Ejabberd.MixProject do
|
||||||
config_dir: config(:config_dir),
|
config_dir: config(:config_dir),
|
||||||
logs_dir: config(:logs_dir),
|
logs_dir: config(:logs_dir),
|
||||||
spool_dir: config(:spool_dir),
|
spool_dir: config(:spool_dir),
|
||||||
|
vsn: version(),
|
||||||
|
iexpath: config(:iexpath),
|
||||||
erl: config(:erl),
|
erl: config(:erl),
|
||||||
epmd: config(:epmd),
|
epmd: config(:epmd),
|
||||||
bindir: Path.join([config(:release_dir), "releases", version()]),
|
bindir: Path.join([config(:release_dir), "releases", version()]),
|
||||||
|
@ -253,14 +299,14 @@ defmodule Ejabberd.MixProject do
|
||||||
execute = fn(command) ->
|
execute = fn(command) ->
|
||||||
case function_exported?(System, :shell, 1) do
|
case function_exported?(System, :shell, 1) do
|
||||||
true ->
|
true ->
|
||||||
System.shell(command)
|
System.shell(command, into: IO.stream())
|
||||||
false ->
|
false ->
|
||||||
:os.cmd(to_charlist(command))
|
:os.cmd(to_charlist(command))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Mix/Elixir lower than 1.11.0 use config/releases.exs instead of runtime.exs
|
# 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 ->
|
true ->
|
||||||
:ok
|
:ok
|
||||||
false ->
|
false ->
|
||||||
|
@ -271,8 +317,7 @@ defmodule Ejabberd.MixProject do
|
||||||
Mix.Generator.copy_template("ejabberdctl.example1", "ejabberdctl.example2", assigns)
|
Mix.Generator.copy_template("ejabberdctl.example1", "ejabberdctl.example2", assigns)
|
||||||
execute.("sed -e 's|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.example2> ejabberdctl.example2a")
|
execute.("sed -e 's|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.example2> ejabberdctl.example2a")
|
||||||
Mix.Generator.copy_template("ejabberdctl.example2a", "ejabberdctl.example2b", assigns)
|
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|{{\\(\[_a-z\]*\\)}}|<%= @\\1 %>|g' ejabberdctl.example2b > ejabberdctl.example4")
|
||||||
execute.("sed -e 's|^ERLANG_NODE=ejabberd@localhost|ERLANG_NODE=ejabberd|g' ejabberdctl.example3 > 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|^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")
|
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)
|
Mix.Generator.copy_template("ejabberdctl.example6", "#{ro}/bin/ejabberdctl", assigns)
|
||||||
|
@ -320,13 +365,38 @@ defmodule Ejabberd.MixProject do
|
||||||
end
|
end
|
||||||
|
|
||||||
case Mix.env() do
|
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
|
_ -> :ok
|
||||||
end
|
end
|
||||||
|
|
||||||
release
|
release
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
defmodule Mix.Tasks.Compile.Asn1 do
|
defmodule Mix.Tasks.Compile.Asn1 do
|
||||||
|
@ -339,7 +409,7 @@ defmodule Mix.Tasks.Compile.Asn1 do
|
||||||
def run(args) do
|
def run(args) do
|
||||||
{opts, _, _} = OptionParser.parse(args, switches: [force: :boolean])
|
{opts, _, _} = OptionParser.parse(args, switches: [force: :boolean])
|
||||||
|
|
||||||
project = Mix.Project.config
|
project = Mix.Project.config()
|
||||||
source_paths = project[:asn1_paths] || ["asn1"]
|
source_paths = project[:asn1_paths] || ["asn1"]
|
||||||
dest_paths = project[:asn1_target] || ["src"]
|
dest_paths = project[:asn1_target] || ["src"]
|
||||||
mappings = Enum.zip(source_paths, dest_paths)
|
mappings = Enum.zip(source_paths, dest_paths)
|
||||||
|
@ -361,7 +431,7 @@ defmodule Mix.Tasks.Compile.Asn1 do
|
||||||
end
|
end
|
||||||
|
|
||||||
def manifests, do: [manifest()]
|
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())
|
def clean, do: Erlang.clean(manifest())
|
||||||
end
|
end
|
||||||
|
|
68
mix.lock
68
mix.lock
|
@ -1,35 +1,39 @@
|
||||||
%{
|
%{
|
||||||
"base64url": {:hex, :base64url, "1.0.1", "f8c7f2da04ca9a5d0f5f50258f055e1d699f0e8bf4cfdb30b750865368403cf6", [:rebar3], [], "hexpm", "f9b3add4731a02a9b0410398b475b33e7566a695365237a6bdee1bb447719f5c"},
|
"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"},
|
"cache_tab": {:hex, :cache_tab, "1.0.33", "e2542afb34f17ee3ca19d2b0f546a074922c2b99fb6b2acfb38160d7d0336ec3", [:rebar3], [{:p1_utils, "1.0.28", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "4258009eb050b22aabe0c848e230bba58401a6895c58c2ff74dfb635e3c35900"},
|
||||||
"earmark_parser": {:hex, :earmark_parser, "1.4.25", "2024618731c55ebfcc5439d756852ec4e85978a39d0d58593763924d9a15916f", [:mix], [], "hexpm", "56749c5e1c59447f7b7a23ddb235e4b3defe276afc220a6227237f3efe83f51e"},
|
"dialyxir": {:hex, :dialyxir, "1.4.6", "7cca478334bf8307e968664343cbdb432ee95b4b68a9cba95bdabb0ad5bdfd9a", [:mix], [{:erlex, ">= 0.2.7", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "8cf5615c5cd4c2da6c501faae642839c8405b49f8aa057ad4ae401cb808ef64d"},
|
||||||
"eimp": {:hex, :eimp, "1.0.22", "fa9b376ef0b50e8455db15c7c11dea4522c6902e04412288aab436d26335f6eb", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "b3b9ffb1d9a5f4a2ba88ac418a819164932d9a9d3a2fc3d32ca338ce855c4392"},
|
"earmark_parser": {:hex, :earmark_parser, "1.4.44", "f20830dd6b5c77afe2b063777ddbbff09f9759396500cdbe7523efd58d7a339c", [:mix], [], "hexpm", "4778ac752b4701a5599215f7030989c989ffdc4f6df457c5f36938cc2d2a2750"},
|
||||||
"epam": {:hex, :epam, "1.0.12", "2a5625d4133bca4b3943791a3f723ba764455a461ae9b6ba5debb262efcf4b40", [:rebar3], [], "hexpm", "54c166c4459cef72f2990a3d89a8f0be27180fe0ab0f24b28ddcc3b815f49f7f"},
|
"eimp": {:hex, :eimp, "1.0.26", "c0b05f32e35629c4d9bcfb832ff879a92b0f92b19844bc7835e0a45635f2899a", [:rebar3], [{:p1_utils, "~> 1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "d96d4e8572b9dfc40f271e47f0cb1d8849373bc98a21223268781765ed52044c"},
|
||||||
"eredis": {:hex, :eredis, "1.2.0", "0b8e9cfc2c00fa1374cd107ea63b49be08d933df2cf175e6a89b73dd9c380de4", [:rebar3], [], "hexpm", "d9b5abef2c2c8aba8f32aa018203e0b3dc8b1157773b254ab1d4c2002317f1e1"},
|
"epam": {:hex, :epam, "1.0.14", "aa0b85d27f4ef3a756ae995179df952a0721237e83c6b79d644347b75016681a", [:rebar3], [], "hexpm", "2f3449e72885a72a6c2a843f561add0fc2f70d7a21f61456930a547473d4d989"},
|
||||||
"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"},
|
"eredis": {:hex, :eredis, "1.7.1", "39e31aa02adcd651c657f39aafd4d31a9b2f63c6c700dc9cece98d4bc3c897ab", [:mix, :rebar3], [], "hexpm", "7c2b54c566fed55feef3341ca79b0100a6348fd3f162184b7ed5118d258c3cc1"},
|
||||||
"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.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"},
|
||||||
"ezlib": {:hex, :ezlib, "1.0.12", "ffe906ba10d03aaee7977e1e0e81d9ffc3bb8b47fb9cd8e2e453507a2e56221f", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "30e94355fb42260aab6e12582cb0c56bf233515e655c8aeaf48760e7561e4ebb"},
|
"esip": {:hex, :esip, "1.0.59", "eb202f8c62928193588091dfedbc545fe3274c34ecd209961f86dcb6c9ebce88", [:rebar3], [{:fast_tls, "1.1.25", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.28", [hex: :p1_utils, repo: "hexpm", optional: false]}, {:stun, "1.2.21", [hex: :stun, repo: "hexpm", optional: false]}], "hexpm", "0bdf2e3c349dc0b144f173150329e675c6a51ac473d7a0b2e362245faad3fbe6"},
|
||||||
"fast_tls": {:hex, :fast_tls, "1.1.16", "85fa7f3112ea4ff5ccb4f3abadc130a8c855ad74eb00869487399cb0c322d208", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "aa08cca89b4044e74f1f12e399817d8beaeae3ee006c98a893c0bfb1d81fba51"},
|
"ex_doc": {:hex, :ex_doc, "0.38.3", "ddafe36b8e9fe101c093620879f6604f6254861a95133022101c08e75e6c759a", [:mix], [{:earmark_parser, "~> 1.4.44", [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", "ecaa785456a67f63b4e7d7f200e8832fa108279e7eb73fd9928e7e66215a01f9"},
|
||||||
"fast_xml": {:hex, :fast_xml, "1.1.49", "67d9bfcadd04efd930e0ee1412b5ea09d3e791f1fdbd4d3e9a8c8f29f8bfed8c", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "01da064d2f740818956961036637fee2475c17bf8aab9442217f90dc77883593"},
|
"exsync": {:hex, :exsync, "0.4.1", "0a14fe4bfcb80a509d8a0856be3dd070fffe619b9ba90fec13c58b316c176594", [:mix], [{:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "cefb22aa805ec97ffc5b75a4e1dc54bcaf781e8b32564bf74abbe5803d1b5178"},
|
||||||
"fast_yaml": {:hex, :fast_yaml, "1.0.34", "3be1ed8a37fe87a53f7f2ad1ee9586dcc257103d0b1d1f0ee6306cad9d54c29a", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "926dc1798399418d3983bd53356f3395b01c07a550f6b8d1dd5d6cc07c22c1c9"},
|
"ezlib": {:hex, :ezlib, "1.0.15", "d74f5df191784744726a5b1ae9062522c606334f11086363385eb3b772d91357", [:rebar3], [{:p1_utils, "1.0.28", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "dd14ba6c12521af5cfe6923e73e3d545f4a0897dc66bfab5287fbb7ae3962eab"},
|
||||||
"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.25", "da8ed6f05a2452121b087158b17234749f36704c1f2b74dc51db99a1e27ed5e8", [:rebar3], [{:p1_utils, "~> 1.0.26", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "59e183b5740e670e02b8aa6be673b5e7779e5fe5bfcc679fe2d4993d1949a821"},
|
||||||
"jiffy": {:hex, :jiffy, "1.1.1", "aca10f47aa91697bf24ab9582c74e00e8e95474c7ef9f76d4f1a338d0f5de21b", [:rebar3], [], "hexpm", "62e1f0581c3c19c33a725c781dfa88410d8bff1bbafc3885a2552286b4785c4c"},
|
"fast_xml": {:hex, :fast_xml, "1.1.57", "31efc0f9bceda92069704f7a25830407da5dc3dad1272b810d6f2e13e73cc11a", [:rebar3], [{:p1_utils, "1.0.28", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "eec34e90adacafe467d5ddab635a014ded73b98b4061554b2d1972173d929c39"},
|
||||||
"jose": {:hex, :jose, "1.11.1", "59da64010c69aad6cde2f5b9248b896b84472e99bd18f246085b7b9fe435dcdb", [:mix, :rebar3], [], "hexpm", "078f6c9fb3cd2f4cfafc972c814261a7d1e8d2b3685c0a76eb87e158efff1ac5"},
|
"fast_yaml": {:hex, :fast_yaml, "1.0.39", "2e71168091949bab0e5f583b340a99072b4d22d93eb86624e7850a12b1517be4", [:rebar3], [{:p1_utils, "1.0.28", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "24c7b9ab9e2b9269d64e45f4a2a1280966adb17d31e63365cfd3ee277fb0a78d"},
|
||||||
"luerl": {:hex, :luerl, "1.0.0", "1b68c30649323590d5339b967b419260500ffe520cd3abc1987482a82d3b5a6c", [:rebar3], [], "hexpm", "c17bc45cb4b0845ec975387f9a5d8c81ab60456698527a29c96f78992af86bd1"},
|
"file_system": {:hex, :file_system, "1.1.0", "08d232062284546c6c34426997dd7ef6ec9f8bbd090eb91780283c9016840e8f", [:mix], [], "hexpm", "bfcf81244f416871f2a2e15c1b515287faa5db9c6bcf290222206d120b3d43f6"},
|
||||||
"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"},
|
"idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
|
||||||
"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"},
|
"jiffy": {:hex, :jiffy, "1.1.2", "a9b6c9a7ec268e7cf493d028f0a4c9144f59ccb878b1afe42841597800840a1b", [:rebar3], [], "hexpm", "bb61bc42a720bbd33cb09a410e48bb79a61012c74cb8b3e75f26d988485cf381"},
|
||||||
"makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"},
|
"jose": {:hex, :jose, "1.11.10", "a903f5227417bd2a08c8a00a0cbcc458118be84480955e8d251297a425723f83", [:mix, :rebar3], [], "hexpm", "0d6cd36ff8ba174db29148fc112b5842186b68a90ce9fc2b3ec3afe76593e614"},
|
||||||
"mqtree": {:hex, :mqtree, "1.0.15", "bc54d8b88698fdaebc1e27a9ac43688b927e3dbc05bd5cee4057e69a89a8cf17", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "294ac43c9b3d372e24eeea56c259e19c655522dcff64a55c401a639663b9d829"},
|
"luerl": {:hex, :luerl, "1.2.3", "df25f41944e57a7c4d9ef09d238bc3e850276c46039cfc12b8bb42eccf36fcb1", [:rebar3], [], "hexpm", "1b4b9d0ca5d7d280d1d2787a6a5ee9f5a212641b62bff91556baa53805df3aed"},
|
||||||
"nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"},
|
"makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"},
|
||||||
"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"},
|
"makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [: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", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"},
|
||||||
"p1_mysql": {:hex, :p1_mysql, "1.0.20", "08aeade83a24902a5fca2dbf78fa674eef25ca4e66250b4be8bd3580f35880e7", [:rebar3], [], "hexpm", "12152e8feadcf8ce586334314ca27cb088f12e0a5c850c496a8df69859390877"},
|
"makeup_erlang": {:hex, :makeup_erlang, "1.0.2", "03e1804074b3aa64d5fad7aa64601ed0fb395337b982d9bcf04029d68d51b6a7", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "af33ff7ef368d5893e4a267933e7744e46ce3cf1f61e2dccf53a111ed3aa3727"},
|
||||||
"p1_oauth2": {:hex, :p1_oauth2, "0.6.11", "96b4e85c08355720523c2f892011a81a07994d15c179ce4dd82d704fecad15b2", [:rebar3], [], "hexpm", "9c3c6ae59382b9525473bb02a32949889808f33f95f6db10594fd92acd1f63db"},
|
"mqtree": {:hex, :mqtree, "1.0.19", "d769c25f898810725fc7db0dbffe5f72098647048b1be2e6d772f1c2f31d8476", [:rebar3], [{:p1_utils, "1.0.28", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "c81065715c49a1882812f80a5ae2d842e80dd3f2d130530df35990248bf8ce3c"},
|
||||||
"p1_pgsql": {:hex, :p1_pgsql, "1.1.19", "dc615844fd22a2e45182018d5bcc6b757ac19f576fab3fe6d69e1c0ff25cee2b", [:rebar3], [{:xmpp, "1.6.0", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "4b0c6d30bbf881feb01171d13f444a6e05e1d19b6926e3f56f4028823d02730b"},
|
"nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"},
|
||||||
"p1_utils": {:hex, :p1_utils, "1.0.25", "2d39b5015a567bbd2cc7033eeb93a7c60d8c84efe1ef69a3473faa07fa268187", [:rebar3], [], "hexpm", "9219214428f2c6e5d3187ff8eb9a8783695c2427420be9a259840e07ada32847"},
|
"p1_acme": {:hex, :p1_acme, "1.0.28", "64d9c17f5412aa92d75b29206b2b984d734a4fe1b7eacb66c3d7a7c697ac612c", [:rebar3], [{:base64url, "~> 1.0", [hex: :base64url, repo: "hexpm", optional: false]}, {:idna, "~> 6.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jiffy, "~> 1.1.1", [hex: :jiffy, repo: "hexpm", optional: false]}, {:jose, "~> 1.11.10", [hex: :jose, repo: "hexpm", optional: false]}, {:yconf, "~> 1.0.17", [hex: :yconf, repo: "hexpm", optional: false]}], "hexpm", "ce686986de3f9d5fd285afe87523cb45329a349c6c6be7acc1ed916725d46423"},
|
||||||
"pkix": {:hex, :pkix, "1.0.9", "eb20b2715d71a23b4fe7e754dae9281a964b51113d0bba8adf9da72bf9d65ac2", [:rebar3], [], "hexpm", "daab2c09cdd4eda05c9b45a5c00e994a1a5f27634929e1377e2e59b707103e3a"},
|
"p1_mysql": {:hex, :p1_mysql, "1.0.26", "574d07c9936c53b1ec3556db3cf064cc14a6c39039835b3d940471bfa5ac8e2b", [:rebar3], [], "hexpm", "ea138083f2c54719b9cf549dbf5802a288b0019ea3e5449b354c74cc03fafdec"},
|
||||||
"sqlite3": {:hex, :sqlite3, "1.1.13", "94a6e0508936514e1493efeb9b939a9bbfa861f4b8dc93ef174ae88a1d9381d3", [:rebar3], [], "hexpm", "b77fad096d1ae9553ad8551ea75bd0d64a2f5b09923a7ca48b14215564dbfc48"},
|
"p1_oauth2": {:hex, :p1_oauth2, "0.6.14", "1c5f82535574de87e2059695ac4b91f8f9aebacbc1c80287dae6f02552d47aea", [:rebar3], [], "hexpm", "1fd3ac474e43722d9d5a87c6df8d36f698ed87af7bb81cbbb66361451d99ae8f"},
|
||||||
"stringprep": {:hex, :stringprep, "1.0.29", "02f23e8c3a219a3dfe40a22e908bece3a2f68af0ff599ea8a7b714ecb21e62ee", [:rebar3], [{:p1_utils, "1.0.25", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "928eba304c3006eb1512110ebd7b87db163b00859a09375a1e4466152c6c462a"},
|
"p1_pgsql": {:hex, :p1_pgsql, "1.1.35", "e13d89f14d717553e85c88a152ce77461916b013d88fcb851e354a0b332d4218", [:rebar3], [{:xmpp, "~> 1.11.0", [hex: :xmpp, repo: "hexpm", optional: false]}], "hexpm", "e99594446c411c660696795b062336f5c4bd800451d8f620bb4d4ce304e255c2"},
|
||||||
"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"},
|
"p1_utils": {:hex, :p1_utils, "1.0.28", "9a7088a98d788b4c4880fd3c82d0c135650db13f2e4ef7e10db179791bc94d59", [:rebar3], [], "hexpm", "c49bd44bc4a40ad996691af826dd7e0aa56d4d0cd730817190a1f84d1a7f0033"},
|
||||||
"unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm", "1d1848c40487cdb0b30e8ed975e34e025860c02e419cb615d255849f3427439d"},
|
"pkix": {:hex, :pkix, "1.0.10", "d3bfadf7b7cfe2a3636f1b256c9cce5f646a07ce31e57ee527668502850765a0", [:rebar3], [], "hexpm", "e02164f83094cb124c41b1ab28988a615d54b9adc38575f00f19a597a3ac5d0e"},
|
||||||
"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"},
|
"sqlite3": {:hex, :sqlite3, "1.1.15", "e819defd280145c328457d7af897d2e45e8e5270e18812ee30b607c99cdd21af", [:rebar3], [], "hexpm", "3c0ba4e13322c2ad49de4e2ddd28311366adde54beae8dba9d9e3888f69d2857"},
|
||||||
"yconf": {:hex, :yconf, "1.0.14", "b216f385f729b338385b25176f6e4fe8cabfdf7ede9c40a35b2e77fc93e98fc8", [:rebar3], [{:fast_yaml, "1.0.34", [hex: :fast_yaml, repo: "hexpm", optional: false]}], "hexpm", "a8a9262553c11ed4cd13cc8e656e53acb00f9385f0a50cd235af7d02e9204bce"},
|
"stringprep": {:hex, :stringprep, "1.0.33", "22f42866b4f6f3c238ea2b9cb6241791184ddedbab55e94a025511f46325f3ca", [:rebar3], [{:p1_utils, "1.0.28", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "96f8b30bc50887f605b33b46bca1d248c19a879319b8c482790e3b4da5da98c0"},
|
||||||
|
"stun": {:hex, :stun, "1.2.21", "735855314ad22cb7816b88597d2f5ca22e24aa5e4d6010a0ef3affb33ceed6a5", [:rebar3], [{:fast_tls, "1.1.25", [hex: :fast_tls, repo: "hexpm", optional: false]}, {:p1_utils, "1.0.28", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "3d7fe8efb9d05b240a6aa9a6bf8b8b7bff2d802895d170443c588987dc1e12d9"},
|
||||||
|
"unicode_util_compat": {:hex, :unicode_util_compat, "0.7.1", "a48703a25c170eedadca83b11e88985af08d35f37c6f664d6dcfb106a97782fc", [:rebar3], [], "hexpm", "b3a917854ce3ae233619744ad1e0102e05673136776fb2fa76234f3e03b23642"},
|
||||||
|
"xmpp": {:git, "https://github.com/processone/xmpp", "e9d901ea84fd3910ad32b715853397eb1155b41c", [ref: "e9d901ea84fd3910ad32b715853397eb1155b41c"]},
|
||||||
|
"yconf": {:git, "https://github.com/processone/yconf", "95692795a8a8d950ba560e5b07e6b80660557259", [ref: "95692795a8a8d950ba560e5b07e6b80660557259"]},
|
||||||
}
|
}
|
||||||
|
|
|
@ -131,16 +131,27 @@ ul li #navhead a, ul li #navheadsub a, ul li #navheadsubsub a {
|
||||||
background: #424a55;
|
background: #424a55;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#navitemlogin-start {
|
||||||
|
border-top: 0.2em solid #cae7e4;
|
||||||
|
}
|
||||||
|
#navitemlogin {
|
||||||
|
padding: 0.5em;
|
||||||
|
border-bottom: 0.2em solid #cae7e4;
|
||||||
|
padding-left: 0.5em;
|
||||||
|
}
|
||||||
|
#welcome {
|
||||||
|
padding: 2em;
|
||||||
|
border-top: 0.2em solid #cae7e4;
|
||||||
|
border-bottom: 0.2em solid #cae7e4;
|
||||||
|
background-color: #f4f9f9;
|
||||||
|
}
|
||||||
#lastactivity li {
|
#lastactivity li {
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
margin-bottom: -1px;
|
margin-bottom: -1px;
|
||||||
}
|
}
|
||||||
thead tr td {
|
thead tr td {
|
||||||
background: #3eaffa;
|
background: #cae7e4;
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
thead tr td a {
|
|
||||||
color: #fff;
|
|
||||||
}
|
}
|
||||||
td.copy {
|
td.copy {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
@ -227,24 +238,32 @@ h3 {
|
||||||
padding-top: 25px;
|
padding-top: 25px;
|
||||||
width: 70%;
|
width: 70%;
|
||||||
}
|
}
|
||||||
|
div.anchorlink {
|
||||||
|
display: inline-block;
|
||||||
|
float: right;
|
||||||
|
margin-top: 1em;
|
||||||
|
margin-right: 1em;
|
||||||
|
}
|
||||||
|
div.anchorlink a {
|
||||||
|
padding: 3px;
|
||||||
|
background: #cae7e4;
|
||||||
|
font-size: 0.75em;
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
div.guidelink,
|
div.guidelink,
|
||||||
p[dir=ltr] {
|
p[dir=ltr] {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
float: right;
|
float: right;
|
||||||
|
margin-top: 1em;
|
||||||
margin: 0;
|
|
||||||
margin-right: 1em;
|
margin-right: 1em;
|
||||||
}
|
}
|
||||||
div.guidelink a,
|
div.guidelink a,
|
||||||
p[dir=ltr] a {
|
p[dir=ltr] a {
|
||||||
display: inline-block;
|
|
||||||
border-radius: 3px;
|
|
||||||
padding: 3px;
|
padding: 3px;
|
||||||
|
|
||||||
background: #3eaffa;
|
background: #3eaffa;
|
||||||
|
|
||||||
font-size: 0.75em;
|
font-size: 0.75em;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
|
border-radius: 2px;
|
||||||
}
|
}
|
||||||
table {
|
table {
|
||||||
margin-top: 1em;
|
margin-top: 1em;
|
||||||
|
@ -265,7 +284,7 @@ input,
|
||||||
select {
|
select {
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
}
|
}
|
||||||
p.result {
|
.result {
|
||||||
border: 1px;
|
border: 1px;
|
||||||
border-style: dashed;
|
border-style: dashed;
|
||||||
border-color: #FE8A02;
|
border-color: #FE8A02;
|
||||||
|
@ -284,3 +303,20 @@ p.result {
|
||||||
color: #cb2431;
|
color: #cb2431;
|
||||||
transition: none;
|
transition: none;
|
||||||
}
|
}
|
||||||
|
h3.api {
|
||||||
|
border-bottom: 1px solid #b6b6b6;
|
||||||
|
}
|
||||||
|
details > summary {
|
||||||
|
background-color: #dbeceb;
|
||||||
|
border: none;
|
||||||
|
cursor: pointer;
|
||||||
|
list-style: none;
|
||||||
|
padding: 8px;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
details > pre, details > p {
|
||||||
|
background-color: #f2f8f7;
|
||||||
|
border-bottom: 0.2em solid #dbeceb;
|
||||||
|
margin: 0;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
|
@ -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.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.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.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.rcos {padding-right: 10px;}
|
||||||
div.rcoe {color: green;}
|
div.rcoe {color: green;}
|
||||||
div.rcod {color: red;}
|
div.rcod {color: red;}
|
||||||
div.rcoe:after {content: ": v";}
|
div.rcoe:after {content: ": v";}
|
||||||
div.rcod:after {content: ": x";}
|
div.rcod:after {content: ": x";}
|
||||||
div.rcot:after {}
|
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;}
|
.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;}
|
.w3c {position: absolute; right: 10px; width: 60%; text-align: right; font-family: monospace; letter-spacing: 1px;}
|
||||||
|
|
1
priv/css/sortable.min.css
vendored
Normal file
1
priv/css/sortable.min.css
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
.sortable thead th:not(.no-sort){cursor:pointer}.sortable thead th:not(.no-sort)::after,.sortable thead th:not(.no-sort)::before{transition:color .1s ease-in-out;font-size:1.2em;color:rgba(0,0,0,0)}.sortable thead th:not(.no-sort)::after{margin-left:3px;content:"▸"}.sortable thead th:not(.no-sort):hover::after{color:inherit}.sortable thead th:not(.no-sort)[aria-sort=descending]::after{color:inherit;content:"▾"}.sortable thead th:not(.no-sort)[aria-sort=ascending]::after{color:inherit;content:"▴"}.sortable thead th:not(.no-sort).indicator-left::after{content:""}.sortable thead th:not(.no-sort).indicator-left::before{margin-right:3px;content:"▸"}.sortable thead th:not(.no-sort).indicator-left:hover::before{color:inherit}.sortable thead th:not(.no-sort).indicator-left[aria-sort=descending]::before{color:inherit;content:"▾"}.sortable thead th:not(.no-sort).indicator-left[aria-sort=ascending]::before{color:inherit;content:"▴"}/*# sourceMappingURL=sortable-base.min.css.map */
|
Binary file not shown.
Before Width: | Height: | Size: 177 B |
Binary file not shown.
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 9.7 KiB |
|
@ -6,3 +6,14 @@ function sh(e) {
|
||||||
document.getElementById(e).style.display='none';
|
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';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
3
priv/js/sortable.min.js
vendored
Normal file
3
priv/js/sortable.min.js
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
document.addEventListener("click",function(c){try{function h(b,a){return b.nodeName===a?b:h(b.parentNode,a)}var v=c.shiftKey||c.altKey,d=h(c.target,"TH"),m=d.parentNode,n=m.parentNode,g=n.parentNode;function p(b){var a;return v?b.dataset.sortAlt:null!==(a=b.dataset.sort)&&void 0!==a?a:b.textContent}if("THEAD"===n.nodeName&&g.classList.contains("sortable")&&!d.classList.contains("no-sort")){var q,f=m.cells,r=+d.dataset.sortTbr;for(c=0;c<f.length;c++)f[c]===d?q=+d.dataset.sortCol||c:f[c].setAttribute("aria-sort",
|
||||||
|
"none");f="descending";if("descending"===d.getAttribute("aria-sort")||g.classList.contains("asc")&&"ascending"!==d.getAttribute("aria-sort"))f="ascending";d.setAttribute("aria-sort",f);var w="ascending"===f,x=g.classList.contains("n-last"),t=function(b,a,e){a=p(a.cells[e]);b=p(b.cells[e]);if(x){if(""===a&&""!==b)return-1;if(""===b&&""!==a)return 1}e=+a-+b;a=isNaN(e)?a.localeCompare(b):e;return w?-a:a};for(c=0;c<g.tBodies.length;c++){var k=g.tBodies[c],u=[].slice.call(k.rows,0);u.sort(function(b,a){var e=
|
||||||
|
t(b,a,q);return 0!==e||isNaN(r)?e:t(b,a,r)});var l=k.cloneNode();l.append.apply(l,u);g.replaceChild(l,k)}}}catch(h){}});
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue