Compare commits
644 commits
Author | SHA1 | Date | |
---|---|---|---|
Hypolite Petovan | 16f5d2033d | ||
8c60ea4640 | |||
Hypolite Petovan | 3aedf53765 | ||
d38b2124a1 | |||
Hypolite Petovan | 03db8ee52c | ||
Michael | c088bab141 | ||
Hypolite Petovan | 9eafb5edcb | ||
Hypolite Petovan | a49c51f62e | ||
ba1d5bf578 | |||
Tobias Diekershoff | 3685f37d4b | ||
2cb1111ebd | |||
foss- | cb10b7e673 | ||
foss- | 492675d506 | ||
Tobias Diekershoff | 35beffc8a8 | ||
Michael | 259a676207 | ||
Tobias Diekershoff | d7e038a014 | ||
Michael | 29187f1501 | ||
Hypolite Petovan | 2cd860e028 | ||
Hypolite Petovan | 1fe8722159 | ||
foss- | ff0c94c296 | ||
foss- | 43f5c45fce | ||
e25c7d236c | |||
Michael | e14a63d848 | ||
Hypolite Petovan | 83b286fafb | ||
Michael | b61cfd193f | ||
Hypolite Petovan | eb2a8e47b0 | ||
Michael | 55cec6c61d | ||
Hypolite Petovan | b3c7e96b73 | ||
Michael | fd3386fe20 | ||
Hypolite Petovan | 87da9c98f6 | ||
Michael | fd508fa423 | ||
Tobias Diekershoff | 99aec68582 | ||
Michael | 95faba4446 | ||
Tobias Diekershoff | 0966d5f1b4 | ||
Michael | 7808c89071 | ||
Hypolite Petovan | e8da8c5a2b | ||
Hypolite Petovan | 1b022a91fa | ||
Hypolite Petovan | e3100c62ce | ||
Michael | dca93a9606 | ||
f70546d37b | |||
Michael | 4d3d4de972 | ||
Tobias Diekershoff | 5751311e99 | ||
Tobias Diekershoff | eba67fdd88 | ||
Michael | 1853f00a12 | ||
Michael | df0440ea97 | ||
Hypolite Petovan | c432924d27 | ||
b1e2675dff | |||
Tobias Diekershoff | 14759ff50a | ||
Michael | 4066a5403c | ||
Hypolite Petovan | d20c5493ae | ||
Michael | da37516abf | ||
Tobias Diekershoff | ea5e1f1edc | ||
Michael | 92a7b65587 | ||
Tobias Diekershoff | 6b04dcf90b | ||
Michael | 7176fed316 | ||
Tobias Diekershoff | 97c12055a2 | ||
Michael | 8ae1f0d0e9 | ||
Tobias Diekershoff | 4b3498710f | ||
Michael | cb0b3e67be | ||
Hypolite Petovan | a5e12c82df | ||
Michael | 058499cd92 | ||
Tobias Diekershoff | bda829665e | ||
Michael | 846addf7b3 | ||
Hypolite Petovan | 1f12d1e668 | ||
Hypolite Petovan | 570de6a91a | ||
Hypolite Petovan | c81ee0d1c3 | ||
Michael | 4ce1911889 | ||
367170a92a | |||
Michael | 0426572e92 | ||
Hypolite Petovan | cad3a01b1c | ||
Michael | 69b1958483 | ||
Hypolite Petovan | 3493b2c1b5 | ||
Michael | 1c66d49599 | ||
Hypolite Petovan | a6f3c961dc | ||
Michael | e12f92e516 | ||
Hypolite Petovan | bd6616e84f | ||
Michael | 60f5fd8188 | ||
Hypolite Petovan | cfad5809ff | ||
Hypolite Petovan | 104d355096 | ||
Michael | 82327b0b06 | ||
Michael | 8a100e847d | ||
Tobias Diekershoff | 9ae4a17977 | ||
Hypolite Petovan | c604477cac | ||
Michael | 21fc28029a | ||
Michael | 52b11856fa | ||
Hypolite Petovan | 9e1362ba46 | ||
Michael | 5751e024c0 | ||
Hypolite Petovan | d788cb82cc | ||
Hypolite Petovan | ec5e8a55b5 | ||
Hypolite Petovan | a73ba083f9 | ||
Michael | e43f96740b | ||
Michael | bca86beda0 | ||
Michael | 567292533e | ||
Tobias Diekershoff | ee9510e17d | ||
Tobias Diekershoff | 99426d4188 | ||
0be622e049 | |||
Michael | f574bc72ca | ||
5b55ba2176 | |||
Tobias Diekershoff | db8cab77c1 | ||
Hypolite Petovan | 40949483f3 | ||
Hypolite Petovan | 28784eef85 | ||
Hypolite Petovan | 42c3faa450 | ||
Hannes Heute | 786a8dbd3b | ||
Hannes Heute | afda3de363 | ||
Hypolite Petovan | 25475b4838 | ||
Hypolite Petovan | a6cb3ed903 | ||
Hypolite Petovan | c19a68dc64 | ||
Hannes Heute | a356fe65d0 | ||
Hypolite Petovan | f566c52624 | ||
Hypolite Petovan | 9dc0e5393e | ||
Hannes Heute | e049fd5e47 | ||
Hannes Heute | 579a0b43ce | ||
Michael | afff2b949f | ||
Tobias Diekershoff | 0ae91b59ca | ||
Tobias Diekershoff | e7b9d97672 | ||
Michael | e7b861388d | ||
Michael | 55fb52299d | ||
Tobias Diekershoff | 38e082949d | ||
Tobias Diekershoff | aeb1382039 | ||
Tobias Diekershoff | 63a7536624 | ||
Tobias Diekershoff | bf278adb15 | ||
Hypolite Petovan | 765af10f00 | ||
e98b3a307b | |||
e8aaa9cfec | |||
Hypolite Petovan | b1b2e9bd11 | ||
Hypolite Petovan | fe9ef20392 | ||
Michael | 984a972e72 | ||
Hypolite Petovan | 1cabf53bf5 | ||
Michael | 2776411c6c | ||
Hypolite Petovan | 894c56ea22 | ||
Michael | c82a1ed467 | ||
Hypolite Petovan | bae1f63424 | ||
Michael | 652802f758 | ||
Tobias Diekershoff | ac195c7061 | ||
Michael | 9cf8678323 | ||
Michael | 0e79b5373b | ||
Hypolite Petovan | c30e4c02de | ||
Michael | b351819986 | ||
Michael | 642c55ee3e | ||
Michael | 6e0118f3fe | ||
Hypolite Petovan | 49a0b0fc3c | ||
Hypolite Petovan | 4a0b989386 | ||
Hypolite Petovan | 9329eebec0 | ||
619a63af6b | |||
Michael | 38da9013ff | ||
e24d1da13b | |||
Hypolite Petovan | ed01b0f409 | ||
f616dc054f | |||
a20b876d67 | |||
c5b8abcaf0 | |||
Hypolite Petovan | 9fe0d72461 | ||
Michael | 45b30825f0 | ||
Michael | 7dc5622dca | ||
Hypolite Petovan | ce580241e2 | ||
Michael | a440619769 | ||
Tobias Diekershoff | 9626a76b18 | ||
Tobias Diekershoff | b02a5ed701 | ||
Michael | 69fc2c04e4 | ||
Michael | d7e8ee51ae | ||
Tobias Diekershoff | 02d8cc2f71 | ||
Tobias Diekershoff | 0a88d5a94a | ||
Michael | 8b75aab4ad | ||
Michael | a2da42640c | ||
Tobias Diekershoff | ad65e56b16 | ||
Michael | 78dc61b59e | ||
Hypolite Petovan | e9dcf15d86 | ||
Michael | b40687081e | ||
Michael | 50b1de5959 | ||
44344af055 | |||
cbcec17bcb | |||
Hypolite Petovan | 9ab5d8a83a | ||
Michael | 0d4f956fba | ||
Hypolite Petovan | c71f4eb1df | ||
Michael | 626ab7cb54 | ||
Hypolite Petovan | c8fff8c50c | ||
Hypolite Petovan | 3bb00f36f8 | ||
Hypolite Petovan | fda2873a92 | ||
394c388a46 | |||
6e7178022b | |||
1d86146f64 | |||
751ffe6bc6 | |||
Hypolite Petovan | 31b74b1c8a | ||
Michael | 0fde21ff28 | ||
Hypolite Petovan | 53a2fb648f | ||
Hannes Heute | 13b890605b | ||
Hypolite Petovan | 97f7a99382 | ||
Hannes Heute | e602b16dfb | ||
Hannes Heute | 5c7dd34fba | ||
Hannes Heute | 4b647d288a | ||
Hannes Heute | 71a9e6112e | ||
Hannes Heute | 0fd5c00010 | ||
Hypolite Petovan | 250b3b813c | ||
Michael | f537d7a64f | ||
Hypolite Petovan | 5ec445e90b | ||
Michael | 67e0b6357e | ||
Tobias Diekershoff | f928372266 | ||
Michael | 200cf29a8d | ||
f78b0e7c51 | |||
Hypolite Petovan | b21604a720 | ||
Hypolite Petovan | c67225c62d | ||
449464a2b1 | |||
Michael | c041c65c1d | ||
Hypolite Petovan | e293de04f5 | ||
Hypolite Petovan | b4d71f1855 | ||
Tobias Diekershoff | d824bb536f | ||
Tobias Diekershoff | 1b9fa0fe00 | ||
Michael | b72e32a842 | ||
Michael | b39c48fb02 | ||
Hypolite Petovan | b5a69da872 | ||
Michael | 618a3153ab | ||
Hypolite Petovan | 0ccb3e7efe | ||
Michael | 4b695e361c | ||
Hypolite Petovan | 4834255acf | ||
Michael | 325932dc5a | ||
Hypolite Petovan | faac52e078 | ||
Michael | 7a0c5d141e | ||
Hypolite Petovan | 732d738b82 | ||
Michael | 3d267c7b8f | ||
Hypolite Petovan | 987e6c5ea6 | ||
Hypolite Petovan | 9e240c24ce | ||
Michael | 3b419cae1e | ||
Hypolite Petovan | 56f3743e75 | ||
Hypolite Petovan | f26f35f009 | ||
Michael | fdd777d75d | ||
Michael | aff45278e1 | ||
Michael | 11a16589da | ||
Tobias Diekershoff | f60638787e | ||
Tobias Diekershoff | c5936bb51e | ||
Tobias Diekershoff | f13c5dcbaf | ||
Tobias Diekershoff | 2fcd090b11 | ||
Tobias Diekershoff | 4aa53beaea | ||
Tobias Diekershoff | 25a22ad3ae | ||
Tobias Diekershoff | ae217ce27c | ||
Hypolite Petovan | 17dea0aa5a | ||
foss- | bd142218c1 | ||
ce8d0b3b57 | |||
Hypolite Petovan | 8f7edcef22 | ||
Hypolite Petovan | 2f526f7a80 | ||
Tobias Diekershoff | 2780b3e3a4 | ||
Tobias Diekershoff | 2785b074f8 | ||
Hypolite Petovan | 8a693fed37 | ||
Hypolite Petovan | 6f5585ffd7 | ||
foss- | c9f6590353 | ||
foss- | 3f1cac2251 | ||
Hypolite Petovan | 3a8f1f6304 | ||
foss- | a5c265b6aa | ||
foss- | ea79782a93 | ||
Hypolite Petovan | 882673c260 | ||
Michael | 668bb3e6f4 | ||
Hypolite Petovan | 7331e44a1c | ||
Michael | 1ffdb19c8e | ||
Hypolite Petovan | 5c62d91960 | ||
Hypolite Petovan | 7615a3103f | ||
Michael | 2ecdd683ac | ||
Michael | a9b78d1974 | ||
e6c23e69cc | |||
Hypolite Petovan | c81a47c764 | ||
Hypolite Petovan | 4bbc1d84ce | ||
Hypolite Petovan | f7cb9ec504 | ||
Michael | 28363a5416 | ||
Michael | f1be6d5181 | ||
Michael | b75fdbbd32 | ||
Philipp Holzer | 9ce2142d99 | ||
Philipp Holzer | 4f24247aa7 | ||
Philipp Holzer | 0eec20d203 | ||
Philipp Holzer | adeb9af502 | ||
Philipp Holzer | c577773e07 | ||
Tobias Diekershoff | b8396daca2 | ||
Michael | eaddf5318a | ||
Tobias Diekershoff | aee9a61fb1 | ||
Tobias Diekershoff | 81b5ed160b | ||
Tobias Diekershoff | 49b79d0457 | ||
Michael | 8ce1797480 | ||
foss- | 650aa089d9 | ||
2c689f2b73 | |||
Hypolite Petovan | aac5d41fd6 | ||
Hypolite Petovan | 57187f26ae | ||
Hypolite Petovan | 7446048d5d | ||
Hypolite Petovan | d3ee4d589b | ||
Michael | fda832cd83 | ||
Michael | 30f31828ae | ||
Tobias Diekershoff | cd7a663733 | ||
Michael | 3b024450ff | ||
Tobias Diekershoff | e22ef85386 | ||
Tobias Diekershoff | e206175a50 | ||
Michael | 76d469675e | ||
Michael | 3496d3948a | ||
Michael | 00b325d521 | ||
Tobias Diekershoff | 2077e00eae | ||
Michael | a1427a52b3 | ||
Michael | 40a47b076d | ||
Hypolite Petovan | f041701765 | ||
Michael | d9bedbb473 | ||
Hypolite Petovan | 013bba50bc | ||
Michael | 5f0657a30c | ||
Michael | 435b30be11 | ||
Hypolite Petovan | 73863561d2 | ||
Michael | 67696d08da | ||
Hypolite Petovan | 1b00b91767 | ||
Michael | 68c2bdb98e | ||
54852ecb56 | |||
Hypolite Petovan | 8c4b2107b5 | ||
Hypolite Petovan | 111df607bc | ||
Tobias Diekershoff | b8b76e870d | ||
Michael | 41c89abe68 | ||
Michael | 24e7556f85 | ||
Michael | 8cc7bad1ea | ||
Hypolite Petovan | 2357385162 | ||
Michael | 31b92b16ed | ||
Hypolite Petovan | 3ad4ab2940 | ||
5ab81abaa6 | |||
Hypolite Petovan | 1b651519a3 | ||
Michael | ba07172a65 | ||
Michael | 72e045e744 | ||
Tobias Diekershoff | 2cedbae206 | ||
Tobias Diekershoff | a6b033c4f6 | ||
dc96a72173 | |||
Tobias Diekershoff | 38141edbea | ||
Tobias Diekershoff | 9b0e243350 | ||
Michael | 52cc8ab73b | ||
Hypolite Petovan | ea4e66c74c | ||
Hypolite Petovan | f4826bae52 | ||
Michael | 7471513269 | ||
Michael | ae37c44cc0 | ||
Hypolite Petovan | 424e219c53 | ||
Michael | bae7644d6f | ||
f2ccce05b8 | |||
89ffe6875f | |||
Hypolite Petovan | 7284210bf7 | ||
Hypolite Petovan | 4fcc92e532 | ||
Hypolite Petovan | 2c259c5c6f | ||
Hypolite Petovan | 39d25b9699 | ||
Michael | 5df1ead001 | ||
Hypolite Petovan | 2d4f28dcde | ||
Michael | dd55ba2d77 | ||
Hypolite Petovan | c9f7d9baff | ||
Hypolite Petovan | 504a2e91e2 | ||
Michael | 40e882004e | ||
Michael | e394a6b0fa | ||
Michael | 8cf82a8449 | ||
Hypolite Petovan | 0d922b75af | ||
Hypolite Petovan | ba0a8069c4 | ||
Hypolite Petovan | d37699bc08 | ||
Hypolite Petovan | ac087749e3 | ||
Michael | ddc9f5f595 | ||
Tobias Diekershoff | 35bba685fa | ||
Michael | e52fa44d3f | ||
Hypolite Petovan | f74d6f9ebb | ||
Michael | ae358cae4c | ||
Michael | b572b8989f | ||
Michael | 5800a973cb | ||
44ce5471b3 | |||
Michael | e05b57cd5d | ||
Michael | ecdf8f2b47 | ||
1c5681c199 | |||
Michael | 20fd25258a | ||
Michael | 00bb538fd0 | ||
Michael | 12bdbaaba8 | ||
Michael | 821a135033 | ||
0ff37c0075 | |||
Hypolite Petovan | 0a73050de1 | ||
Hypolite Petovan | a25dbf839a | ||
Hypolite Petovan | e16b6ee6e1 | ||
Hypolite Petovan | 5c5d7eb04f | ||
fc3898fe64 | |||
71384e6f39 | |||
d95c9d28a8 | |||
Hypolite Petovan | bb7d25dfc9 | ||
d5c0f086bd | |||
Michael | 892e0a5623 | ||
cb294cf411 | |||
9ad452a19b | |||
Hypolite Petovan | 623a5be8a6 | ||
Hypolite Petovan | d1cd9a016e | ||
7d5d3b3c29 | |||
bcec6c5ab2 | |||
6384265cbd | |||
f12276eff8 | |||
c6160a1c38 | |||
07c20da08f | |||
4eefd0a205 | |||
Hypolite Petovan | 78bc1359e0 | ||
Hypolite Petovan | 1956c2ecfd | ||
Michael | ade2369b5d | ||
Michael | 0d2ea97eb1 | ||
08fa51d0bb | |||
Michael | 7d10518e94 | ||
Michael | 1069cfb570 | ||
14e5b06029 | |||
Tobias Diekershoff | 1ea8a4042d | ||
fad55e0948 | |||
Hypolite Petovan | 262ca4131d | ||
Michael | c7e0500529 | ||
Hypolite Petovan | 686d0b6dbb | ||
Hypolite Petovan | 59c27a6cbb | ||
Michael | e2cbe0983a | ||
Michael | 3b0cc45588 | ||
Michael | 061f43788c | ||
Michael | fe00a3893d | ||
Michael | 5d4f72698d | ||
Michael | 96ede22abb | ||
2cc8fcc4aa | |||
Hypolite Petovan | 98900c33d4 | ||
Michael | 7dc9a812f6 | ||
Michael | 7a14d5f7e4 | ||
Michael | 909d516ed4 | ||
52825cb4c4 | |||
dbc72adaf9 | |||
Michael | ba5a288b2d | ||
Tobias Diekershoff | 84043abbda | ||
f212888e90 | |||
Michael | 50c0fd6738 | ||
Hypolite Petovan | 5b5c9ddc74 | ||
Hypolite Petovan | cb992f693c | ||
Hypolite Petovan | ede41166ae | ||
Michael | caa7b6f326 | ||
Michael | 0a6dff0618 | ||
Hypolite Petovan | 9b4ade4542 | ||
Michael | 0153c2a027 | ||
Hypolite Petovan | 1a0f7c15ad | ||
Michael | d5bf306884 | ||
Michael | 4cd2fde6f2 | ||
Michael | 259e7876ad | ||
Hypolite Petovan | 760c7deba3 | ||
Michael | 83306949ac | ||
Michael | c0cd0dc74d | ||
Michael | f7b0a0bef1 | ||
Hypolite Petovan | a9d668cc78 | ||
Michael | 15df9990da | ||
Michael | 91ddb406ab | ||
Hypolite Petovan | d9d42105d6 | ||
Michael | 7924085c94 | ||
Michael | 672186e549 | ||
Michael | 053dfb3e2b | ||
Michael | f1efb8d277 | ||
Hypolite Petovan | b6e958fdcf | ||
Michael | 885b3a12b9 | ||
Michael | fc05daefb5 | ||
Michael | 7faa42882b | ||
Michael | fc22a3e83f | ||
Hypolite Petovan | 8ddc71188f | ||
Michael | b77a5c3eb4 | ||
6a6e2cd2a2 | |||
Michael | 01c04fe2c2 | ||
Michael | e60f3e1a99 | ||
665316c14d | |||
Hypolite Petovan | fef14d96c7 | ||
Michael | c8087a7827 | ||
5a59dff817 | |||
Hypolite Petovan | e9554c32c9 | ||
Raroun | d2f935df1d | ||
ed30d888fa | |||
606bd0be60 | |||
Michael | d29d7c40cd | ||
Michael | 1e3cfca58d | ||
Michael | d6632bb0ea | ||
Michael | 3fe4991fcf | ||
Hypolite Petovan | 0c583574e1 | ||
Michael | 7432e47f7a | ||
25f2ad1b97 | |||
Hypolite Petovan | 391e41d6d6 | ||
Michael | cda1b91b77 | ||
Hypolite Petovan | 50cc2be3d1 | ||
Michael | 7c43b41f0b | ||
Michael | 36313fe35b | ||
Michael | 820674a7ad | ||
Michael | 9bd8d974b3 | ||
Hypolite Petovan | 9af5abaf0b | ||
Michael | 25f45cf116 | ||
Michael | b948b2c7cb | ||
Michael | d2702dfe9c | ||
Hypolite Petovan | 7397b38763 | ||
Hypolite Petovan | 9e738253e7 | ||
120044f3da | |||
Hypolite Petovan | 142a563a80 | ||
Hypolite Petovan | abd5768044 | ||
Michael | f1173853f3 | ||
Michael | ef8461733b | ||
Michael | b8f80a8d25 | ||
Hypolite Petovan | c19af39d8a | ||
e1381cfc5c | |||
Hypolite Petovan | efe1ea5c3c | ||
09edf251ee | |||
Michael | dcb6fa32a1 | ||
Michael | 08ee1e1f63 | ||
Hypolite Petovan | b3e4b9675a | ||
Hypolite Petovan | 0ee87b8116 | ||
Hypolite Petovan | 1191024609 | ||
Michael | 8f9de98c35 | ||
Michael | dc8b87e008 | ||
Michael | 03e831b607 | ||
Hypolite Petovan | 2e5046f8c3 | ||
Michael | 7b638617f1 | ||
Hypolite Petovan | ec6ff7380e | ||
Hypolite Petovan | a0f7625c34 | ||
Michael | 7e88b703d8 | ||
Michael | ad6976a407 | ||
Michael | 39e1f2c0fc | ||
Michael | 5a33a494e8 | ||
Michael | 6389133575 | ||
Michael | 919f97c9a0 | ||
Michael | e9f7ea0afa | ||
Michael | ee9a68e40c | ||
75b37fe376 | |||
Hypolite Petovan | 3a2461322d | ||
Roland Häder | 550b4ce420 | ||
Hypolite Petovan | 28a7884ad9 | ||
Roland Häder | a7bdcc1216 | ||
Roland Häder | 7d3723592b | ||
Roland Häder | 075915e3b7 | ||
Roland Häder | 931c73d3c1 | ||
Roland Häder | 3263a0b98e | ||
Michael | 586a221eb9 | ||
Michael | 63b958dcc6 | ||
Michael | 976ec30417 | ||
Michael | 0c8c03153b | ||
Michael | 23b247d1c3 | ||
Hypolite Petovan | dd534919d7 | ||
Hypolite Petovan | 8fc51cf63e | ||
Michael | f6335590c5 | ||
Michael | a60910be69 | ||
Michael | f83f61f7ac | ||
Hypolite Petovan | 0b93270d7b | ||
Hypolite Petovan | 886e231091 | ||
Hypolite Petovan | 4c402f6af4 | ||
Hypolite Petovan | a0dec23f2d | ||
591f54f64d | |||
5a89cecc5e | |||
540b2b74cc | |||
d19181016f | |||
13d1576dad | |||
6cea1c3472 | |||
893c2e4fd3 | |||
9daf83ce9b | |||
Michael | 9075d7f37d | ||
Michael | 7a13d8b8ac | ||
Hypolite Petovan | 60b81bb6ca | ||
Hypolite Petovan | faa1cbeaf6 | ||
Michael | a12fbf7ff3 | ||
Michael | a2f4b4cd3d | ||
Michael | 7150faa09c | ||
Michael | 5acfff1152 | ||
921bf15419 | |||
36c37e0c62 | |||
Michael | 3b1d636322 | ||
Michael | d4c16b8704 | ||
02123bda98 | |||
5dc49352e8 | |||
Michael | 1fc1e478f8 | ||
Michael | 3a60229e5c | ||
Michael | 98de6ad464 | ||
Michael | 1eeef896fe | ||
Hypolite Petovan | e8c256bcff | ||
Michael | a30b9e6927 | ||
Hypolite Petovan | 728130908e | ||
5cd5fa8403 | |||
Michael | 62975b0ef2 | ||
Michael | cc0b16c0ae | ||
Michael | 43d5409937 | ||
Michael | ad15b7b256 | ||
Michael | 61555657c3 | ||
Michael | dfce85a09f | ||
Michael | b48467c3f8 | ||
b515292b1c | |||
Hannes Heute | 60e1427ffe | ||
Michael | b2dd95affa | ||
Michael | a04dc06aab | ||
Michael | 0b84e0d056 | ||
Hypolite Petovan | 83c187e3ac | ||
Michael | 7a680dd9b7 | ||
Michael | 5dedf5e500 | ||
Michael | 43fa22470c | ||
6fd057fd00 | |||
e6036b8266 | |||
Michael | 7e8aee61ba | ||
Michael | d2a74d1936 | ||
Michael | c4b85ef25a | ||
Michael | 08738e6551 | ||
Michael | da02df20c3 | ||
Michael | 6e830f7774 | ||
Hypolite Petovan | bbd3e75399 | ||
Michael | 6cd0e1e35f | ||
1550ce2764 | |||
Michael | 4aedf7f650 | ||
Michael | aba4a482f0 | ||
Michael | 811a9f01bc | ||
Hypolite Petovan | 2b8126b780 | ||
26f4532d47 | |||
Hypolite Petovan | 16b12e1545 | ||
Michael | 4e1263c1f8 | ||
Michael | 93dd1b5973 | ||
Michael | 31b88da9d5 | ||
Michael | da3d390187 | ||
Hypolite Petovan | 67a9f6269e | ||
foss- | bc67be2b91 | ||
Hypolite Petovan | 4132e7a468 | ||
Hypolite Petovan | 25fecc1945 | ||
Hypolite Petovan | a077418af0 | ||
Hypolite Petovan | 2e81803a52 | ||
Hypolite Petovan | fe39ead790 | ||
d385296e0d | |||
Michael | 7ecf143e4c | ||
Tobias Diekershoff | ffad9c523b | ||
Hypolite Petovan | 21b16ef822 | ||
Hypolite Petovan | 80103bef38 | ||
Hypolite Petovan | 6c023f832b | ||
Michael | 73df36ca72 | ||
Michael | 523247f0fe | ||
Michael | 89e7420237 | ||
Michael | 16d0d17169 | ||
9592292dba | |||
bf80001c80 | |||
hoergen | 4e7f0f9f04 | ||
foss- | 85eb09806f | ||
8fc96477e7 | |||
0c68a53e1e | |||
ad1389b20a | |||
1564c297bb | |||
Hypolite Petovan | 5b516b1dbb | ||
Michael | e88cd16644 | ||
Michael | 40a1263066 | ||
Hypolite Petovan | 2588ac1a16 | ||
Hypolite Petovan | 8d4a16a71c | ||
Michael | ba760bb340 | ||
Michael | 86a27b51ad | ||
Hypolite Petovan | ac1ebac112 | ||
Hypolite Petovan | f4fddb2921 | ||
b26a5ce0fa | |||
6c1df6471a | |||
53c7da87a6 | |||
a609e545b6 | |||
4e3302ea0d | |||
4faa43766d | |||
bfc11495f3 | |||
46d34c53e6 | |||
2bb5785dfa | |||
cc5711b2df | |||
243bcba726 | |||
Michael | cb816bde66 | ||
Hypolite Petovan | 04cdd3e8ec | ||
f23ecaff6a | |||
Tobias Diekershoff | f9c484c642 | ||
Tobias Diekershoff | d2feade9cf | ||
Tobias Diekershoff | 9b62ba6dfe |
3
.gitignore
vendored
|
@ -83,8 +83,9 @@ venv/
|
|||
#Ignore temporary installed phpunit
|
||||
/bin/phpunit
|
||||
|
||||
#Ignore cache file
|
||||
#Ignore cache files
|
||||
.php_cs.cache
|
||||
.php-cs-fixer.cache
|
||||
|
||||
#ignore avatar picture cache path
|
||||
/avatar
|
||||
|
|
93
.php-cs-fixer.dist.php
Normal file
|
@ -0,0 +1,93 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
$finder = PhpCsFixer\Finder::create()
|
||||
->in(__DIR__)
|
||||
->notPath('addon')
|
||||
->notPath('bin/dev')
|
||||
->notPath('config')
|
||||
->notPath('doc')
|
||||
->notPath('images')
|
||||
->notPath('mods')
|
||||
->notPath('spec')
|
||||
->notPath('vendor')
|
||||
->notPath('view/asset')
|
||||
->notPath('lang')
|
||||
->notPath('view/smarty3/compiled');
|
||||
|
||||
$config = new PhpCsFixer\Config();
|
||||
return $config
|
||||
->setRules([
|
||||
'@PSR1' => true,
|
||||
'@PSR2' => true,
|
||||
'@PSR12' => true,
|
||||
'align_multiline_comment' => true,
|
||||
'array_indentation' => true,
|
||||
'array_syntax' => [
|
||||
'syntax' => 'short',
|
||||
],
|
||||
'binary_operator_spaces' => [
|
||||
'default' => 'single_space',
|
||||
'operators' => [
|
||||
'=>' => 'align_single_space_minimal',
|
||||
'=' => 'align_single_space_minimal',
|
||||
'??' => 'align_single_space_minimal',
|
||||
],
|
||||
],
|
||||
'blank_line_after_namespace' => true,
|
||||
'braces' => [
|
||||
'position_after_anonymous_constructs' => 'same',
|
||||
'position_after_control_structures' => 'same',
|
||||
'position_after_functions_and_oop_constructs' => 'next',
|
||||
],
|
||||
'elseif' => true,
|
||||
'encoding' => true,
|
||||
'full_opening_tag' => true,
|
||||
'function_declaration' => [
|
||||
'closure_function_spacing' => 'one',
|
||||
],
|
||||
'indentation_type' => true,
|
||||
'line_ending' => true,
|
||||
'list_syntax' => [
|
||||
'syntax' => 'long',
|
||||
],
|
||||
'lowercase_keywords' => true,
|
||||
'method_argument_space' => [],
|
||||
'no_closing_tag' => true,
|
||||
'no_spaces_after_function_name' => true,
|
||||
'no_spaces_inside_parenthesis' => true,
|
||||
'no_trailing_whitespace' => true,
|
||||
'no_trailing_whitespace_in_comment' => true,
|
||||
'no_unused_imports' => true,
|
||||
'single_blank_line_at_eof' => true,
|
||||
'single_class_element_per_statement' => true,
|
||||
'single_import_per_statement' => true,
|
||||
'single_line_after_imports' => true,
|
||||
'switch_case_space' => true,
|
||||
'ternary_operator_spaces' => false,
|
||||
'visibility_required' => [
|
||||
'elements' => ['property', 'method']
|
||||
],
|
||||
'new_with_braces' => true,
|
||||
])
|
||||
->setFinder($finder)
|
||||
->setIndent("\t");
|
|
@ -6,6 +6,7 @@ require_once __DIR__ . '/bin/dev/php-cs-fixer/vendor/autoload.php';
|
|||
|
||||
$finder = PhpCsFixer\Finder::create()
|
||||
->in(__DIR__)
|
||||
->notPath('addon')
|
||||
->notPath('bin/dev')
|
||||
->notPath('config')
|
||||
->notPath('doc')
|
||||
|
|
|
@ -39,7 +39,7 @@ steps:
|
|||
branch: [ develop, '*-rc' ]
|
||||
event: push
|
||||
composer_install:
|
||||
image: friendicaci/php7.4:php7.4.33
|
||||
image: friendicaci/php8.2:php8.2.16
|
||||
commands:
|
||||
- export COMPOSER_HOME=.composer
|
||||
- composer validate
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
matrix:
|
||||
include:
|
||||
- PHP_MAJOR_VERSION: 7.4
|
||||
PHP_VERSION: 7.4.33
|
||||
- PHP_MAJOR_VERSION: 8.2
|
||||
PHP_VERSION: 8.2.16
|
||||
|
||||
branches:
|
||||
exclude: [ stable ]
|
||||
when:
|
||||
- branch:
|
||||
exclude: [ stable ]
|
||||
|
||||
# This forces CI executions at the "opensocial" labeled location (because of much more power...)
|
||||
labels:
|
||||
|
|
|
@ -8,5 +8,6 @@ steps:
|
|||
commands:
|
||||
- /check-messages.sh
|
||||
|
||||
branches:
|
||||
exclude: [ stable ]
|
||||
when:
|
||||
- branch:
|
||||
exclude: [ stable ]
|
||||
|
|
|
@ -5,9 +5,11 @@ matrix:
|
|||
- PHP_MAJOR_VERSION: 8.0
|
||||
PHP_VERSION: 8.0.30
|
||||
- PHP_MAJOR_VERSION: 8.1
|
||||
PHP_VERSION: 8.1.23
|
||||
PHP_VERSION: 8.1.27
|
||||
- PHP_MAJOR_VERSION: 8.2
|
||||
PHP_VERSION: 8.2.11
|
||||
PHP_VERSION: 8.2.16
|
||||
- PHP_MAJOR_VERSION: 8.3
|
||||
PHP_VERSION: 8.3.3
|
||||
|
||||
# This forces PHP Unit executions at the "opensocial" labeled location (because of much more power...)
|
||||
labels:
|
||||
|
@ -16,7 +18,6 @@ labels:
|
|||
steps:
|
||||
php-lint:
|
||||
image: php:${PHP_MAJOR_VERSION}
|
||||
group: lint
|
||||
commands:
|
||||
- find . -name \*.php -not -path './vendor/*' -not -path './view/asset/*' -print0 | xargs -0 -n1 php -l
|
||||
restore_cache:
|
||||
|
@ -64,7 +65,7 @@ steps:
|
|||
- cp config/local-sample.config.php config/local.config.php
|
||||
- if ! bin/wait-for-connection $MYSQL_HOST $MYSQL_PORT 300; then echo "[ERROR] Waited 300 seconds, no response" >&2; exit 1; fi
|
||||
- mysql -h$MYSQL_HOST -P$MYSQL_PORT -p$MYSQL_PASSWORD -u$MYSQL_USER $MYSQL_DATABASE < database.sql
|
||||
- if [ "${PHP_MAJOR_VERSION}" = "7.4" -a "${CI_REPO}" = "friendica/friendica" ]; then
|
||||
- if [ "${PHP_MAJOR_VERSION}" = "8.2" -a "${CI_REPO}" = "friendica/friendica" ]; then
|
||||
phpenmod xdebug;
|
||||
export XDEBUG_MODE=coverage;
|
||||
phpunit --configuration tests/phpunit.xml -d memory_limit=-1 --coverage-clover clover.xml;
|
||||
|
@ -75,8 +76,8 @@ steps:
|
|||
image: friendicaci/codecov
|
||||
when:
|
||||
matrix:
|
||||
PHP_MAJOR_VERSION: 7.4
|
||||
PHP_VERSION: 7.4.33
|
||||
PHP_MAJOR_VERSION: 8.2
|
||||
PHP_VERSION: 8.2.16
|
||||
repo:
|
||||
- friendica/friendica
|
||||
commands:
|
||||
|
|
|
@ -37,7 +37,7 @@ steps:
|
|||
branch: stable
|
||||
event: tag
|
||||
composer_install:
|
||||
image: friendicaci/php7.4:php7.4.33
|
||||
image: friendicaci/php8.2:php8.2.16
|
||||
commands:
|
||||
- export COMPOSER_HOME=.composer
|
||||
- composer validate
|
||||
|
|
71
CHANGELOG
|
@ -1,4 +1,73 @@
|
|||
Version 2023.12 (unreleased)
|
||||
Version 2024.06 (unreleased)
|
||||
Friendica Core
|
||||
|
||||
Friendica Addons
|
||||
|
||||
Closed Issues
|
||||
|
||||
Version 2024.03 (2024-03-21)
|
||||
Friendica Core
|
||||
Updates to the translations AR, BG, CS, DE, EO, ES, FR, GD, HU, IS, IT, JA, PL, RO, RU, SV
|
||||
Updates to the themes (frio, vier) [annando, foss-, haheute, MrPetovan, Raroun, toddy15]
|
||||
Improved the channel feature [annando]
|
||||
Improved the search performance [annando]
|
||||
Improved spam detection [annando]
|
||||
Improved the account overview on the moderation page [annando]
|
||||
Improved account creation via CLI console [mexon]
|
||||
Improved the Mastodon compatible API [annando, MrPetovan]
|
||||
Improved logging of the system load value [annando]
|
||||
Improved image handling [annando]
|
||||
Improved detection of user activity [annando]
|
||||
Improved display of embedded videos [annando]
|
||||
Fixed an issue that could lead to empty URLs in the server block list [annando]
|
||||
Fixed XSS attacks [leoOliver, MrPetovan, snajafov]
|
||||
Fixed an issue when importing emails [annando]
|
||||
Fixed an issue that blocked users could still use the API [annando]
|
||||
Fixed an issue when fetching remote content [annando, arcanicanis]
|
||||
Fixed an issue with unescaped HTML characters for RSS feeds [MrPetovan, r1pu5u]
|
||||
Fixed an issue when showing the post preview [annando]
|
||||
General code cleanup [annando, MrPetovan]
|
||||
Updated the PasswordExposed usage [mexon]
|
||||
Removed fpostit (Friendica post bookmarklet) [MrPetovan]
|
||||
Removed the possibility for users to follow relays directly [annando]
|
||||
Removed unused OEmbed functionality [annando]
|
||||
Removed legacy schemes from frio theme [MrPetovan]
|
||||
Added blur effect to sensitive images and user setting against it [annando]
|
||||
Added account type Channel Relay [annando]
|
||||
Added OCR generated image descriptions via tesseract addon [annando]
|
||||
Added WebP and BMP support [annando]
|
||||
Added blocked email addresses for registration [annando]
|
||||
|
||||
Friendica Addons
|
||||
advancedcontentfilter
|
||||
Updated dependency for PHP8.2 compatibility [MrPetovan]
|
||||
blockbot
|
||||
Fixed an issue preventing the creation of previews on remote systems [annando]
|
||||
Updated block lists [annando]
|
||||
bluesky
|
||||
Overhaul of the Bluesky connector [annando]
|
||||
Fixed problem with empty quoted shares [annando]
|
||||
openstreetmap
|
||||
Fix a config problem [haheute]
|
||||
pnut:
|
||||
Connector addon was added [spacenerdmo]
|
||||
tesseract
|
||||
Added the addon to generate image descriptions from images via OCR [annando]
|
||||
tumblr
|
||||
Improved handling of quoted shares [annando]
|
||||
url_replace
|
||||
Added addon to replace URLs from Twitter, Youtube and some others using 12ft.io [toddy15]
|
||||
Fixed an issue with empty config vars [MrPetovan]
|
||||
|
||||
Closed Issues
|
||||
903, 7732, 8768, 11142, 13220, 13293, 13765, 13768, 13809,
|
||||
13814, 13814, 13818, 13819, 13822, 13823, 13828, 13837, 13839,
|
||||
13844, 13845, 13859, 13863, 13873, 13877, 13886, 13887, 13897,
|
||||
13899, 13905, 13909, 13922, 13925, 13930, 13939, 13940, 13946,
|
||||
13947, 13949, 13950, 13953, 13955, 13959, 13968, 13969, 13972,
|
||||
13984, 13985, 13986
|
||||
|
||||
Version 2023.12 (2023-12-24)
|
||||
Friendica Core
|
||||
Raised minimal PHP version to 7.4
|
||||
Updates to the translations AR, BG, CA, CS, DE, EN GB, EN US, EO, ES, ET, FI, FR, GD, HU, IS, IT, JA, NL, PL, RO, RU, SV
|
||||
|
|
|
@ -32,6 +32,7 @@ Anthronaut
|
|||
Anton
|
||||
Antron Samurai
|
||||
Anubis2814
|
||||
arcanicanis
|
||||
Arian - Cazare Muncitori
|
||||
Asher Pen
|
||||
atjn
|
||||
|
@ -136,6 +137,7 @@ gudzpoz
|
|||
GunChleoc
|
||||
guzzisti
|
||||
Haakon Meland Eriksen
|
||||
haheute
|
||||
Hank Grabowski
|
||||
Hannes Heute
|
||||
Hans Meine
|
||||
|
@ -147,6 +149,7 @@ hlad
|
|||
hoergen
|
||||
Hubert Kościański
|
||||
Hypolite Petovan
|
||||
ike
|
||||
Ilmari
|
||||
ImgBotApp
|
||||
irhen
|
||||
|
@ -222,6 +225,7 @@ Michal Šupler
|
|||
Michalina
|
||||
Mike Macgirvin
|
||||
miqrogroove
|
||||
Morgan McMillian
|
||||
mpanhans
|
||||
mytbk
|
||||
nathilia-peirce
|
||||
|
@ -255,8 +259,10 @@ Pierre Bernardeau
|
|||
Pierre Rudloff
|
||||
Piotr Blonkowski
|
||||
Piotr Strębski
|
||||
pixelroot
|
||||
pokerazor
|
||||
R C
|
||||
r1pu5u
|
||||
Rabuzarus
|
||||
Radek
|
||||
Rafael Garau
|
||||
|
@ -294,9 +300,11 @@ Senex Petrovic
|
|||
Seth
|
||||
SickShark X
|
||||
Silke Meyer
|
||||
Simon
|
||||
Simon L'nu
|
||||
Simon Rupf
|
||||
Simó Albert i Beltran
|
||||
snajafov
|
||||
softmetz
|
||||
soko1
|
||||
Spencer Dub
|
||||
|
|
23
README.md
|
@ -3,27 +3,28 @@ Friendica - your open and free social network
|
|||
|
||||
Welcome to the free social web. Friendica is a platform for decentralised social communication linking to other independent social and corporate services.
|
||||
|
||||
Friendica connects you to a federated communications network of thousands of servers called the Fediverse. Through various protocols you can interact with anyone on [Friendica]( https://friendi.ca), [Mastodon](https://joinmastodon.org), [Lemmy](https://join-lemmy.org/), [Diaspora](https://diasporafoundation.org), [Misskey](https://join.misskey.page), [Peertube](https://joinpeertube.org/), [Pixelfed](https://pixelfed.org/), [Pleroma](https://pleroma.social) and many more. Receiving content from Tumblr, Wordpress and RSS is also possible. Friendica allows to import and mirror your content via add-ons such as ITTT and Buffer. You can customize and control how publicly or privately you want to share your content.
|
||||
Friendica connects you to a federated communications network of thousands of servers called the Fediverse.
|
||||
Through various protocols you can interact with anyone on [Friendica]( https://friendi.ca), [Mastodon](https://joinmastodon.org), [Lemmy](https://join-lemmy.org/), [Diaspora](https://diasporafoundation.org), [Misskey](https://join.misskey.page), [Peertube](https://joinpeertube.org/), [Pixelfed](https://pixelfed.org/), [Pleroma](https://pleroma.social) and many more.
|
||||
Receiving content from Tumblr, WordPress and RSS is also possible.
|
||||
Friendica allows to import and mirror your content via add-ons such as ITTT and Buffer.
|
||||
You can control the privacy scope of your content.
|
||||
|
||||
Being part of the Fediverse allows you to be free from data-harvesting corporations. Enjoy open social communication, independent of any specific provider.
|
||||
Being part of the Fediverse allows you to be free from data-harvesting corporations.
|
||||
Enjoy open social communication, independent of any specific provider.
|
||||
|
||||
[Join Friendica](https://dir.friendica.social/servers) today or setup [your own Friendica instance](doc/Install.md).
|
||||
[Join Friendica](https://dir.friendica.social/servers) today or set up [your own Friendica instance](doc/Install.md).
|
||||
|
||||
### Friendica on desktop
|
||||
|
||||
![Frio theme in desktop browser](images/screenshots/friendica-2023-10-frio-desktop.png?raw=true "Frio theme in desktop browser")
|
||||
![Frio theme in desktop browser](images/screenshots/friendica-2023-12-frio-desktop.png?raw=true "Frio theme in desktop browser")
|
||||
|
||||
### Friendica on mobile
|
||||
|
||||
<p float="left">
|
||||
<img src ="https://github.com/friendica/friendica/blob/2023.09-rc/images/screenshots/friendica-2023-10-frio-mobile-timeline-dark-blue.png" width="370" alt="frio on mobile, dark color scheme">
|
||||
<img src="https://github.com/friendica/friendica/blob/2023.09-rc/images/screenshots/friendica-2023-10-frio-mobile-options-light-blue.png" width="370" alt="frio on mobile, light color scheme">
|
||||
<img src="images/screenshots/friendica-2023-10-frio-mobile-timeline-dark-blue.png" width="370" alt="frio on mobile, dark color scheme">
|
||||
<img src="images/screenshots/friendica-2023-10-frio-mobile-options-light-blue.png" width="370" alt="frio on mobile, light color scheme">
|
||||
</p>
|
||||
|
||||
### Alternative Theme "Vier"
|
||||
|
||||
![Vier theme in desktop browser](images/screenshots/friendica-vier-community.png?raw=true "Vier theme in desktop browser")
|
||||
|
||||
## Endorsements
|
||||
|
||||
- [![Awesome Humane Tech](images/humane-tech-badge.svg)](https://codeberg.org/teaserbot-labs/delightful-humane-design) In August 2020 Friendica was added to the curated delightful humane design resources in the [Fediverse category](https://codeberg.org/teaserbot-labs/delightful-humane-design#fediverse).
|
||||
- Friendica is listed on [![Awesome Humane Tech](images/humane-tech-badge.svg)](https://codeberg.org/teaserbot-labs/delightful-humane-design) in the [Fediverse category](https://codeberg.org/teaserbot-labs/delightful-humane-design#fediverse).
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/env php
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/env php
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/env php
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -138,9 +138,9 @@ function execute_tests() {
|
|||
if [ -n "${USEDOCKER}" ]; then
|
||||
echo "Fire up the mysql docker"
|
||||
DOCKER_CONTAINER_ID=$(docker run \
|
||||
-e MYSQL_ROOT_PASSWORD=friendica \
|
||||
-e MYSQL_ROOT_PASSWORD="${DATABASE_PASSWORD}" \
|
||||
-e MYSQL_USER="${DATABASE_USER}" \
|
||||
-e MYSQL_PASSWORD=friendica \
|
||||
-e MYSQL_PASSWORD="${DATABASE_PASSWORD}" \
|
||||
-e MYSQL_DATABASE="${DATABASE_NAME}" \
|
||||
-d mysql)
|
||||
DATABASE_HOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "${DOCKER_CONTAINER_ID}")
|
||||
|
@ -152,8 +152,8 @@ function execute_tests() {
|
|||
echo "To use the docker container set the USEDOCKER environment variable"
|
||||
exit 3
|
||||
fi
|
||||
mysql -u "${DATABASE_USER}" -pfriendica -e "DROP DATABASE IF EXISTS ${DATABASE_NAME}" -h ${DATABASE_HOST} || true
|
||||
mysql -u "${DATABASE_USER}" -pfriendica -e "CREATE DATABASE ${DATABASE_NAME} DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci" -h ${DATABASE_HOST}
|
||||
mysql -u "${DATABASE_USER}" -p"${DATABASE_PASSWORD}" -e "DROP DATABASE IF EXISTS ${DATABASE_NAME}" -h ${DATABASE_HOST} || true
|
||||
mysql -u "${DATABASE_USER}" -p"${DATABASE_PASSWORD}" -e "CREATE DATABASE ${DATABASE_NAME} DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci" -h ${DATABASE_HOST}
|
||||
else
|
||||
DATABASE_HOST=mysql
|
||||
fi
|
||||
|
@ -171,9 +171,9 @@ function execute_tests() {
|
|||
if [ -n "${USEDOCKER}" ]; then
|
||||
echo "Fire up the mariadb docker"
|
||||
DOCKER_CONTAINER_ID=$(docker run \
|
||||
-e MYSQL_ROOT_PASSWORD=friendica \
|
||||
-e MYSQL_ROOT_PASSWORD="${DATABASE_PASSWORD}" \
|
||||
-e MYSQL_USER="${DATABASE_USER}" \
|
||||
-e MYSQL_PASSWORD=friendica \
|
||||
-e MYSQL_PASSWORD="${DATABASE_PASSWORD}" \
|
||||
-e MYSQL_DATABASE="${DATABASE_NAME}" \
|
||||
-d mariadb)
|
||||
DATABASE_HOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "${DOCKER_CONTAINER_ID}")
|
||||
|
@ -185,8 +185,8 @@ function execute_tests() {
|
|||
echo "To use the docker container set the USEDOCKER environment variable"
|
||||
exit 3
|
||||
fi
|
||||
mysql -u "${DATABASE_USER}" -pfriendica -e "DROP DATABASE IF EXISTS ${DATABASE_NAME}" -h ${DATABASE_HOST} || true
|
||||
mysql -u "${DATABASE_USER}" -pfriendica -e "CREATE DATABASE ${DATABASE_NAME} DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci" -h ${DATABASE_HOST}
|
||||
mysql -u "${DATABASE_USER}" -p"${DATABASE_PASSWORD}" -e "DROP DATABASE IF EXISTS ${DATABASE_NAME}" -h ${DATABASE_HOST} || true
|
||||
mysql -u "${DATABASE_USER}" -p"${DATABASE_PASSWORD}" -e "CREATE DATABASE ${DATABASE_NAME} DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci" -h ${DATABASE_HOST}
|
||||
else
|
||||
DATABASE_HOST=mariadb
|
||||
fi
|
||||
|
@ -203,14 +203,14 @@ function execute_tests() {
|
|||
|
||||
if [ -n "${USEDOCKER}" ]; then
|
||||
echo "Initialize database..."
|
||||
docker exec ${DOCKER_CONTAINER_ID} mysql -u root -pfriendica -e "CREATE DATABASE IF NOT EXISTS ${DATABASE_NAME};"
|
||||
docker exec ${DOCKER_CONTAINER_ID} mysql -u root -p"${DATABASE_PASSWORD}" -e "CREATE DATABASE IF NOT EXISTS ${DATABASE_NAME};"
|
||||
fi
|
||||
|
||||
export MYSQL_HOST="${DATABASE_HOST}"
|
||||
|
||||
#call installer
|
||||
echo "Installing Friendica..."
|
||||
"${PHP}" ./bin/console.php autoinstall --dbuser="${DATABASE_USER}" --dbpass=friendica --dbdata="${DATABASE_NAME}" --dbhost="${DATABASE_HOST}" --url=https://friendica.local --admin=admin@friendica.local
|
||||
"${PHP}" ./bin/console.php autoinstall --dbuser="${DATABASE_USER}" --dbpass="${DATABASE_PASSWORD}" --dbdata="${DATABASE_NAME}" --dbhost="${DATABASE_HOST}" --url=https://friendica.local --admin=admin@friendica.local
|
||||
fi
|
||||
|
||||
#test execution
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/php
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/env php
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -29,12 +29,12 @@
|
|||
"ext-xml": "*",
|
||||
"asika/simple-console": "^1.0",
|
||||
"bacon/bacon-qr-code": "^2.0.0",
|
||||
"divineomega/password_exposed": "^2.8",
|
||||
"divineomega/password_exposed": "^3",
|
||||
"enyo/dropzone": "^5.9",
|
||||
"ezyang/htmlpurifier": "^4.7",
|
||||
"friendica/json-ld": "^1.0",
|
||||
"geekwright/po": "^2.0",
|
||||
"guzzlehttp/guzzle": "^6.5",
|
||||
"guzzlehttp/guzzle": "^7",
|
||||
"guzzlehttp/oauth-subscriber": "^0.6",
|
||||
"kornrunner/blurhash": "^1.2",
|
||||
"league/html-to-markdown": "^4.8",
|
||||
|
@ -135,7 +135,8 @@
|
|||
"mockery/mockery": "^1.3",
|
||||
"mikey179/vfsstream": "^1.6",
|
||||
"phpunit/phpunit": "^9",
|
||||
"dms/phpunit-arraysubset-asserts": "^0.3.1"
|
||||
"dms/phpunit-arraysubset-asserts": "^0.3.1",
|
||||
"friendsofphp/php-cs-fixer": "^3.46"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "phpunit",
|
||||
|
@ -149,6 +150,8 @@
|
|||
"cs:fix": [
|
||||
"@cs:install",
|
||||
"bin/dev/php-cs-fixer/vendor/bin/php-cs-fixer fix"
|
||||
]
|
||||
],
|
||||
"cs:check-v3": "vendor/bin/php-cs-fixer check --diff",
|
||||
"cs:fix-v3": "vendor/bin/php-cs-fixer fix"
|
||||
}
|
||||
}
|
||||
|
|
2344
composer.lock
generated
663
database.sql
|
@ -1,6 +1,6 @@
|
|||
-- ------------------------------------------
|
||||
-- Friendica 2023.12 (Yellow archangel)
|
||||
-- DB_UPDATE_VERSION 1542
|
||||
-- Friendica 2024.06-dev (Yellow Archangel)
|
||||
-- DB_UPDATE_VERSION 1565
|
||||
-- ------------------------------------------
|
||||
|
||||
|
||||
|
@ -23,6 +23,8 @@ CREATE TABLE IF NOT EXISTS `gserver` (
|
|||
`local-comments` int unsigned COMMENT 'Number of local comments',
|
||||
`directory-type` tinyint DEFAULT 0 COMMENT 'Type of directory service (Poco, Mastodon)',
|
||||
`poco` varbinary(383) NOT NULL DEFAULT '' COMMENT '',
|
||||
`openwebauth` varbinary(383) COMMENT 'Path to the OpenWebAuth endpoint',
|
||||
`authredirect` varbinary(383) COMMENT 'Path to the authRedirect endpoint',
|
||||
`noscrape` varbinary(383) NOT NULL DEFAULT '' COMMENT '',
|
||||
`network` char(4) NOT NULL DEFAULT '' COMMENT '',
|
||||
`protocol` tinyint unsigned COMMENT 'The protocol of the server',
|
||||
|
@ -73,8 +75,6 @@ CREATE TABLE IF NOT EXISTS `user` (
|
|||
`blockwall` boolean NOT NULL DEFAULT '0' COMMENT 'Prohibit contacts to post to the profile page of the user',
|
||||
`hidewall` boolean NOT NULL DEFAULT '0' COMMENT 'Hide profile details from unknown viewers',
|
||||
`blocktags` boolean NOT NULL DEFAULT '0' COMMENT 'Prohibit contacts to tag the post of this user',
|
||||
`unkmail` boolean NOT NULL DEFAULT '0' COMMENT 'Permit unknown people to send private mails to this user',
|
||||
`cntunkmail` int unsigned NOT NULL DEFAULT 10 COMMENT '',
|
||||
`notify-flags` smallint unsigned NOT NULL DEFAULT 65535 COMMENT 'email notification options',
|
||||
`page-flags` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'page/profile type',
|
||||
`account-type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
|
||||
|
@ -504,8 +504,13 @@ CREATE TABLE IF NOT EXISTS `channel` (
|
|||
`access-key` varchar(1) COMMENT 'Access key',
|
||||
`include-tags` varchar(1023) COMMENT 'Comma separated list of tags that will be included in the channel',
|
||||
`exclude-tags` varchar(1023) COMMENT 'Comma separated list of tags that aren\'t allowed in the channel',
|
||||
`min-size` int unsigned COMMENT 'Minimum post size',
|
||||
`max-size` int unsigned COMMENT 'Maximum post size',
|
||||
`full-text-search` varchar(1023) COMMENT 'Full text search pattern, see https://mariadb.com/kb/en/full-text-index-overview/#in-boolean-mode',
|
||||
`media-type` smallint unsigned COMMENT 'Filtered media types',
|
||||
`languages` mediumtext COMMENT 'Desired languages',
|
||||
`publish` boolean COMMENT 'publish channel content',
|
||||
`valid` boolean COMMENT 'Set, when the full-text-search is valid',
|
||||
PRIMARY KEY(`id`),
|
||||
INDEX `uid` (`uid`),
|
||||
FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
|
@ -536,6 +541,7 @@ CREATE TABLE IF NOT EXISTS `contact-relation` (
|
|||
`relation-score` smallint unsigned COMMENT 'score for interactions of relation-cid on cid',
|
||||
`thread-score` smallint unsigned COMMENT 'score for interactions of cid on threads of relation-cid',
|
||||
`relation-thread-score` smallint unsigned COMMENT 'score for interactions of relation-cid on threads of cid',
|
||||
`post-score` smallint unsigned COMMENT 'score for the amount of posts from cid that can be seen by relation-cid',
|
||||
PRIMARY KEY(`cid`,`relation-cid`),
|
||||
INDEX `relation-cid` (`relation-cid`),
|
||||
FOREIGN KEY (`cid`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
|
||||
|
@ -1236,6 +1242,23 @@ CREATE TABLE IF NOT EXISTS `post-category` (
|
|||
FOREIGN KEY (`tid`) REFERENCES `tag` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='post relation to categories';
|
||||
|
||||
--
|
||||
-- TABLE post-counts
|
||||
--
|
||||
CREATE TABLE IF NOT EXISTS `post-counts` (
|
||||
`uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
|
||||
`vid` smallint unsigned NOT NULL COMMENT 'Id of the verb table entry that contains the activity verbs',
|
||||
`reaction` varchar(4) NOT NULL COMMENT 'Emoji Reaction',
|
||||
`parent-uri-id` int unsigned COMMENT 'Id of the item-uri table that contains the parent uri',
|
||||
`count` int unsigned DEFAULT 0 COMMENT 'Number of activities',
|
||||
PRIMARY KEY(`uri-id`,`vid`,`reaction`),
|
||||
INDEX `vid` (`vid`),
|
||||
INDEX `parent-uri-id` (`parent-uri-id`),
|
||||
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
|
||||
FOREIGN KEY (`vid`) REFERENCES `verb` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT,
|
||||
FOREIGN KEY (`parent-uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Original remote activity';
|
||||
|
||||
--
|
||||
-- TABLE post-collection
|
||||
--
|
||||
|
@ -1263,6 +1286,7 @@ CREATE TABLE IF NOT EXISTS `post-content` (
|
|||
`location` varchar(255) NOT NULL DEFAULT '' COMMENT 'text location where this item originated',
|
||||
`coord` varchar(255) NOT NULL DEFAULT '' COMMENT 'longitude/latitude pair representing location where this item originated',
|
||||
`language` text COMMENT 'Language information about this post',
|
||||
`sensitive` boolean COMMENT 'If true, this post contains sensitive content',
|
||||
`app` varchar(255) NOT NULL DEFAULT '' COMMENT 'application which generated this item',
|
||||
`rendered-hash` varchar(32) NOT NULL DEFAULT '' COMMENT '',
|
||||
`rendered-html` mediumtext COMMENT 'item.body converted to html',
|
||||
|
@ -1275,7 +1299,6 @@ CREATE TABLE IF NOT EXISTS `post-content` (
|
|||
PRIMARY KEY(`uri-id`),
|
||||
INDEX `plink` (`plink`(191)),
|
||||
INDEX `resource-id` (`resource-id`),
|
||||
FULLTEXT INDEX `title-content-warning-body` (`title`,`content-warning`,`body`),
|
||||
INDEX `quote-uri-id` (`quote-uri-id`),
|
||||
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
|
||||
FOREIGN KEY (`quote-uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
|
@ -1326,10 +1349,12 @@ CREATE TABLE IF NOT EXISTS `post-engagement` (
|
|||
`uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
|
||||
`owner-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'Item owner',
|
||||
`contact-type` tinyint NOT NULL DEFAULT 0 COMMENT 'Person, organisation, news, community, relay',
|
||||
`media-type` tinyint NOT NULL DEFAULT 0 COMMENT 'Type of media in a bit array (1 = image, 2 = video, 4 = audio',
|
||||
`language` varbinary(128) COMMENT 'Language information about this post',
|
||||
`media-type` tinyint NOT NULL DEFAULT 0 COMMENT 'Type of media in a bit array (1 = image, 2 = video, 4 = audio)',
|
||||
`language` char(2) COMMENT 'Language information about this post in the ISO 639-1 format',
|
||||
`searchtext` mediumtext COMMENT 'Simplified text for the full text search',
|
||||
`size` int unsigned COMMENT 'Body size',
|
||||
`created` datetime COMMENT '',
|
||||
`network` char(4) COMMENT '',
|
||||
`restricted` boolean NOT NULL DEFAULT '0' COMMENT 'If true, this post is either unlisted or not from a federated network',
|
||||
`comments` mediumint unsigned COMMENT 'Number of comments',
|
||||
`activities` mediumint unsigned COMMENT 'Number of activities (like, dislike, ...)',
|
||||
|
@ -1416,6 +1441,36 @@ CREATE TABLE IF NOT EXISTS `post-media` (
|
|||
FOREIGN KEY (`media-uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Attached media';
|
||||
|
||||
--
|
||||
-- TABLE post-origin
|
||||
--
|
||||
CREATE TABLE IF NOT EXISTS `post-origin` (
|
||||
`id` int unsigned NOT NULL,
|
||||
`uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
|
||||
`uid` mediumint unsigned NOT NULL COMMENT 'Owner id which owns this copy of the item',
|
||||
`parent-uri-id` int unsigned COMMENT 'Id of the item-uri table that contains the parent uri',
|
||||
`thr-parent-id` int unsigned COMMENT 'Id of the item-uri table that contains the thread parent uri',
|
||||
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Creation timestamp.',
|
||||
`received` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'datetime',
|
||||
`gravity` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
|
||||
`vid` smallint unsigned COMMENT 'Id of the verb table entry that contains the activity verbs',
|
||||
`private` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '0=public, 1=private, 2=unlisted',
|
||||
`wall` boolean NOT NULL DEFAULT '0' COMMENT 'This item was posted to the wall of uid',
|
||||
PRIMARY KEY(`id`),
|
||||
UNIQUE INDEX `uid_uri-id` (`uid`,`uri-id`),
|
||||
INDEX `uri-id` (`uri-id`),
|
||||
INDEX `parent-uri-id` (`parent-uri-id`),
|
||||
INDEX `thr-parent-id` (`thr-parent-id`),
|
||||
INDEX `vid` (`vid`),
|
||||
INDEX `parent-uri-id_uid` (`parent-uri-id`,`uid`),
|
||||
INDEX `uid_wall_received` (`uid`,`wall`,`received`),
|
||||
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
|
||||
FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
|
||||
FOREIGN KEY (`parent-uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
|
||||
FOREIGN KEY (`thr-parent-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
|
||||
FOREIGN KEY (`vid`) REFERENCES `verb` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Posts from local users';
|
||||
|
||||
--
|
||||
-- TABLE post-question
|
||||
--
|
||||
|
@ -1442,6 +1497,26 @@ CREATE TABLE IF NOT EXISTS `post-question-option` (
|
|||
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Question option';
|
||||
|
||||
--
|
||||
-- TABLE post-searchindex
|
||||
--
|
||||
CREATE TABLE IF NOT EXISTS `post-searchindex` (
|
||||
`uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
|
||||
`owner-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'Item owner',
|
||||
`media-type` tinyint NOT NULL DEFAULT 0 COMMENT 'Type of media in a bit array (1 = image, 2 = video, 4 = audio)',
|
||||
`language` char(2) COMMENT 'Language information about this post in the ISO 639-1 format',
|
||||
`searchtext` mediumtext COMMENT 'Simplified text for the full text search',
|
||||
`size` int unsigned COMMENT 'Body size',
|
||||
`created` datetime COMMENT '',
|
||||
`restricted` boolean NOT NULL DEFAULT '0' COMMENT 'If true, this post is either unlisted or not from a federated network',
|
||||
PRIMARY KEY(`uri-id`),
|
||||
INDEX `owner-id` (`owner-id`),
|
||||
INDEX `created` (`created`),
|
||||
FULLTEXT INDEX `searchtext` (`searchtext`),
|
||||
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
|
||||
FOREIGN KEY (`owner-id`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Content for all posts';
|
||||
|
||||
--
|
||||
-- TABLE post-tag
|
||||
--
|
||||
|
@ -1507,6 +1582,7 @@ CREATE TABLE IF NOT EXISTS `post-user` (
|
|||
`post-reason` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'Reason why the post arrived at the user',
|
||||
`vid` smallint unsigned COMMENT 'Id of the verb table entry that contains the activity verbs',
|
||||
`private` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '0=public, 1=private, 2=unlisted',
|
||||
`restrictions` tinyint unsigned COMMENT 'Bit array of post restrictions (1 = Reply, 2 = Like, 4 = Announce)',
|
||||
`global` boolean NOT NULL DEFAULT '0' COMMENT '',
|
||||
`visible` boolean NOT NULL DEFAULT '0' COMMENT '',
|
||||
`deleted` boolean NOT NULL DEFAULT '0' COMMENT 'item has been marked for deletion',
|
||||
|
@ -1693,7 +1769,6 @@ CREATE TABLE IF NOT EXISTS `profile` (
|
|||
`net-publish` boolean NOT NULL DEFAULT '0' COMMENT 'publish profile in global directory',
|
||||
PRIMARY KEY(`id`),
|
||||
INDEX `uid_is-default` (`uid`,`is-default`),
|
||||
FULLTEXT INDEX `pub_keywords` (`pub_keywords`),
|
||||
FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='user profiles data';
|
||||
|
||||
|
@ -1905,6 +1980,7 @@ CREATE TABLE IF NOT EXISTS `user-contact` (
|
|||
`ignored` boolean COMMENT 'Posts from this contact are ignored',
|
||||
`collapsed` boolean COMMENT 'Posts from this contact are collapsed',
|
||||
`hidden` boolean COMMENT 'This contact is hidden from the others',
|
||||
`channel-only` boolean COMMENT 'This contact is displayed only in channels, but not in the network stream.',
|
||||
`is-blocked` boolean COMMENT 'User is blocked by this contact',
|
||||
`channel-frequency` tinyint unsigned COMMENT 'Controls the frequency of the appearance of this contact in channels',
|
||||
`pending` boolean COMMENT '',
|
||||
|
@ -1975,7 +2051,8 @@ CREATE VIEW `application-view` AS SELECT
|
|||
`application-token`.`follow` AS `follow`,
|
||||
`application-token`.`push` AS `push`
|
||||
FROM `application-token`
|
||||
INNER JOIN `application` ON `application-token`.`application-id` = `application`.`id`;
|
||||
INNER JOIN `application` ON `application-token`.`application-id` = `application`.`id`
|
||||
INNER JOIN `user` ON `user`.`uid` = `application-token`.`uid` AND `user`.`verified` AND NOT `user`.`blocked` AND NOT `user`.`account_removed` AND NOT `user`.`account_expired`;
|
||||
|
||||
--
|
||||
-- VIEW circle-member-view
|
||||
|
@ -2008,6 +2085,52 @@ CREATE VIEW `circle-member-view` AS SELECT
|
|||
INNER JOIN `contact` ON `group_member`.`contact-id` = `contact`.`id`
|
||||
INNER JOIN `group` ON `group_member`.`gid` = `group`.`id`;
|
||||
|
||||
--
|
||||
-- VIEW post-counts-view
|
||||
--
|
||||
DROP VIEW IF EXISTS `post-counts-view`;
|
||||
CREATE VIEW `post-counts-view` AS SELECT
|
||||
`post-counts`.`uri-id` AS `uri-id`,
|
||||
`post-counts`.`vid` AS `vid`,
|
||||
`verb`.`name` AS `verb`,
|
||||
`post-counts`.`reaction` AS `reaction`,
|
||||
`post-counts`.`parent-uri-id` AS `parent-uri-id`,
|
||||
`post-counts`.`count` AS `count`
|
||||
FROM `post-counts`
|
||||
INNER JOIN `verb` ON `verb`.`id` = `post-counts`.`vid`;
|
||||
|
||||
--
|
||||
-- VIEW post-engagement-user-view
|
||||
--
|
||||
DROP VIEW IF EXISTS `post-engagement-user-view`;
|
||||
CREATE VIEW `post-engagement-user-view` AS SELECT
|
||||
`post-thread-user`.`uid` AS `uid`,
|
||||
`post-engagement`.`uri-id` AS `uri-id`,
|
||||
`post-engagement`.`owner-id` AS `owner-id`,
|
||||
`post-engagement`.`media-type` AS `media-type`,
|
||||
`post-engagement`.`language` AS `language`,
|
||||
`post-engagement`.`searchtext` AS `searchtext`,
|
||||
`post-engagement`.`size` AS `size`,
|
||||
`post-thread-user`.`commented` AS `commented`,
|
||||
`post-thread-user`.`received` AS `received`,
|
||||
`post-thread-user`.`created` AS `created`,
|
||||
`post-thread-user`.`network` AS `network`,
|
||||
`post-engagement`.`language` AS `restricted`,
|
||||
0 AS `comments`,
|
||||
0 AS `activities`
|
||||
FROM `post-thread-user`
|
||||
INNER JOIN `post-engagement` ON `post-engagement`.`uri-id` = `post-thread-user`.`uri-id`
|
||||
INNER JOIN `post-user` ON `post-user`.`id` = `post-thread-user`.`post-user-id`
|
||||
STRAIGHT_JOIN `contact` ON `contact`.`id` = `post-thread-user`.`contact-id`
|
||||
STRAIGHT_JOIN `contact` AS `authorcontact` ON `authorcontact`.`id` = `post-thread-user`.`author-id`
|
||||
STRAIGHT_JOIN `contact` AS `ownercontact` ON `ownercontact`.`id` = `post-thread-user`.`owner-id`
|
||||
WHERE `post-user`.`visible` AND NOT `post-user`.`deleted`
|
||||
AND (NOT `contact`.`readonly` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`)
|
||||
AND (`post-thread-user`.`hidden` IS NULL OR NOT `post-thread-user`.`hidden`)
|
||||
AND NOT `authorcontact`.`blocked` AND NOT `ownercontact`.`blocked`
|
||||
AND NOT EXISTS(SELECT `cid` FROM `user-contact` WHERE `uid` = `post-thread-user`.`uid` AND `cid` IN (`authorcontact`.`id`, `ownercontact`.`id`) AND (`blocked` OR `ignored`))
|
||||
AND NOT EXISTS(SELECT `gsid` FROM `user-gserver` WHERE `uid` = `post-thread-user`.`uid` AND `gsid` IN (`authorcontact`.`gsid`, `ownercontact`.`gsid`) AND `ignored`);
|
||||
|
||||
--
|
||||
-- VIEW post-timeline-view
|
||||
--
|
||||
|
@ -2053,6 +2176,458 @@ CREATE VIEW `post-timeline-view` AS SELECT
|
|||
STRAIGHT_JOIN `contact` AS `owner` ON `owner`.`id` = `post-user`.`owner-id`
|
||||
LEFT JOIN `contact` AS `causer` ON `causer`.`id` = `post-user`.`causer-id`;
|
||||
|
||||
--
|
||||
-- VIEW post-timeline-origin-view
|
||||
--
|
||||
DROP VIEW IF EXISTS `post-timeline-origin-view`;
|
||||
CREATE VIEW `post-timeline-origin-view` AS SELECT
|
||||
`post-origin`.`uid` AS `uid`,
|
||||
`post-origin`.`uri-id` AS `uri-id`,
|
||||
`post-origin`.`gravity` AS `gravity`,
|
||||
`post-origin`.`created` AS `created`,
|
||||
`post-user`.`edited` AS `edited`,
|
||||
`post-thread-user`.`commented` AS `commented`,
|
||||
`post-origin`.`received` AS `received`,
|
||||
`post-thread-user`.`changed` AS `changed`,
|
||||
`post-origin`.`private` AS `private`,
|
||||
`post-user`.`visible` AS `visible`,
|
||||
`post-user`.`deleted` AS `deleted`,
|
||||
true AS `origin`,
|
||||
`post-user`.`global` AS `global`,
|
||||
`post-user`.`network` AS `network`,
|
||||
`post-user`.`protocol` AS `protocol`,
|
||||
`post-origin`.`vid` AS `vid`,
|
||||
`post-user`.`contact-id` AS `contact-id`,
|
||||
`contact`.`blocked` AS `contact-blocked`,
|
||||
`contact`.`readonly` AS `contact-readonly`,
|
||||
`contact`.`pending` AS `contact-pending`,
|
||||
`contact`.`rel` AS `contact-rel`,
|
||||
`contact`.`uid` AS `contact-uid`,
|
||||
`contact`.`self` AS `self`,
|
||||
`post-user`.`author-id` AS `author-id`,
|
||||
`author`.`blocked` AS `author-blocked`,
|
||||
`author`.`hidden` AS `author-hidden`,
|
||||
`author`.`gsid` AS `author-gsid`,
|
||||
`post-user`.`owner-id` AS `owner-id`,
|
||||
`owner`.`blocked` AS `owner-blocked`,
|
||||
`owner`.`gsid` AS `owner-gsid`,
|
||||
`post-user`.`causer-id` AS `causer-id`,
|
||||
`causer`.`blocked` AS `causer-blocked`,
|
||||
`causer`.`gsid` AS `causer-gsid`
|
||||
FROM `post-origin`
|
||||
INNER JOIN `post-user` ON `post-user`.`id` = `post-origin`.`id`
|
||||
LEFT JOIN `post-thread-user` ON `post-thread-user`.`uri-id` = `post-origin`.`parent-uri-id` AND `post-thread-user`.`uid` = `post-origin`.`uid`
|
||||
STRAIGHT_JOIN `contact` ON `contact`.`id` = `post-user`.`contact-id`
|
||||
STRAIGHT_JOIN `contact` AS `author` ON `author`.`id` = `post-user`.`author-id`
|
||||
STRAIGHT_JOIN `contact` AS `owner` ON `owner`.`id` = `post-user`.`owner-id`
|
||||
LEFT JOIN `contact` AS `causer` ON `causer`.`id` = `post-user`.`causer-id`;
|
||||
|
||||
--
|
||||
-- VIEW post-searchindex-user-view
|
||||
--
|
||||
DROP VIEW IF EXISTS `post-searchindex-user-view`;
|
||||
CREATE VIEW `post-searchindex-user-view` AS SELECT
|
||||
`post-thread-user`.`uid` AS `uid`,
|
||||
`post-searchindex`.`uri-id` AS `uri-id`,
|
||||
`post-searchindex`.`owner-id` AS `owner-id`,
|
||||
`post-searchindex`.`media-type` AS `media-type`,
|
||||
`post-searchindex`.`language` AS `language`,
|
||||
`post-searchindex`.`searchtext` AS `searchtext`,
|
||||
`post-searchindex`.`size` AS `size`,
|
||||
`post-thread-user`.`commented` AS `commented`,
|
||||
`post-thread-user`.`received` AS `received`,
|
||||
`post-thread-user`.`created` AS `created`,
|
||||
`post-thread-user`.`network` AS `network`,
|
||||
`post-searchindex`.`language` AS `restricted`,
|
||||
0 AS `comments`,
|
||||
0 AS `activities`
|
||||
FROM `post-thread-user`
|
||||
INNER JOIN `post-searchindex` ON `post-searchindex`.`uri-id` = `post-thread-user`.`uri-id`
|
||||
INNER JOIN `post-user` ON `post-user`.`id` = `post-thread-user`.`post-user-id`
|
||||
STRAIGHT_JOIN `contact` ON `contact`.`id` = `post-thread-user`.`contact-id`
|
||||
STRAIGHT_JOIN `contact` AS `authorcontact` ON `authorcontact`.`id` = `post-thread-user`.`author-id`
|
||||
STRAIGHT_JOIN `contact` AS `ownercontact` ON `ownercontact`.`id` = `post-thread-user`.`owner-id`
|
||||
WHERE `post-user`.`visible` AND NOT `post-user`.`deleted`
|
||||
AND (NOT `contact`.`readonly` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`)
|
||||
AND (`post-thread-user`.`hidden` IS NULL OR NOT `post-thread-user`.`hidden`)
|
||||
AND NOT `authorcontact`.`blocked` AND NOT `ownercontact`.`blocked`
|
||||
AND NOT EXISTS(SELECT `cid` FROM `user-contact` WHERE `uid` = `post-thread-user`.`uid` AND `cid` IN (`authorcontact`.`id`, `ownercontact`.`id`) AND (`blocked` OR `ignored`))
|
||||
AND NOT EXISTS(SELECT `gsid` FROM `user-gserver` WHERE `uid` = `post-thread-user`.`uid` AND `gsid` IN (`authorcontact`.`gsid`, `ownercontact`.`gsid`) AND `ignored`);
|
||||
|
||||
--
|
||||
-- VIEW post-origin-view
|
||||
--
|
||||
DROP VIEW IF EXISTS `post-origin-view`;
|
||||
CREATE VIEW `post-origin-view` AS SELECT
|
||||
`post-origin`.`id` AS `id`,
|
||||
`post-origin`.`id` AS `post-user-id`,
|
||||
`post-origin`.`uid` AS `uid`,
|
||||
`post-thread-user`.`post-user-id` AS `parent`,
|
||||
`item-uri`.`uri` AS `uri`,
|
||||
`post-origin`.`uri-id` AS `uri-id`,
|
||||
`parent-item-uri`.`uri` AS `parent-uri`,
|
||||
`post-origin`.`parent-uri-id` AS `parent-uri-id`,
|
||||
`thr-parent-item-uri`.`uri` AS `thr-parent`,
|
||||
`post-origin`.`thr-parent-id` AS `thr-parent-id`,
|
||||
`conversation-item-uri`.`uri` AS `conversation`,
|
||||
`post-thread-user`.`conversation-id` AS `conversation-id`,
|
||||
`quote-item-uri`.`uri` AS `quote-uri`,
|
||||
`post-content`.`quote-uri-id` AS `quote-uri-id`,
|
||||
`item-uri`.`guid` AS `guid`,
|
||||
`post-origin`.`wall` AS `wall`,
|
||||
`post-origin`.`gravity` AS `gravity`,
|
||||
`external-item-uri`.`uri` AS `extid`,
|
||||
`post-user`.`external-id` AS `external-id`,
|
||||
`post-origin`.`created` AS `created`,
|
||||
`post-user`.`edited` AS `edited`,
|
||||
`post-thread-user`.`commented` AS `commented`,
|
||||
`post-origin`.`received` AS `received`,
|
||||
`post-thread-user`.`changed` AS `changed`,
|
||||
`post-user`.`post-type` AS `post-type`,
|
||||
`post-user`.`post-reason` AS `post-reason`,
|
||||
`post-origin`.`private` AS `private`,
|
||||
`post-thread-user`.`pubmail` AS `pubmail`,
|
||||
`post-user`.`visible` AS `visible`,
|
||||
`post-thread-user`.`starred` AS `starred`,
|
||||
`post-user`.`unseen` AS `unseen`,
|
||||
`post-user`.`deleted` AS `deleted`,
|
||||
true AS `origin`,
|
||||
`post-thread-user`.`origin` AS `parent-origin`,
|
||||
`post-thread-user`.`mention` AS `mention`,
|
||||
`post-user`.`global` AS `global`,
|
||||
EXISTS(SELECT `type` FROM `post-collection` WHERE `type` = 0 AND `uri-id` = `post-origin`.`uri-id`) AS `featured`,
|
||||
`post-user`.`network` AS `network`,
|
||||
`post-user`.`protocol` AS `protocol`,
|
||||
`post-origin`.`vid` AS `vid`,
|
||||
`post-user`.`psid` AS `psid`,
|
||||
IF (`post-origin`.`vid` IS NULL, '', `verb`.`name`) AS `verb`,
|
||||
`post-content`.`title` AS `title`,
|
||||
`post-content`.`content-warning` AS `content-warning`,
|
||||
`post-content`.`raw-body` AS `raw-body`,
|
||||
IFNULL (`post-content`.`body`, '') AS `body`,
|
||||
`post-content`.`rendered-hash` AS `rendered-hash`,
|
||||
`post-content`.`rendered-html` AS `rendered-html`,
|
||||
`post-content`.`language` AS `language`,
|
||||
`post-content`.`plink` AS `plink`,
|
||||
`post-content`.`location` AS `location`,
|
||||
`post-content`.`coord` AS `coord`,
|
||||
`post-content`.`sensitive` AS `sensitive`,
|
||||
`post-user`.`restrictions` AS `restrictions`,
|
||||
`post-content`.`app` AS `app`,
|
||||
`post-content`.`object-type` AS `object-type`,
|
||||
`post-content`.`object` AS `object`,
|
||||
`post-content`.`target-type` AS `target-type`,
|
||||
`post-content`.`target` AS `target`,
|
||||
`post-content`.`resource-id` AS `resource-id`,
|
||||
`post-user`.`contact-id` AS `contact-id`,
|
||||
`contact`.`uri-id` AS `contact-uri-id`,
|
||||
`contact`.`url` AS `contact-link`,
|
||||
`contact`.`addr` AS `contact-addr`,
|
||||
`contact`.`name` AS `contact-name`,
|
||||
`contact`.`nick` AS `contact-nick`,
|
||||
`contact`.`thumb` AS `contact-avatar`,
|
||||
`contact`.`network` AS `contact-network`,
|
||||
`contact`.`blocked` AS `contact-blocked`,
|
||||
`contact`.`hidden` AS `contact-hidden`,
|
||||
`contact`.`readonly` AS `contact-readonly`,
|
||||
`contact`.`archive` AS `contact-archive`,
|
||||
`contact`.`pending` AS `contact-pending`,
|
||||
`contact`.`rel` AS `contact-rel`,
|
||||
`contact`.`uid` AS `contact-uid`,
|
||||
`contact`.`contact-type` AS `contact-contact-type`,
|
||||
IF (`post-user`.`network` IN ('apub', 'dfrn', 'dspr', 'stat'), true, `contact`.`writable`) AS `writable`,
|
||||
`contact`.`self` AS `self`,
|
||||
`contact`.`id` AS `cid`,
|
||||
`contact`.`alias` AS `alias`,
|
||||
`contact`.`photo` AS `photo`,
|
||||
`contact`.`name-date` AS `name-date`,
|
||||
`contact`.`uri-date` AS `uri-date`,
|
||||
`contact`.`avatar-date` AS `avatar-date`,
|
||||
`contact`.`thumb` AS `thumb`,
|
||||
`post-user`.`author-id` AS `author-id`,
|
||||
`author`.`uri-id` AS `author-uri-id`,
|
||||
`author`.`url` AS `author-link`,
|
||||
`author`.`addr` AS `author-addr`,
|
||||
IF (`contact`.`url` = `author`.`url` AND `contact`.`name` != '', `contact`.`name`, `author`.`name`) AS `author-name`,
|
||||
`author`.`nick` AS `author-nick`,
|
||||
`author`.`alias` AS `author-alias`,
|
||||
IF (`contact`.`url` = `author`.`url` AND `contact`.`thumb` != '', `contact`.`thumb`, `author`.`thumb`) AS `author-avatar`,
|
||||
`author`.`network` AS `author-network`,
|
||||
`author`.`blocked` AS `author-blocked`,
|
||||
`author`.`hidden` AS `author-hidden`,
|
||||
`author`.`updated` AS `author-updated`,
|
||||
`author`.`contact-type` AS `author-contact-type`,
|
||||
`author`.`gsid` AS `author-gsid`,
|
||||
`author`.`baseurl` AS `author-baseurl`,
|
||||
`post-user`.`owner-id` AS `owner-id`,
|
||||
`owner`.`uri-id` AS `owner-uri-id`,
|
||||
`owner`.`url` AS `owner-link`,
|
||||
`owner`.`addr` AS `owner-addr`,
|
||||
IF (`contact`.`url` = `owner`.`url` AND `contact`.`name` != '', `contact`.`name`, `owner`.`name`) AS `owner-name`,
|
||||
`owner`.`nick` AS `owner-nick`,
|
||||
`owner`.`alias` AS `owner-alias`,
|
||||
IF (`contact`.`url` = `owner`.`url` AND `contact`.`thumb` != '', `contact`.`thumb`, `owner`.`thumb`) AS `owner-avatar`,
|
||||
`owner`.`network` AS `owner-network`,
|
||||
`owner`.`blocked` AS `owner-blocked`,
|
||||
`owner`.`hidden` AS `owner-hidden`,
|
||||
`owner`.`updated` AS `owner-updated`,
|
||||
`owner`.`gsid` AS `owner-gsid`,
|
||||
`owner`.`contact-type` AS `owner-contact-type`,
|
||||
`post-user`.`causer-id` AS `causer-id`,
|
||||
`causer`.`uri-id` AS `causer-uri-id`,
|
||||
`causer`.`url` AS `causer-link`,
|
||||
`causer`.`addr` AS `causer-addr`,
|
||||
`causer`.`name` AS `causer-name`,
|
||||
`causer`.`nick` AS `causer-nick`,
|
||||
`causer`.`alias` AS `causer-alias`,
|
||||
`causer`.`thumb` AS `causer-avatar`,
|
||||
`causer`.`network` AS `causer-network`,
|
||||
`causer`.`blocked` AS `causer-blocked`,
|
||||
`causer`.`hidden` AS `causer-hidden`,
|
||||
`causer`.`gsid` AS `causer-gsid`,
|
||||
`causer`.`contact-type` AS `causer-contact-type`,
|
||||
`post-delivery-data`.`postopts` AS `postopts`,
|
||||
`post-delivery-data`.`inform` AS `inform`,
|
||||
`post-delivery-data`.`queue_count` AS `delivery_queue_count`,
|
||||
`post-delivery-data`.`queue_done` AS `delivery_queue_done`,
|
||||
`post-delivery-data`.`queue_failed` AS `delivery_queue_failed`,
|
||||
IF (`post-user`.`psid` IS NULL, '', `permissionset`.`allow_cid`) AS `allow_cid`,
|
||||
IF (`post-user`.`psid` IS NULL, '', `permissionset`.`allow_gid`) AS `allow_gid`,
|
||||
IF (`post-user`.`psid` IS NULL, '', `permissionset`.`deny_cid`) AS `deny_cid`,
|
||||
IF (`post-user`.`psid` IS NULL, '', `permissionset`.`deny_gid`) AS `deny_gid`,
|
||||
`post-user`.`event-id` AS `event-id`,
|
||||
`event`.`created` AS `event-created`,
|
||||
`event`.`edited` AS `event-edited`,
|
||||
`event`.`start` AS `event-start`,
|
||||
`event`.`finish` AS `event-finish`,
|
||||
`event`.`summary` AS `event-summary`,
|
||||
`event`.`desc` AS `event-desc`,
|
||||
`event`.`location` AS `event-location`,
|
||||
`event`.`type` AS `event-type`,
|
||||
`event`.`nofinish` AS `event-nofinish`,
|
||||
`event`.`ignore` AS `event-ignore`,
|
||||
`post-question`.`id` AS `question-id`,
|
||||
`post-question`.`multiple` AS `question-multiple`,
|
||||
`post-question`.`voters` AS `question-voters`,
|
||||
`post-question`.`end-time` AS `question-end-time`,
|
||||
EXISTS(SELECT `uri-id` FROM `post-category` WHERE `post-category`.`uri-id` = `post-origin`.`uri-id` AND `post-category`.`uid` = `post-origin`.`uid`) AS `has-categories`,
|
||||
EXISTS(SELECT `id` FROM `post-media` WHERE `post-media`.`uri-id` = `post-origin`.`uri-id`) AS `has-media`,
|
||||
`diaspora-interaction`.`interaction` AS `signed_text`,
|
||||
`parent-item-uri`.`guid` AS `parent-guid`,
|
||||
`post-thread-user`.`network` AS `parent-network`,
|
||||
`post-thread-user`.`author-id` AS `parent-author-id`,
|
||||
`parent-post-author`.`url` AS `parent-author-link`,
|
||||
`parent-post-author`.`name` AS `parent-author-name`,
|
||||
`parent-post-author`.`nick` AS `parent-author-nick`,
|
||||
`parent-post-author`.`network` AS `parent-author-network`
|
||||
FROM `post-origin`
|
||||
INNER JOIN `post-user` ON `post-user`.`id` = `post-origin`.`id`
|
||||
INNER JOIN `post-thread-user` ON `post-thread-user`.`uri-id` = `post-origin`.`parent-uri-id` AND `post-thread-user`.`uid` = `post-origin`.`uid`
|
||||
STRAIGHT_JOIN `contact` ON `contact`.`id` = `post-user`.`contact-id`
|
||||
STRAIGHT_JOIN `contact` AS `author` ON `author`.`id` = `post-user`.`author-id`
|
||||
STRAIGHT_JOIN `contact` AS `owner` ON `owner`.`id` = `post-user`.`owner-id`
|
||||
LEFT JOIN `contact` AS `causer` ON `causer`.`id` = `post-user`.`causer-id`
|
||||
LEFT JOIN `item-uri` ON `item-uri`.`id` = `post-origin`.`uri-id`
|
||||
LEFT JOIN `item-uri` AS `thr-parent-item-uri` ON `thr-parent-item-uri`.`id` = `post-origin`.`thr-parent-id`
|
||||
LEFT JOIN `item-uri` AS `parent-item-uri` ON `parent-item-uri`.`id` = `post-origin`.`parent-uri-id`
|
||||
LEFT JOIN `item-uri` AS `conversation-item-uri` ON `conversation-item-uri`.`id` = `post-thread-user`.`conversation-id`
|
||||
LEFT JOIN `item-uri` AS `external-item-uri` ON `external-item-uri`.`id` = `post-user`.`external-id`
|
||||
LEFT JOIN `verb` ON `verb`.`id` = `post-origin`.`vid`
|
||||
LEFT JOIN `event` ON `event`.`id` = `post-user`.`event-id`
|
||||
LEFT JOIN `diaspora-interaction` ON `diaspora-interaction`.`uri-id` = `post-origin`.`uri-id`
|
||||
LEFT JOIN `post-content` ON `post-content`.`uri-id` = `post-origin`.`uri-id`
|
||||
LEFT JOIN `item-uri` AS `quote-item-uri` ON `quote-item-uri`.`id` = `post-content`.`quote-uri-id`
|
||||
LEFT JOIN `post-delivery-data` ON `post-delivery-data`.`uri-id` = `post-origin`.`uri-id`
|
||||
LEFT JOIN `post-question` ON `post-question`.`uri-id` = `post-origin`.`uri-id`
|
||||
LEFT JOIN `permissionset` ON `permissionset`.`id` = `post-user`.`psid`
|
||||
LEFT JOIN `contact` AS `parent-post-author` ON `parent-post-author`.`id` = `post-thread-user`.`author-id`;
|
||||
|
||||
--
|
||||
-- VIEW post-thread-origin-view
|
||||
--
|
||||
DROP VIEW IF EXISTS `post-thread-origin-view`;
|
||||
CREATE VIEW `post-thread-origin-view` AS SELECT
|
||||
`post-origin`.`id` AS `id`,
|
||||
`post-origin`.`id` AS `post-user-id`,
|
||||
`post-origin`.`uid` AS `uid`,
|
||||
`post-thread-user`.`post-user-id` AS `parent`,
|
||||
`item-uri`.`uri` AS `uri`,
|
||||
`post-origin`.`uri-id` AS `uri-id`,
|
||||
`parent-item-uri`.`uri` AS `parent-uri`,
|
||||
`post-origin`.`parent-uri-id` AS `parent-uri-id`,
|
||||
`thr-parent-item-uri`.`uri` AS `thr-parent`,
|
||||
`post-origin`.`thr-parent-id` AS `thr-parent-id`,
|
||||
`conversation-item-uri`.`uri` AS `conversation`,
|
||||
`post-thread-user`.`conversation-id` AS `conversation-id`,
|
||||
`quote-item-uri`.`uri` AS `quote-uri`,
|
||||
`post-content`.`quote-uri-id` AS `quote-uri-id`,
|
||||
`item-uri`.`guid` AS `guid`,
|
||||
`post-origin`.`wall` AS `wall`,
|
||||
`post-origin`.`gravity` AS `gravity`,
|
||||
`external-item-uri`.`uri` AS `extid`,
|
||||
`post-user`.`external-id` AS `external-id`,
|
||||
`post-origin`.`created` AS `created`,
|
||||
`post-user`.`edited` AS `edited`,
|
||||
`post-thread-user`.`commented` AS `commented`,
|
||||
`post-origin`.`received` AS `received`,
|
||||
`post-thread-user`.`changed` AS `changed`,
|
||||
`post-user`.`post-type` AS `post-type`,
|
||||
`post-user`.`post-reason` AS `post-reason`,
|
||||
`post-origin`.`private` AS `private`,
|
||||
`post-thread-user`.`pubmail` AS `pubmail`,
|
||||
`post-thread-user`.`ignored` AS `ignored`,
|
||||
`post-user`.`visible` AS `visible`,
|
||||
`post-thread-user`.`starred` AS `starred`,
|
||||
`post-thread-user`.`unseen` AS `unseen`,
|
||||
`post-user`.`deleted` AS `deleted`,
|
||||
true AS `origin`,
|
||||
`post-thread-user`.`mention` AS `mention`,
|
||||
`post-user`.`global` AS `global`,
|
||||
EXISTS(SELECT `type` FROM `post-collection` WHERE `type` = 0 AND `uri-id` = `post-thread-user`.`uri-id`) AS `featured`,
|
||||
`post-thread-user`.`network` AS `network`,
|
||||
`post-origin`.`vid` AS `vid`,
|
||||
`post-thread-user`.`psid` AS `psid`,
|
||||
IF (`post-origin`.`vid` IS NULL, '', `verb`.`name`) AS `verb`,
|
||||
`post-content`.`title` AS `title`,
|
||||
`post-content`.`content-warning` AS `content-warning`,
|
||||
`post-content`.`raw-body` AS `raw-body`,
|
||||
`post-content`.`body` AS `body`,
|
||||
`post-content`.`rendered-hash` AS `rendered-hash`,
|
||||
`post-content`.`rendered-html` AS `rendered-html`,
|
||||
`post-content`.`language` AS `language`,
|
||||
`post-content`.`plink` AS `plink`,
|
||||
`post-content`.`location` AS `location`,
|
||||
`post-content`.`coord` AS `coord`,
|
||||
`post-content`.`sensitive` AS `sensitive`,
|
||||
`post-user`.`restrictions` AS `restrictions`,
|
||||
`post-content`.`app` AS `app`,
|
||||
`post-content`.`object-type` AS `object-type`,
|
||||
`post-content`.`object` AS `object`,
|
||||
`post-content`.`target-type` AS `target-type`,
|
||||
`post-content`.`target` AS `target`,
|
||||
`post-content`.`resource-id` AS `resource-id`,
|
||||
`post-thread-user`.`contact-id` AS `contact-id`,
|
||||
`contact`.`uri-id` AS `contact-uri-id`,
|
||||
`contact`.`url` AS `contact-link`,
|
||||
`contact`.`addr` AS `contact-addr`,
|
||||
`contact`.`name` AS `contact-name`,
|
||||
`contact`.`nick` AS `contact-nick`,
|
||||
`contact`.`thumb` AS `contact-avatar`,
|
||||
`contact`.`network` AS `contact-network`,
|
||||
`contact`.`blocked` AS `contact-blocked`,
|
||||
`contact`.`hidden` AS `contact-hidden`,
|
||||
`contact`.`readonly` AS `contact-readonly`,
|
||||
`contact`.`archive` AS `contact-archive`,
|
||||
`contact`.`pending` AS `contact-pending`,
|
||||
`contact`.`rel` AS `contact-rel`,
|
||||
`contact`.`uid` AS `contact-uid`,
|
||||
`contact`.`gsid` AS `contact-gsid`,
|
||||
`contact`.`contact-type` AS `contact-contact-type`,
|
||||
IF (`post-user`.`network` IN ('apub', 'dfrn', 'dspr', 'stat'), true, `contact`.`writable`) AS `writable`,
|
||||
`contact`.`self` AS `self`,
|
||||
`contact`.`id` AS `cid`,
|
||||
`contact`.`alias` AS `alias`,
|
||||
`contact`.`photo` AS `photo`,
|
||||
`contact`.`name-date` AS `name-date`,
|
||||
`contact`.`uri-date` AS `uri-date`,
|
||||
`contact`.`avatar-date` AS `avatar-date`,
|
||||
`contact`.`thumb` AS `thumb`,
|
||||
`post-thread-user`.`author-id` AS `author-id`,
|
||||
`author`.`uri-id` AS `author-uri-id`,
|
||||
`author`.`url` AS `author-link`,
|
||||
`author`.`addr` AS `author-addr`,
|
||||
IF (`contact`.`url` = `author`.`url` AND `contact`.`name` != '', `contact`.`name`, `author`.`name`) AS `author-name`,
|
||||
`author`.`nick` AS `author-nick`,
|
||||
`author`.`alias` AS `author-alias`,
|
||||
IF (`contact`.`url` = `author`.`url` AND `contact`.`thumb` != '', `contact`.`thumb`, `author`.`thumb`) AS `author-avatar`,
|
||||
`author`.`network` AS `author-network`,
|
||||
`author`.`blocked` AS `author-blocked`,
|
||||
`author`.`hidden` AS `author-hidden`,
|
||||
`author`.`updated` AS `author-updated`,
|
||||
`author`.`contact-type` AS `author-contact-type`,
|
||||
`author`.`gsid` AS `author-gsid`,
|
||||
`post-thread-user`.`owner-id` AS `owner-id`,
|
||||
`owner`.`uri-id` AS `owner-uri-id`,
|
||||
`owner`.`url` AS `owner-link`,
|
||||
`owner`.`addr` AS `owner-addr`,
|
||||
IF (`contact`.`url` = `owner`.`url` AND `contact`.`name` != '', `contact`.`name`, `owner`.`name`) AS `owner-name`,
|
||||
`owner`.`nick` AS `owner-nick`,
|
||||
`owner`.`alias` AS `owner-alias`,
|
||||
IF (`contact`.`url` = `owner`.`url` AND `contact`.`thumb` != '', `contact`.`thumb`, `owner`.`thumb`) AS `owner-avatar`,
|
||||
`owner`.`network` AS `owner-network`,
|
||||
`owner`.`blocked` AS `owner-blocked`,
|
||||
`owner`.`hidden` AS `owner-hidden`,
|
||||
`owner`.`updated` AS `owner-updated`,
|
||||
`owner`.`gsid` AS `owner-gsid`,
|
||||
`owner`.`contact-type` AS `owner-contact-type`,
|
||||
`post-thread-user`.`causer-id` AS `causer-id`,
|
||||
`causer`.`uri-id` AS `causer-uri-id`,
|
||||
`causer`.`url` AS `causer-link`,
|
||||
`causer`.`addr` AS `causer-addr`,
|
||||
`causer`.`name` AS `causer-name`,
|
||||
`causer`.`nick` AS `causer-nick`,
|
||||
`causer`.`alias` AS `causer-alias`,
|
||||
`causer`.`thumb` AS `causer-avatar`,
|
||||
`causer`.`network` AS `causer-network`,
|
||||
`causer`.`blocked` AS `causer-blocked`,
|
||||
`causer`.`hidden` AS `causer-hidden`,
|
||||
`causer`.`gsid` AS `causer-gsid`,
|
||||
`causer`.`contact-type` AS `causer-contact-type`,
|
||||
`post-delivery-data`.`postopts` AS `postopts`,
|
||||
`post-delivery-data`.`inform` AS `inform`,
|
||||
`post-delivery-data`.`queue_count` AS `delivery_queue_count`,
|
||||
`post-delivery-data`.`queue_done` AS `delivery_queue_done`,
|
||||
`post-delivery-data`.`queue_failed` AS `delivery_queue_failed`,
|
||||
IF (`post-thread-user`.`psid` IS NULL, '', `permissionset`.`allow_cid`) AS `allow_cid`,
|
||||
IF (`post-thread-user`.`psid` IS NULL, '', `permissionset`.`allow_gid`) AS `allow_gid`,
|
||||
IF (`post-thread-user`.`psid` IS NULL, '', `permissionset`.`deny_cid`) AS `deny_cid`,
|
||||
IF (`post-thread-user`.`psid` IS NULL, '', `permissionset`.`deny_gid`) AS `deny_gid`,
|
||||
`post-user`.`event-id` AS `event-id`,
|
||||
`event`.`created` AS `event-created`,
|
||||
`event`.`edited` AS `event-edited`,
|
||||
`event`.`start` AS `event-start`,
|
||||
`event`.`finish` AS `event-finish`,
|
||||
`event`.`summary` AS `event-summary`,
|
||||
`event`.`desc` AS `event-desc`,
|
||||
`event`.`location` AS `event-location`,
|
||||
`event`.`type` AS `event-type`,
|
||||
`event`.`nofinish` AS `event-nofinish`,
|
||||
`event`.`ignore` AS `event-ignore`,
|
||||
`post-question`.`id` AS `question-id`,
|
||||
`post-question`.`multiple` AS `question-multiple`,
|
||||
`post-question`.`voters` AS `question-voters`,
|
||||
`post-question`.`end-time` AS `question-end-time`,
|
||||
EXISTS(SELECT `uri-id` FROM `post-category` WHERE `post-category`.`uri-id` = `post-thread-user`.`uri-id` AND `post-category`.`uid` = `post-thread-user`.`uid`) AS `has-categories`,
|
||||
EXISTS(SELECT `id` FROM `post-media` WHERE `post-media`.`uri-id` = `post-thread-user`.`uri-id`) AS `has-media`,
|
||||
`diaspora-interaction`.`interaction` AS `signed_text`,
|
||||
`parent-item-uri`.`guid` AS `parent-guid`,
|
||||
`post-thread-user`.`network` AS `parent-network`,
|
||||
`post-thread-user`.`author-id` AS `parent-author-id`,
|
||||
`author`.`url` AS `parent-author-link`,
|
||||
`author`.`name` AS `parent-author-name`,
|
||||
`author`.`nick` AS `parent-author-nick`,
|
||||
`author`.`network` AS `parent-author-network`
|
||||
FROM `post-origin`
|
||||
INNER JOIN `post-thread-user` ON `post-thread-user`.`uri-id` = `post-origin`.`uri-id` AND `post-thread-user`.`uid` = `post-origin`.`uid`
|
||||
INNER JOIN `post-user` ON `post-user`.`id` = `post-origin`.`id`
|
||||
STRAIGHT_JOIN `contact` ON `contact`.`id` = `post-thread-user`.`contact-id`
|
||||
STRAIGHT_JOIN `contact` AS `author` ON `author`.`id` = `post-thread-user`.`author-id`
|
||||
STRAIGHT_JOIN `contact` AS `owner` ON `owner`.`id` = `post-thread-user`.`owner-id`
|
||||
LEFT JOIN `contact` AS `causer` ON `causer`.`id` = `post-thread-user`.`causer-id`
|
||||
LEFT JOIN `item-uri` ON `item-uri`.`id` = `post-origin`.`uri-id`
|
||||
LEFT JOIN `item-uri` AS `thr-parent-item-uri` ON `thr-parent-item-uri`.`id` = `post-origin`.`thr-parent-id`
|
||||
LEFT JOIN `item-uri` AS `parent-item-uri` ON `parent-item-uri`.`id` = `post-origin`.`parent-uri-id`
|
||||
LEFT JOIN `item-uri` AS `conversation-item-uri` ON `conversation-item-uri`.`id` = `post-thread-user`.`conversation-id`
|
||||
LEFT JOIN `item-uri` AS `external-item-uri` ON `external-item-uri`.`id` = `post-user`.`external-id`
|
||||
LEFT JOIN `verb` ON `verb`.`id` = `post-origin`.`vid`
|
||||
LEFT JOIN `event` ON `event`.`id` = `post-user`.`event-id`
|
||||
LEFT JOIN `diaspora-interaction` ON `diaspora-interaction`.`uri-id` = `post-origin`.`uri-id`
|
||||
LEFT JOIN `post-content` ON `post-content`.`uri-id` = `post-origin`.`uri-id`
|
||||
LEFT JOIN `item-uri` AS `quote-item-uri` ON `quote-item-uri`.`id` = `post-content`.`quote-uri-id`
|
||||
LEFT JOIN `post-delivery-data` ON `post-delivery-data`.`uri-id` = `post-origin`.`uri-id`
|
||||
LEFT JOIN `post-question` ON `post-question`.`uri-id` = `post-origin`.`uri-id`
|
||||
LEFT JOIN `permissionset` ON `permissionset`.`id` = `post-thread-user`.`psid`;
|
||||
|
||||
--
|
||||
-- VIEW post-user-view
|
||||
--
|
||||
|
@ -2110,6 +2685,8 @@ CREATE VIEW `post-user-view` AS SELECT
|
|||
`post-content`.`plink` AS `plink`,
|
||||
`post-content`.`location` AS `location`,
|
||||
`post-content`.`coord` AS `coord`,
|
||||
`post-content`.`sensitive` AS `sensitive`,
|
||||
`post-user`.`restrictions` AS `restrictions`,
|
||||
`post-content`.`app` AS `app`,
|
||||
`post-content`.`object-type` AS `object-type`,
|
||||
`post-content`.`object` AS `object`,
|
||||
|
@ -2294,6 +2871,8 @@ CREATE VIEW `post-thread-user-view` AS SELECT
|
|||
`post-content`.`plink` AS `plink`,
|
||||
`post-content`.`location` AS `location`,
|
||||
`post-content`.`coord` AS `coord`,
|
||||
`post-content`.`sensitive` AS `sensitive`,
|
||||
`post-user`.`restrictions` AS `restrictions`,
|
||||
`post-content`.`app` AS `app`,
|
||||
`post-content`.`object-type` AS `object-type`,
|
||||
`post-content`.`object` AS `object`,
|
||||
|
@ -2464,6 +3043,7 @@ CREATE VIEW `post-view` AS SELECT
|
|||
`post-content`.`plink` AS `plink`,
|
||||
`post-content`.`location` AS `location`,
|
||||
`post-content`.`coord` AS `coord`,
|
||||
`post-content`.`sensitive` AS `sensitive`,
|
||||
`post-content`.`app` AS `app`,
|
||||
`post-content`.`object-type` AS `object-type`,
|
||||
`post-content`.`object` AS `object`,
|
||||
|
@ -2610,6 +3190,7 @@ CREATE VIEW `post-thread-view` AS SELECT
|
|||
`post-content`.`plink` AS `plink`,
|
||||
`post-content`.`location` AS `location`,
|
||||
`post-content`.`coord` AS `coord`,
|
||||
`post-content`.`sensitive` AS `sensitive`,
|
||||
`post-content`.`app` AS `app`,
|
||||
`post-content`.`object-type` AS `object-type`,
|
||||
`post-content`.`object` AS `object`,
|
||||
|
@ -2783,36 +3364,6 @@ CREATE VIEW `tag-view` AS SELECT
|
|||
LEFT JOIN `tag` ON `post-tag`.`tid` = `tag`.`id`
|
||||
LEFT JOIN `contact` ON `post-tag`.`cid` = `contact`.`id`;
|
||||
|
||||
--
|
||||
-- VIEW network-item-view
|
||||
--
|
||||
DROP VIEW IF EXISTS `network-item-view`;
|
||||
CREATE VIEW `network-item-view` AS SELECT
|
||||
`post-user`.`uri-id` AS `uri-id`,
|
||||
`post-thread-user`.`post-user-id` AS `parent`,
|
||||
`post-user`.`received` AS `received`,
|
||||
`post-thread-user`.`commented` AS `commented`,
|
||||
`post-user`.`created` AS `created`,
|
||||
`post-user`.`uid` AS `uid`,
|
||||
`post-thread-user`.`starred` AS `starred`,
|
||||
`post-thread-user`.`mention` AS `mention`,
|
||||
`post-user`.`network` AS `network`,
|
||||
`post-user`.`unseen` AS `unseen`,
|
||||
`post-user`.`gravity` AS `gravity`,
|
||||
`post-user`.`contact-id` AS `contact-id`,
|
||||
`ownercontact`.`contact-type` AS `contact-type`
|
||||
FROM `post-user`
|
||||
INNER JOIN `post-thread-user` ON `post-thread-user`.`uri-id` = `post-user`.`parent-uri-id` AND `post-thread-user`.`uid` = `post-user`.`uid`
|
||||
STRAIGHT_JOIN `contact` ON `contact`.`id` = `post-thread-user`.`contact-id`
|
||||
STRAIGHT_JOIN `contact` AS `authorcontact` ON `authorcontact`.`id` = `post-thread-user`.`author-id`
|
||||
STRAIGHT_JOIN `contact` AS `ownercontact` ON `ownercontact`.`id` = `post-thread-user`.`owner-id`
|
||||
WHERE `post-user`.`visible` AND NOT `post-user`.`deleted`
|
||||
AND (NOT `contact`.`readonly` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`)
|
||||
AND (`post-user`.`hidden` IS NULL OR NOT `post-user`.`hidden`)
|
||||
AND NOT `authorcontact`.`blocked` AND NOT `ownercontact`.`blocked`
|
||||
AND NOT EXISTS(SELECT `cid` FROM `user-contact` WHERE `uid` = `post-thread-user`.`uid` AND `cid` IN (`authorcontact`.`id`, `ownercontact`.`id`) AND (`blocked` OR `ignored`))
|
||||
AND NOT EXISTS(SELECT `gsid` FROM `user-gserver` WHERE `uid` = `post-thread-user`.`uid` AND `gsid` IN (`authorcontact`.`gsid`, `ownercontact`.`gsid`) AND `ignored`);
|
||||
|
||||
--
|
||||
-- VIEW network-thread-view
|
||||
--
|
||||
|
@ -2838,8 +3389,36 @@ CREATE VIEW `network-thread-view` AS SELECT
|
|||
AND (NOT `contact`.`readonly` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`)
|
||||
AND (`post-thread-user`.`hidden` IS NULL OR NOT `post-thread-user`.`hidden`)
|
||||
AND NOT `authorcontact`.`blocked` AND NOT `ownercontact`.`blocked`
|
||||
AND NOT EXISTS(SELECT `cid` FROM `user-contact` WHERE `uid` = `post-thread-user`.`uid` AND `cid` IN (`authorcontact`.`id`, `ownercontact`.`id`) AND (`blocked` OR `ignored`))
|
||||
AND NOT EXISTS(SELECT `gsid` FROM `user-gserver` WHERE `uid` = `post-thread-user`.`uid` AND `gsid` IN (`authorcontact`.`gsid`, `ownercontact`.`gsid`) AND `ignored`);
|
||||
AND NOT EXISTS(SELECT `cid` FROM `user-contact` WHERE `uid` = `post-thread-user`.`uid` AND `cid` IN (`post-thread-user`.`author-id`, `post-thread-user`.`owner-id`, `post-thread-user`.`causer-id`) AND (`blocked` OR `ignored` OR `channel-only`))
|
||||
AND NOT EXISTS(SELECT `gsid` FROM `user-gserver` WHERE `uid` = `post-thread-user`.`uid` AND `gsid` IN (`authorcontact`.`gsid`, `ownercontact`.`gsid`) AND `ignored`);
|
||||
|
||||
--
|
||||
-- VIEW network-thread-circle-view
|
||||
--
|
||||
DROP VIEW IF EXISTS `network-thread-circle-view`;
|
||||
CREATE VIEW `network-thread-circle-view` AS SELECT
|
||||
`post-thread-user`.`uri-id` AS `uri-id`,
|
||||
`post-thread-user`.`post-user-id` AS `parent`,
|
||||
`post-thread-user`.`received` AS `received`,
|
||||
`post-thread-user`.`commented` AS `commented`,
|
||||
`post-thread-user`.`created` AS `created`,
|
||||
`post-thread-user`.`uid` AS `uid`,
|
||||
`post-thread-user`.`starred` AS `starred`,
|
||||
`post-thread-user`.`mention` AS `mention`,
|
||||
`post-thread-user`.`network` AS `network`,
|
||||
`post-thread-user`.`contact-id` AS `contact-id`,
|
||||
`ownercontact`.`contact-type` AS `contact-type`
|
||||
FROM `post-thread-user`
|
||||
INNER JOIN `post-user` ON `post-user`.`id` = `post-thread-user`.`post-user-id`
|
||||
STRAIGHT_JOIN `contact` ON `contact`.`id` = `post-thread-user`.`contact-id`
|
||||
STRAIGHT_JOIN `contact` AS `authorcontact` ON `authorcontact`.`id` = `post-thread-user`.`author-id`
|
||||
STRAIGHT_JOIN `contact` AS `ownercontact` ON `ownercontact`.`id` = `post-thread-user`.`owner-id`
|
||||
WHERE `post-user`.`visible` AND NOT `post-user`.`deleted`
|
||||
AND (NOT `contact`.`readonly` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`)
|
||||
AND (`post-thread-user`.`hidden` IS NULL OR NOT `post-thread-user`.`hidden`)
|
||||
AND NOT `authorcontact`.`blocked` AND NOT `ownercontact`.`blocked`
|
||||
AND NOT EXISTS(SELECT `cid` FROM `user-contact` WHERE `uid` = `post-thread-user`.`uid` AND `cid` IN (`post-thread-user`.`author-id`, `post-thread-user`.`owner-id`, `post-thread-user`.`causer-id`) AND (`blocked` OR `ignored`))
|
||||
AND NOT EXISTS(SELECT `gsid` FROM `user-gserver` WHERE `uid` = `post-thread-user`.`uid` AND `gsid` IN (`authorcontact`.`gsid`, `ownercontact`.`gsid`) AND `ignored`);
|
||||
|
||||
--
|
||||
-- VIEW owner-view
|
||||
|
@ -2936,8 +3515,6 @@ CREATE VIEW `owner-view` AS SELECT
|
|||
`user`.`blockwall` AS `blockwall`,
|
||||
`user`.`hidewall` AS `hidewall`,
|
||||
`user`.`blocktags` AS `blocktags`,
|
||||
`user`.`unkmail` AS `unkmail`,
|
||||
`user`.`cntunkmail` AS `cntunkmail`,
|
||||
`user`.`notify-flags` AS `notify-flags`,
|
||||
`user`.`page-flags` AS `page-flags`,
|
||||
`user`.`account-type` AS `account-type`,
|
||||
|
|
|
@ -11,21 +11,7 @@ Authentication is the same as described in [Using the APIs](help/api#Authenticat
|
|||
|
||||
## Clients
|
||||
|
||||
### Supported apps
|
||||
|
||||
For supported apps please have a look at the [FAQ](help/FAQ#clients)
|
||||
|
||||
### Unsupported apps
|
||||
|
||||
#### Android
|
||||
|
||||
- [Fedilab](https://framagit.org/tom79/fedilab) Automatically uses the legacy API, see issue: https://framagit.org/tom79/fedilab/-/issues/520
|
||||
- [Mammut](https://github.com/jamiesanson/Mammut) There are problems with the token request, see issue https://github.com/jamiesanson/Mammut/issues/19
|
||||
|
||||
#### iOS
|
||||
|
||||
- [Mast](https://github.com/Beesitech/Mast) Doesn't accept the entered instance name. Claims that it is invalid (Message is: "Not a valid instance (may be closed or dead)")
|
||||
- [Toot!](https://apps.apple.com/app/toot/id1229021451)
|
||||
Please find a list of supported apps at [FAQ](help/FAQ#clients).
|
||||
|
||||
## Entities
|
||||
|
||||
|
@ -170,7 +156,8 @@ Example:
|
|||
|
||||
- [`GET /api/v1/followed_tags`](https://docs.joinmastodon.org/methods/followed_tags/)
|
||||
- [`GET /api/v1/instance`](https://docs.joinmastodon.org/methods/instance/#v1)
|
||||
- `GET /api/v1/instance/rules` Undocumented, returns Terms of Service
|
||||
- [`GET /api/v1/instance/extended_description`](https://docs.joinmastodon.org/methods/instance/#extended_description)
|
||||
- [`GET /api/v1/instance/rules`](https://docs.joinmastodon.org/methods/instance/#rules)
|
||||
- [`GET /api/v1/instance/peers`](https://docs.joinmastodon.org/methods/instance#list-of-connected-domains)
|
||||
- [`GET /api/v1/lists`](https://docs.joinmastodon.org/methods/timelines/lists/)
|
||||
- [`POST /api/v1/lists`](https://docs.joinmastodon.org/methods/timelines/lists/)
|
||||
|
@ -314,7 +301,6 @@ They refer to features or data that don't exist in Friendica yet.
|
|||
- [`PUT /api/v1/filters/:id`](https://docs.joinmastodon.org/methods/accounts/filters/)
|
||||
- [`DELETE /api/v1/filters/:id`](https://docs.joinmastodon.org/methods/accounts/filters/)
|
||||
- [`GET /api/v1/instance/activity`](https://docs.joinmastodon.org/methods/instance#weekly-activity)
|
||||
- [`POST /api/v1/markers`](https://docs.joinmastodon.org/methods/timelines/markers/)
|
||||
- [`PUT /api/v1/scheduled_statuses/:id`](https://docs.joinmastodon.org/methods/statuses/scheduled_statuses/)
|
||||
- [`GET /api/v1/statuses/{id:\d+}/history`](https://github.com/mastodon/mastodon/pull/16697)
|
||||
- [`GET /api/v1/streaming`](https://docs.joinmastodon.org/methods/timelines/streaming/)
|
||||
|
|
|
@ -34,6 +34,7 @@ General
|
|||
* y - for you
|
||||
* f - followers
|
||||
* r - sharers of sharers
|
||||
* q - quiet sharers
|
||||
* h - what's hot
|
||||
* i - Images
|
||||
* v - Videos
|
||||
|
|
|
@ -850,10 +850,6 @@ Here is a complete list of all hook callbacks with file locations (as of 24-Sep-
|
|||
Hook::callAll('register_account', $uid);
|
||||
Hook::callAll('remove_user', $user);
|
||||
|
||||
### src/Module/Notifications/Ping.php
|
||||
|
||||
Hook::callAll('network_ping', $arr);
|
||||
|
||||
### src/Module/PermissionTooltip.php
|
||||
|
||||
Hook::callAll('lockview_content', $item);
|
||||
|
|
|
@ -376,8 +376,8 @@ code</code></td>
|
|||
[li] Second list element<br>
|
||||
[/ul]<br>
|
||||
[list]<br>
|
||||
[*] First list element<br>
|
||||
[*] Second list element<br>
|
||||
[li] First list element<br>
|
||||
[li] Second list element<br>
|
||||
[/list]</td>
|
||||
<td>
|
||||
<ul class="listbullet" style="list-style-type: circle;">
|
||||
|
@ -388,12 +388,12 @@ code</code></td>
|
|||
</tr>
|
||||
<tr>
|
||||
<td>[ol]<br>
|
||||
[*] First list element<br>
|
||||
[*] Second list element<br>
|
||||
[li] First list element<br>
|
||||
[li] Second list element<br>
|
||||
[/ol]<br>
|
||||
[list=1]<br>
|
||||
[*] First list element<br>
|
||||
[*] Second list element<br>
|
||||
[li] First list element<br>
|
||||
[li] Second list element<br>
|
||||
[/list]</td>
|
||||
<td>
|
||||
<ul class="listdecimal" style="list-style-type: decimal;">
|
||||
|
@ -404,8 +404,8 @@ code</code></td>
|
|||
</tr>
|
||||
<tr>
|
||||
<td>[list=]<br>
|
||||
[*] First list element<br>
|
||||
[*] Second list element<br>
|
||||
[li] First list element<br>
|
||||
[li] Second list element<br>
|
||||
[/list]</td>
|
||||
<td>
|
||||
<ul class="listnone" style="list-style-type: none;">
|
||||
|
@ -416,8 +416,8 @@ code</code></td>
|
|||
</tr>
|
||||
<tr>
|
||||
<td>[list=i]<br>
|
||||
[*] First list element<br>
|
||||
[*] Second list element<br>
|
||||
[li] First list element<br>
|
||||
[li] Second list element<br>
|
||||
[/list]</td>
|
||||
<td>
|
||||
<ul class="listlowerroman" style="list-style-type: lower-roman;">
|
||||
|
@ -428,8 +428,8 @@ code</code></td>
|
|||
</tr>
|
||||
<tr>
|
||||
<td>[list=I]<br>
|
||||
[*] First list element<br>
|
||||
[*] Second list element<br>
|
||||
[li] First list element<br>
|
||||
[li] Second list element<br>
|
||||
[/list]</td>
|
||||
<td>
|
||||
<ul class="listupperroman" style="list-style-type: upper-roman;">
|
||||
|
@ -440,8 +440,8 @@ code</code></td>
|
|||
</tr>
|
||||
<tr>
|
||||
<td>[list=a]<br>
|
||||
[*] First list element<br>
|
||||
[*] Second list element<br>
|
||||
[li] First list element<br>
|
||||
[li] Second list element<br>
|
||||
[/list]</td>
|
||||
<td>
|
||||
<ul class="listloweralpha" style="list-style-type: lower-alpha;">
|
||||
|
@ -452,8 +452,8 @@ code</code></td>
|
|||
</tr>
|
||||
<tr>
|
||||
<td>[list=A]<br>
|
||||
[*] First list element<br>
|
||||
[*] Second list element<br>
|
||||
[li] First list element<br>
|
||||
[li] Second list element<br>
|
||||
[/list]</td>
|
||||
<td>
|
||||
<ul class="listupperalpha" style="list-style-type: upper-alpha;">
|
||||
|
|
|
@ -23,12 +23,17 @@ Predefined Channels
|
|||
|
||||
* For you: Posts from contacts you interact with and who interact with you. In detail, it consists of:
|
||||
* Posts from people you interact with on a more than average level.
|
||||
* Posts from the accounts that you follow with a more than average number of interactions-
|
||||
* Posts from the accounts that you follow with a more than average number of interactions.
|
||||
* Posts from accounts where you activated "notify on new posts" or where you have set the channel frequency accordingly.
|
||||
* Discover: Posts from contacts you don't follow, but that might be of interest for you to follow. In detail, it consists of:
|
||||
* Posts from people you don't follow but you interact with on a more than average level.
|
||||
* Posts from people you don't follow but that interact with you on a more than average level.
|
||||
* Popular posts from people you don't follow but you interacted with or who interacted with you on any level.
|
||||
* What's Hot: Posts with a more than average number of interactions.
|
||||
* Language: Posts in your language.
|
||||
* Followers: Posts from your followers that you don't follow.
|
||||
* Sharers of sharers: Posts from accounts that are followed by accounts that you follow.
|
||||
* Quiet sharers: Posts from accounts that you follow but who don't post very often.
|
||||
* Images: Posts with images.
|
||||
* Audio: Posts with audio.
|
||||
* Videos: Posts with videos.
|
||||
|
@ -45,41 +50,50 @@ Each channel is defined by these values:
|
|||
* Access Key: When you want to access this channel via an access key, you can define it here. Pay attention to not use an already used one.
|
||||
* Circle: This defines the data source for this channel. By default it is set to the public timeline. There are some predefined values, like the accounts that you follow or the accounts that follow you. Also all of your circles can be selected.
|
||||
* Include Tags: Comma separated list of tags. A post will be used when it contains any of the listed tags.
|
||||
* Exclude Tags: Comma separated list of tags. If a post contain any of these tags, then it will not be part of nthis channel.
|
||||
* Exclude Tags: Comma separated list of tags. If a post contain any of these tags, then it will not be part of this channel.
|
||||
* Full Text Search: This can be used to include or exclude content, based on the content and some additional keywords. It uses the "boolean mode" operators from MariaDB: https://mariadb.com/kb/en/full-text-index-overview/#in-boolean-mode
|
||||
* Images, Videos, Audio: When selected, you will see content with the selected media type. This can be combined. If none of these fields are checked, you will see any content, with or without attacked media.
|
||||
* Images, Videos, Audio: When selected, you will see content with the selected media type. This can be combined. If none of these fields are checked, you will see any content, with or without attached media.
|
||||
|
||||
Additional keywords for the full text search
|
||||
---
|
||||
|
||||
Additionally to the search for content, there are additional keywords that can be used in the full text search:
|
||||
Additionally to the search for content, there are keywords that can be used in the full text search.
|
||||
Alternatives are presented with "|".
|
||||
|
||||
* from - Use "from:nickname" or "from:nickname@domain.tld" to search for posts from a specific author.
|
||||
* to - Use "from:nickname" or "from:nickname@domain.tld" to search for posts with the given contact as receiver.
|
||||
* group - Use "from:nickname" or "from:nickname@domain.tld" to search for group post of the given group.
|
||||
* to - Use "to:nickname" or "to:nickname@domain.tld" to search for posts with the given contact as receiver.
|
||||
* group - Use "group:nickname" or "group:nickname@domain.tld" to search for posts of the given group.
|
||||
* application | relay - Use "application:nickname" or "application:nickname@domain.tld" to search for posts that had been reshared by the given relay application.
|
||||
* server - Use "server:hostname" to search for posts from a specific server. In the case of group postings, the search text contains both the hostname of the group server and the author's hostname.
|
||||
* source - The ActivityPub type of the post source. Use this for example to include or exclude group posts or posts from services (aka bots).
|
||||
* source:person - The post is created by a regular user account.
|
||||
* source:organization - The post is created by an organisation.
|
||||
* source:group - The post is created by or distributed via a group.
|
||||
* source:service - The posts originates from a service account. This source type is often used to mark bot accounts.
|
||||
* source:application - The post is created by an application. This is most likely unused in the fediverse for post creation.
|
||||
* source:service | source:news - The posts originates from a service account. This source type is often used to mark bot accounts.
|
||||
* source:application | source:relay - The post is created by an application. This is most likely unused in the fediverse for post creation.
|
||||
* tag - Use "tag:tagname" to search for a specific tag.
|
||||
* network - Use this to include or exclude some networks from your channel.
|
||||
* network:apub - ActivityPub (Used by the systems in the Fediverse)
|
||||
* network:dfrn - Legacy Friendica protocol. Nowayday Friendica mostly uses ActivityPub.
|
||||
* network:dspr - The Diaspora protocol is mainly used by Diaspora itself. Some other systems support the protocol as well like Hubzilla, Socialhome or Ganggo.
|
||||
* media - With this keyword you can search for attached media.
|
||||
* media:image | media:photo | media:picture - The post contains an image
|
||||
* media:video - The post contains a video
|
||||
* media:audio - The post contains audio
|
||||
* media:card - The post contains a link preview card
|
||||
* media:post - The post links another post, means it is a quoted post
|
||||
* network | net - Use this to include or exclude some networks from your channel.
|
||||
* network:apub | network:activitypub - ActivityPub (Used by the systems in the Fediverse)
|
||||
* network:dfrn | network:friendica - Legacy Friendica protocol. Nowayday Friendica mostly uses ActivityPub.
|
||||
* network:dspr | network:diaspora - The Diaspora protocol is mainly used by Diaspora itself. Some other systems support the protocol as well like Hubzilla, Socialhome or Ganggo.
|
||||
* network:feed - RSS/Atom feeds
|
||||
* network:mail - Mails that had been imported via IMAP.
|
||||
* network:stat - The OStatus protocol is mainly used by old GNU Social installations.
|
||||
* network:dscs - Posts that are received by the Discourse connector.
|
||||
* network:tmbl - Posts that are received by the Tumblr connector.
|
||||
* network:bsky - Posts that are received by the Bluesky connector.
|
||||
* network:stat | network:ostatus - The OStatus protocol is mainly used by old GNU Social installations.
|
||||
* network:dscs | network:discourse - Posts that are received by the Discourse connector.
|
||||
* network:tmbl | network:tumblr - Posts that are received by the Tumblr connector.
|
||||
* network:bsky | network:bluesky - Posts that are received by the Bluesky connector.
|
||||
* platform - Use this to include or exclude some platforms from your channel, e.g. "+platform:friendica". In the case of group postings, the search text contains both the platform of the group server and the author's platform.
|
||||
* visibility - You have the choice between different visibilities. You can only see unlisted or private posts that you have the access for.
|
||||
* visibility:public
|
||||
* visibility:unlisted
|
||||
* visibility:private
|
||||
* language | lang - Use "language:code" to search for posts with the given language in the [ISO 639-1](https://en.wikipedia.org/wiki/ISO_639-1) format.
|
||||
|
||||
Remember that you can combine these kerywords.
|
||||
Remember that you can combine these keywords.
|
||||
So for example you can create a channel with all posts that talk about the Fediverse - that aren't posted in the Fediverse with the search terms: "fediverse -network:apub -network:dfrn"
|
15
doc/FAQ.md
|
@ -103,6 +103,9 @@ When a certain language is forced, the language remains until session is closed.
|
|||
<a name="contacts"></a>
|
||||
### How do blocked, ignored, archived and hidden contacts behave?
|
||||
|
||||
These are various categories of contacts that are restricted in some way.
|
||||
Many of these types are related to [Safety](help/Safety).
|
||||
|
||||
##### Blocked
|
||||
|
||||
Direct communication will be blocked.
|
||||
|
@ -126,7 +129,7 @@ However, unlike blocking, existing posts this person made before being archived
|
|||
|
||||
##### Hidden
|
||||
|
||||
Contact not be displayed in your public friend list.
|
||||
The contact not be displayed in your public friend list.
|
||||
However, a hidden contact will appear normally in conversations and this may expose their hidden status to anybody who can see the conversation.
|
||||
|
||||
<a name="removed"></a>
|
||||
|
@ -178,12 +181,12 @@ The available features are client specific and may differ.
|
|||
#### Android
|
||||
|
||||
* [AndStatus](http://andstatus.org) ([F-Droid](https://f-droid.org/repository/browse/?fdid=org.andstatus.app), [Google Play](https://play.google.com/store/apps/details?id=org.andstatus.app))
|
||||
* [Fedi](https://github.com/Big-Fig/Fediverse.app) ([Google Play](https://play.google.com/store/apps/details?id=com.fediverse.app))
|
||||
* [Fedilab](https://fedilab.app) ([F-Droid](https://f-droid.org/app/fr.gouv.etalab.mastodon), [Google Play](https://play.google.com/store/apps/details?id=app.fedilab.android))
|
||||
* [Friendiqa](https://git.friendi.ca/lubuwest/Friendiqa) ([F-Droid](https://git.friendi.ca/lubuwest/Friendiqa#install), [Google Play](https://play.google.com/store/apps/details?id=org.qtproject.friendiqa))
|
||||
* [Husky](https://git.sr.ht/~captainepoch/husky) ([F-Droid](https://f-droid.org/repository/browse/?fdid=su.xash.husky), [Google Play](https://play.google.com/store/apps/details?id=su.xash.husky))
|
||||
* [Husky](https://codeberg.org/husky/husky) ([F-Droid](https://f-droid.org/repository/browse/?fdid=su.xash.husky), [Google Play](https://play.google.com/store/apps/details?id=su.xash.husky))
|
||||
* [Mastodon](https://github.com/mastodon/mastodon-android) ([F-Droid](https://f-droid.org/en/packages/org.joinmastodon.android/), [Google Play](https://play.google.com/store/apps/details?id=org.joinmastodon.android))
|
||||
* [Subway Tooter](https://github.com/tateisu/SubwayTooter) ([F-Droid](https://android.izzysoft.de/repo/apk/jp.juggler.subwaytooter))
|
||||
* [Pachli](https://pachli.app/) ([F-Droid](https://f-droid.org/en/packages/app.pachli/), [Google Play](https://play.google.com/store/apps/details?id=app.pachli))
|
||||
* [Subway Tooter](https://github.com/tateisu/SubwayTooter) ([F-Droid via Izzy](https://android.izzysoft.de/repo/apk/jp.juggler.subwaytooter.noFcm))
|
||||
* [Tooot](https://tooot.app/) ([Google Play](https://play.google.com/store/apps/details?id=com.xmflsct.app.tooot))
|
||||
* [Tusky](https://tusky.app) ([F-Droid](https://f-droid.org/repository/browse/?fdid=com.keylesspalace.tusky), [Google Play](https://play.google.com/store/apps/details?id=com.keylesspalace.tusky))
|
||||
* [TwidereX](https://github.com/TwidereProject/TwidereX-Android) ([F-Droid](https://f-droid.org/en/packages/com.twidere.twiderex/), [Google Play](https://play.google.com/store/apps/details?id=com.twidere.twiderex))
|
||||
|
@ -193,7 +196,7 @@ The available features are client specific and may differ.
|
|||
|
||||
* [Mastodon](https://joinmastodon.org/apps) ([App Store](https://apps.apple.com/us/app/mastodon-for-iphone/id1571998974))
|
||||
* [Stella*](https://www.stella-app.net/) ([App Store](https://apps.apple.com/us/app/stella-for-mastodon-twitter/id921372048))
|
||||
* [Tooot](https://github.com/tooot-app) ([App Store](https://apps.apple.com/app/id1549772269)
|
||||
* [Tooot](https://github.com/tooot-app) ([App Store](https://apps.apple.com/app/id1549772269))
|
||||
* [TwidereX](https://github.com/TwidereProject/TwidereX-iOS) ([App Store](https://apps.apple.com/app/twidere-x/id1530314034))
|
||||
|
||||
#### Linux
|
||||
|
@ -211,7 +214,7 @@ The available features are client specific and may differ.
|
|||
#### Windows
|
||||
|
||||
* [TheDesk](https://thedesk.top/en/) ([GitHub](https://github.com/cutls/TheDesk))
|
||||
* [Whalebird](https://whalebird.social/en/desktop/contents) ([Website Download](https://whalebird.social/en/desktop/contents/downloads#windows), [GitHub](https://github.com/h3poteto/whalebird-desktop))
|
||||
* [Whalebird](https://whalebird.social/en/desktop/contents) ([Microsoft Store](https://apps.microsoft.com/detail/9nbw4csdv5hc), [GitHub](https://github.com/h3poteto/whalebird-desktop))
|
||||
|
||||
#### Web Frontend
|
||||
|
||||
|
|
26
doc/Home.md
|
@ -1,5 +1,5 @@
|
|||
Friendica Documentation and Resources
|
||||
=====================================
|
||||
Help
|
||||
====
|
||||
|
||||
**User Manual**
|
||||
|
||||
|
@ -14,6 +14,7 @@ Friendica Documentation and Resources
|
|||
* You and other users
|
||||
* [Connectors](help/Connectors)
|
||||
* [Making Friends](help/Making-Friends)
|
||||
* [Safety](help/Safety)
|
||||
* [Circles and Privacy](help/Circles-and-Privacy)
|
||||
* [Tags and Mentions](help/Tags-and-Mentions)
|
||||
* [Community Groups](help/Groups)
|
||||
|
@ -64,18 +65,17 @@ Friendica Documentation and Resources
|
|||
* [Database schema documentation](help/database)
|
||||
* [Class Autoloading](help/autoloader)
|
||||
|
||||
**External Resources**
|
||||
**Links**
|
||||
|
||||
* Website: [https://friendi.ca](https://friendi.ca)
|
||||
* Help Group: [@helpers@forum.friendi.ca](https://forum.friendi.ca/~helpers)
|
||||
* XMPP: [support@forum.friendi.ca](xmpp:support@forum.friendi.ca?join)
|
||||
* IRC: [https://web.libera.chat/?channels=#friendica](https://web.libera.chat/?channels=#friendica)
|
||||
* Matrix: [https://matrix.to/#/#friendi.ca:matrix.org](https://matrix.to/#/#friendi.ca:matrix.org)
|
||||
* Mailing List: [https://mailman.friendi.ca/mailman/listinfo/support-friendi.ca](http://mailman.friendi.ca/mailman/listinfo/support-friendi.ca)
|
||||
|
||||
* [Main Website](https://friendi.ca)
|
||||
* Ways to get Support
|
||||
* Friendica Support Group: [@helpers@forum.friendi.ca](https://forum.friendi.ca/~helpers)
|
||||
* [Mailing List Archive](http://mailman.friendi.ca/mailman/listinfo/support-friendi.ca) you can subscribe to the list by sending an email to ``support-request(at)friendi.ca?subject=subscribe``
|
||||
* Community chat rooms (the IRC, Matrix and XMPP rooms are bridged) these public chats are logged [from IRC](https://gnusociarg.nsupdate.info/2021/%23friendica/) and [Matrix](https://view.matrix.org/alias/%23friendi.ca:matrix.org/)
|
||||
* XMPP/Jabber MUC: support(at)forum.friendi.ca
|
||||
* IRC: #friendica at [libera.chat](https://web.libera.chat/?channels=#friendica)
|
||||
* Matrix: [#friendi.ca](https://matrix.to/#/#friendi.ca:matrix.org) or [#friendica-en](https://matrix.to/#/#friendica-en:matrix.org) at matrix.org
|
||||
|
||||
**About**
|
||||
|
||||
* [Site/Version Info](friendica)
|
||||
* [Friendica Credits](credits)
|
||||
* [Server Information](friendica)
|
||||
* [Credits](credits)
|
||||
|
|
|
@ -30,7 +30,7 @@ Due to the large variety of operating systems and PHP platforms in existence we
|
|||
* Apache with mod-rewrite enabled and "Options All" so you can use a local `.htaccess` file
|
||||
* PHP 7.4+
|
||||
* PHP *command line* access with register_argc_argv set to true in the php.ini file
|
||||
* Curl, GD, GMP, PDO, mbstrings, MySQLi, hash, xml, zip, IntlChar and OpenSSL extensions
|
||||
* Curl, GD, GMP, PDO, mbstrings, MySQLi, hash, xml, zip, IntlChar, IDN and OpenSSL extensions
|
||||
* The POSIX module of PHP needs to be activated (e.g. [RHEL, CentOS](http://www.bigsoft.co.uk/blog/index.php/2014/12/08/posix-php-commands-not-working-under-centos-7) have disabled it)
|
||||
* Some form of email server or email gateway such that PHP mail() works.
|
||||
If you cannot set up your own email server, you can use the [phpmailer](https://github.com/friendica/friendica-addons/tree/develop/phpmailer) addon and use a remote SMTP server.
|
||||
|
@ -44,7 +44,7 @@ For alternative server configurations (such as Nginx server and MariaDB database
|
|||
|
||||
### Optional
|
||||
|
||||
* PHP ImageMagick extension (php-imagick) for animated GIF support.
|
||||
* PHP ImageMagick extension (php-imagick) for animated GIF and animated WebP support.
|
||||
|
||||
## Installation procedure
|
||||
|
||||
|
|
|
@ -98,14 +98,19 @@ As a friend, you can both communicate with each other.
|
|||
|
||||
diaspora* uses a different terminology, and you are given the option of allowing them to "share with you", or being full friends.
|
||||
|
||||
Ignoring, blocking and deleting contacts
|
||||
Deleting
|
||||
---
|
||||
Once you have become friends, if you find the person constantly sends you spam or worthless information, you can "Ignore" them - without breaking off the friendship or even alerting them to the fact that you aren't interested in anything they are saying.
|
||||
In many ways they are like a "follower" - but they don't know this.
|
||||
They think they are a friend.
|
||||
|
||||
You can also "block" a person.
|
||||
This completely blocks communications with that person.
|
||||
They may still be able to see your public posts, as can anybody in the world, but they cannot communicate with you directly.
|
||||
You can delete a friend no matter what the friendship status - which completely removes everything relating to that person from your website.
|
||||
|
||||
You can also delete a friend no matter what the friendship status - which completely removes everything relating to that person from your website.
|
||||
Unwanted Behaviour
|
||||
---
|
||||
|
||||
If a contact engages in abuse, harrassment, or other unwanted behaviour, there are various actions you can take.
|
||||
These include:
|
||||
|
||||
* Reporting them to your administrator, optionally also their administrator
|
||||
* Ignoring the contact, so that you will not see their posts
|
||||
* Blocking the contact from receiving your posts
|
||||
|
||||
For more information, see [Safety](help/Safety).
|
||||
|
|
73
doc/Safety.md
Normal file
|
@ -0,0 +1,73 @@
|
|||
Safety
|
||||
======
|
||||
|
||||
* [Home](help)
|
||||
|
||||
Each Friendica instance is linked together with a global network of other servers, some running Friendica and some running other software.
|
||||
These servers support a diverse global community of millions of users.
|
||||
Inevitably, some of these users are malicious.
|
||||
Friendica provides several features to keep you safe from abuse and harrassment.
|
||||
|
||||
Terms of Service
|
||||
---
|
||||
|
||||
Each instance is entitled to define its own Terms of Service, also often called a Code of Conduct.
|
||||
These terms include rules for behaviour.
|
||||
These Terms of Service are visible when creating an account.
|
||||
By creating an account on a server, you agree to be bound by these Terms of Service.
|
||||
Users who violate the terms of service of their instance may face sanctions including being suspended or banned from their instance.
|
||||
|
||||
Remember that conversations frequently involve participants from different instances with different rules.
|
||||
Participants are only bound by the rules of the server where they have an account, not by the rules of your server.
|
||||
Terms of Service may even be completely incompatible.
|
||||
|
||||
Reporting
|
||||
---
|
||||
|
||||
Your local administrators are responsible for ensuring a safe online environment for all users on your server.
|
||||
They rely on reports from users to highlight behaviour that puts other users at risk.
|
||||
If you see problematic behaviour from a user, whether they are from another server or are local to your server, you can report that behaviour to your administrator.
|
||||
You can also choose to send that report to their administrator at the same time.
|
||||
You will be given an opportunity to select the type of problem you are seeing.
|
||||
Your local administrator then has the option of blocking that user for all users on your local instance.
|
||||
If a remote server is a constant source of abuse and their administrators are unable or unwilling to control their users behaviour, your administrator can even block the entire remote server.
|
||||
|
||||
Ignoring
|
||||
---
|
||||
|
||||
Once you have become friends, if you find the person constantly sends you spam or worthless information, you can "Ignore" them - without breaking off the friendship or even alerting them to the fact that you aren't interested in anything they are saying.
|
||||
In many ways they are like a "follower" - but they don't know this.
|
||||
They think they are a friend.
|
||||
Your own posts will still be delivered to them.
|
||||
Other people will see their replies to you normally.
|
||||
|
||||
Some servers are frequent sources of abusive or other unwanted behaviour.
|
||||
For this reason you can also choose to ignore entire servers.
|
||||
Users on that server can still follow you as normal.
|
||||
|
||||
Blocking
|
||||
---
|
||||
|
||||
You can also "block" a person.
|
||||
This completely blocks communications with that person.
|
||||
Your public comments will no longer be sent to them. Their own public posts will not be visible in your stream.
|
||||
If they participate in other conversations you are following, their replies will still be part of the thread.
|
||||
However, their replies will be collapsed by default, and only visible if you open the reply.
|
||||
Other people will see their replies normally.
|
||||
|
||||
A blocked contact will still believe that they are following you.
|
||||
If they delete you as a contact and then add you again, they will return to apparently following you but in fact still being blocked.
|
||||
You will not be notified when this happens.
|
||||
|
||||
When you block a person, your server will notify their server that the block has occurred.
|
||||
This is so that if, for example, Alice and Bob follow you from the same server, and you want to block Alice but not Bob, their server can decide which accounts should see your post.
|
||||
This does mean that the administrator of their server can see that you have applied the block, and may inform the blocked person.
|
||||
In some cases this could lead to retaliation.
|
||||
There are several other ways someone can determine that you have blocked them, and see your public posts despite the block.
|
||||
For example, they can simply log out and view your posts.
|
||||
|
||||
Archiving
|
||||
---
|
||||
|
||||
Archiving is similar to blocking.
|
||||
However, existing posts this person made before being archived will be visible in your stream.
|
|
@ -61,14 +61,17 @@ Database Tables
|
|||
| [post-category](help/database/db_post-category) | post relation to categories |
|
||||
| [post-collection](help/database/db_post-collection) | Collection of posts |
|
||||
| [post-content](help/database/db_post-content) | Content for all posts |
|
||||
| [post-counts](help/database/db_post-counts) | Original remote activity |
|
||||
| [post-delivery](help/database/db_post-delivery) | Delivery data for posts for the batch processing |
|
||||
| [post-delivery-data](help/database/db_post-delivery-data) | Delivery data for items |
|
||||
| [post-engagement](help/database/db_post-engagement) | Engagement data per post |
|
||||
| [post-history](help/database/db_post-history) | Post history |
|
||||
| [post-link](help/database/db_post-link) | Post related external links |
|
||||
| [post-media](help/database/db_post-media) | Attached media |
|
||||
| [post-origin](help/database/db_post-origin) | Posts from local users |
|
||||
| [post-question](help/database/db_post-question) | Question |
|
||||
| [post-question-option](help/database/db_post-question-option) | Question option |
|
||||
| [post-searchindex](help/database/db_post-searchindex) | Content for all posts |
|
||||
| [post-tag](help/database/db_post-tag) | post relation to tags |
|
||||
| [post-thread](help/database/db_post-thread) | Thread related data |
|
||||
| [post-thread-user](help/database/db_post-thread-user) | Thread related data per user |
|
||||
|
|
|
@ -16,8 +16,13 @@ Fields
|
|||
| access-key | Access key | varchar(1) | YES | | NULL | |
|
||||
| include-tags | Comma separated list of tags that will be included in the channel | varchar(1023) | YES | | NULL | |
|
||||
| exclude-tags | Comma separated list of tags that aren't allowed in the channel | varchar(1023) | YES | | NULL | |
|
||||
| min-size | Minimum post size | int unsigned | YES | | NULL | |
|
||||
| max-size | Maximum post size | int unsigned | YES | | NULL | |
|
||||
| full-text-search | Full text search pattern, see https://mariadb.com/kb/en/full-text-index-overview/#in-boolean-mode | varchar(1023) | YES | | NULL | |
|
||||
| media-type | Filtered media types | smallint unsigned | YES | | NULL | |
|
||||
| languages | Desired languages | mediumtext | YES | | NULL | |
|
||||
| publish | publish channel content | boolean | YES | | NULL | |
|
||||
| valid | Set, when the full-text-search is valid | boolean | YES | | NULL | |
|
||||
|
||||
Indexes
|
||||
------------
|
||||
|
|
|
@ -6,17 +6,18 @@ Contact relations
|
|||
Fields
|
||||
------
|
||||
|
||||
| Field | Description | Type | Null | Key | Default | Extra |
|
||||
| --------------------- | -------------------------------------------------------- | ----------------- | ---- | --- | ------------------- | ----- |
|
||||
| cid | contact the related contact had interacted with | int unsigned | NO | PRI | 0 | |
|
||||
| relation-cid | related contact who had interacted with the contact | int unsigned | NO | PRI | 0 | |
|
||||
| last-interaction | Date of the last interaction by relation-cid on cid | datetime | NO | | 0001-01-01 00:00:00 | |
|
||||
| follow-updated | Date of the last update of the contact relationship | datetime | NO | | 0001-01-01 00:00:00 | |
|
||||
| follows | if true, relation-cid follows cid | boolean | NO | | 0 | |
|
||||
| score | score for interactions of cid on relation-cid | smallint unsigned | YES | | NULL | |
|
||||
| relation-score | score for interactions of relation-cid on cid | smallint unsigned | YES | | NULL | |
|
||||
| thread-score | score for interactions of cid on threads of relation-cid | smallint unsigned | YES | | NULL | |
|
||||
| relation-thread-score | score for interactions of relation-cid on threads of cid | smallint unsigned | YES | | NULL | |
|
||||
| Field | Description | Type | Null | Key | Default | Extra |
|
||||
| --------------------- | ----------------------------------------------------------------------- | ----------------- | ---- | --- | ------------------- | ----- |
|
||||
| cid | contact the related contact had interacted with | int unsigned | NO | PRI | 0 | |
|
||||
| relation-cid | related contact who had interacted with the contact | int unsigned | NO | PRI | 0 | |
|
||||
| last-interaction | Date of the last interaction by relation-cid on cid | datetime | NO | | 0001-01-01 00:00:00 | |
|
||||
| follow-updated | Date of the last update of the contact relationship | datetime | NO | | 0001-01-01 00:00:00 | |
|
||||
| follows | if true, relation-cid follows cid | boolean | NO | | 0 | |
|
||||
| score | score for interactions of cid on relation-cid | smallint unsigned | YES | | NULL | |
|
||||
| relation-score | score for interactions of relation-cid on cid | smallint unsigned | YES | | NULL | |
|
||||
| thread-score | score for interactions of cid on threads of relation-cid | smallint unsigned | YES | | NULL | |
|
||||
| relation-thread-score | score for interactions of relation-cid on threads of cid | smallint unsigned | YES | | NULL | |
|
||||
| post-score | score for the amount of posts from cid that can be seen by relation-cid | smallint unsigned | YES | | NULL | |
|
||||
|
||||
Indexes
|
||||
------------
|
||||
|
|
|
@ -23,6 +23,8 @@ Fields
|
|||
| local-comments | Number of local comments | int unsigned | YES | | NULL | |
|
||||
| directory-type | Type of directory service (Poco, Mastodon) | tinyint | YES | | 0 | |
|
||||
| poco | | varbinary(383) | NO | | | |
|
||||
| openwebauth | Path to the OpenWebAuth endpoint | varbinary(383) | YES | | NULL | |
|
||||
| authredirect | Path to the authRedirect endpoint | varbinary(383) | YES | | NULL | |
|
||||
| noscrape | | varbinary(383) | NO | | | |
|
||||
| network | | char(4) | NO | | | |
|
||||
| protocol | The protocol of the server | tinyint unsigned | YES | | NULL | |
|
||||
|
|
|
@ -17,6 +17,7 @@ Fields
|
|||
| location | text location where this item originated | varchar(255) | NO | | | |
|
||||
| coord | longitude/latitude pair representing location where this item originated | varchar(255) | NO | | | |
|
||||
| language | Language information about this post | text | YES | | NULL | |
|
||||
| sensitive | If true, this post contains sensitive content | boolean | YES | | NULL | |
|
||||
| app | application which generated this item | varchar(255) | NO | | | |
|
||||
| rendered-hash | | varchar(32) | NO | | | |
|
||||
| rendered-html | item.body converted to html | mediumtext | YES | | NULL | |
|
||||
|
@ -30,13 +31,12 @@ Fields
|
|||
Indexes
|
||||
------------
|
||||
|
||||
| Name | Fields |
|
||||
| -------------------------- | -------------------------------------- |
|
||||
| PRIMARY | uri-id |
|
||||
| plink | plink(191) |
|
||||
| resource-id | resource-id |
|
||||
| title-content-warning-body | FULLTEXT, title, content-warning, body |
|
||||
| quote-uri-id | quote-uri-id |
|
||||
| Name | Fields |
|
||||
| ------------ | ------------ |
|
||||
| PRIMARY | uri-id |
|
||||
| plink | plink(191) |
|
||||
| resource-id | resource-id |
|
||||
| quote-uri-id | quote-uri-id |
|
||||
|
||||
Foreign Keys
|
||||
------------
|
||||
|
|
35
doc/database/db_post-counts.md
Normal file
|
@ -0,0 +1,35 @@
|
|||
Table post-counts
|
||||
===========
|
||||
|
||||
Original remote activity
|
||||
|
||||
Fields
|
||||
------
|
||||
|
||||
| Field | Description | Type | Null | Key | Default | Extra |
|
||||
| ------------- | ----------------------------------------------------------- | ----------------- | ---- | --- | ------- | ----- |
|
||||
| uri-id | Id of the item-uri table entry that contains the item uri | int unsigned | NO | PRI | NULL | |
|
||||
| vid | Id of the verb table entry that contains the activity verbs | smallint unsigned | NO | PRI | NULL | |
|
||||
| reaction | Emoji Reaction | varchar(4) | NO | PRI | NULL | |
|
||||
| parent-uri-id | Id of the item-uri table that contains the parent uri | int unsigned | YES | | NULL | |
|
||||
| count | Number of activities | int unsigned | YES | | 0 | |
|
||||
|
||||
Indexes
|
||||
------------
|
||||
|
||||
| Name | Fields |
|
||||
| ------------- | --------------------- |
|
||||
| PRIMARY | uri-id, vid, reaction |
|
||||
| vid | vid |
|
||||
| parent-uri-id | parent-uri-id |
|
||||
|
||||
Foreign Keys
|
||||
------------
|
||||
|
||||
| Field | Target Table | Target Field |
|
||||
|-------|--------------|--------------|
|
||||
| uri-id | [item-uri](help/database/db_item-uri) | id |
|
||||
| vid | [verb](help/database/db_verb) | id |
|
||||
| parent-uri-id | [item-uri](help/database/db_item-uri) | id |
|
||||
|
||||
Return to [database documentation](help/database)
|
|
@ -11,10 +11,12 @@ Fields
|
|||
| uri-id | Id of the item-uri table entry that contains the item uri | int unsigned | NO | PRI | NULL | |
|
||||
| owner-id | Item owner | int unsigned | NO | | 0 | |
|
||||
| contact-type | Person, organisation, news, community, relay | tinyint | NO | | 0 | |
|
||||
| media-type | Type of media in a bit array (1 = image, 2 = video, 4 = audio | tinyint | NO | | 0 | |
|
||||
| language | Language information about this post | varbinary(128) | YES | | NULL | |
|
||||
| media-type | Type of media in a bit array (1 = image, 2 = video, 4 = audio) | tinyint | NO | | 0 | |
|
||||
| language | Language information about this post in the ISO 639-1 format | char(2) | YES | | NULL | |
|
||||
| searchtext | Simplified text for the full text search | mediumtext | YES | | NULL | |
|
||||
| size | Body size | int unsigned | YES | | NULL | |
|
||||
| created | | datetime | YES | | NULL | |
|
||||
| network | | char(4) | YES | | NULL | |
|
||||
| restricted | If true, this post is either unlisted or not from a federated network | boolean | NO | | 0 | |
|
||||
| comments | Number of comments | mediumint unsigned | YES | | NULL | |
|
||||
| activities | Number of activities (like, dislike, ...) | mediumint unsigned | YES | | NULL | |
|
||||
|
|
48
doc/database/db_post-origin.md
Normal file
|
@ -0,0 +1,48 @@
|
|||
Table post-origin
|
||||
===========
|
||||
|
||||
Posts from local users
|
||||
|
||||
Fields
|
||||
------
|
||||
|
||||
| Field | Description | Type | Null | Key | Default | Extra |
|
||||
| ------------- | ------------------------------------------------------------ | ------------------ | ---- | --- | ------------------- | ----- |
|
||||
| id | | int unsigned | NO | PRI | NULL | |
|
||||
| uri-id | Id of the item-uri table entry that contains the item uri | int unsigned | NO | | NULL | |
|
||||
| uid | Owner id which owns this copy of the item | mediumint unsigned | NO | | NULL | |
|
||||
| parent-uri-id | Id of the item-uri table that contains the parent uri | int unsigned | YES | | NULL | |
|
||||
| thr-parent-id | Id of the item-uri table that contains the thread parent uri | int unsigned | YES | | NULL | |
|
||||
| created | Creation timestamp. | datetime | NO | | 0001-01-01 00:00:00 | |
|
||||
| received | datetime | datetime | NO | | 0001-01-01 00:00:00 | |
|
||||
| gravity | | tinyint unsigned | NO | | 0 | |
|
||||
| vid | Id of the verb table entry that contains the activity verbs | smallint unsigned | YES | | NULL | |
|
||||
| private | 0=public, 1=private, 2=unlisted | tinyint unsigned | NO | | 0 | |
|
||||
| wall | This item was posted to the wall of uid | boolean | NO | | 0 | |
|
||||
|
||||
Indexes
|
||||
------------
|
||||
|
||||
| Name | Fields |
|
||||
| ----------------- | ------------------- |
|
||||
| PRIMARY | id |
|
||||
| uid_uri-id | UNIQUE, uid, uri-id |
|
||||
| uri-id | uri-id |
|
||||
| parent-uri-id | parent-uri-id |
|
||||
| thr-parent-id | thr-parent-id |
|
||||
| vid | vid |
|
||||
| parent-uri-id_uid | parent-uri-id, uid |
|
||||
| uid_wall_received | uid, wall, received |
|
||||
|
||||
Foreign Keys
|
||||
------------
|
||||
|
||||
| Field | Target Table | Target Field |
|
||||
|-------|--------------|--------------|
|
||||
| uri-id | [item-uri](help/database/db_item-uri) | id |
|
||||
| uid | [user](help/database/db_user) | uid |
|
||||
| parent-uri-id | [item-uri](help/database/db_item-uri) | id |
|
||||
| thr-parent-id | [item-uri](help/database/db_item-uri) | id |
|
||||
| vid | [verb](help/database/db_verb) | id |
|
||||
|
||||
Return to [database documentation](help/database)
|
38
doc/database/db_post-searchindex.md
Normal file
|
@ -0,0 +1,38 @@
|
|||
Table post-searchindex
|
||||
===========
|
||||
|
||||
Content for all posts
|
||||
|
||||
Fields
|
||||
------
|
||||
|
||||
| Field | Description | Type | Null | Key | Default | Extra |
|
||||
| ---------- | --------------------------------------------------------------------- | ------------ | ---- | --- | ------- | ----- |
|
||||
| uri-id | Id of the item-uri table entry that contains the item uri | int unsigned | NO | PRI | NULL | |
|
||||
| owner-id | Item owner | int unsigned | NO | | 0 | |
|
||||
| media-type | Type of media in a bit array (1 = image, 2 = video, 4 = audio) | tinyint | NO | | 0 | |
|
||||
| language | Language information about this post in the ISO 639-1 format | char(2) | YES | | NULL | |
|
||||
| searchtext | Simplified text for the full text search | mediumtext | YES | | NULL | |
|
||||
| size | Body size | int unsigned | YES | | NULL | |
|
||||
| created | | datetime | YES | | NULL | |
|
||||
| restricted | If true, this post is either unlisted or not from a federated network | boolean | NO | | 0 | |
|
||||
|
||||
Indexes
|
||||
------------
|
||||
|
||||
| Name | Fields |
|
||||
| ---------- | -------------------- |
|
||||
| PRIMARY | uri-id |
|
||||
| owner-id | owner-id |
|
||||
| created | created |
|
||||
| searchtext | FULLTEXT, searchtext |
|
||||
|
||||
Foreign Keys
|
||||
------------
|
||||
|
||||
| Field | Target Table | Target Field |
|
||||
|-------|--------------|--------------|
|
||||
| uri-id | [item-uri](help/database/db_item-uri) | id |
|
||||
| owner-id | [contact](help/database/db_contact) | id |
|
||||
|
||||
Return to [database documentation](help/database)
|
|
@ -25,6 +25,7 @@ Fields
|
|||
| post-reason | Reason why the post arrived at the user | tinyint unsigned | NO | | 0 | |
|
||||
| vid | Id of the verb table entry that contains the activity verbs | smallint unsigned | YES | | NULL | |
|
||||
| private | 0=public, 1=private, 2=unlisted | tinyint unsigned | NO | | 0 | |
|
||||
| restrictions | Bit array of post restrictions (1 = Reply, 2 = Like, 4 = Announce) | tinyint unsigned | YES | | NULL | |
|
||||
| global | | boolean | NO | | 0 | |
|
||||
| visible | | boolean | NO | | 0 | |
|
||||
| deleted | item has been marked for deletion | boolean | NO | | 0 | |
|
||||
|
|
|
@ -56,11 +56,10 @@ Fields
|
|||
Indexes
|
||||
------------
|
||||
|
||||
| Name | Fields |
|
||||
| -------------- | ---------------------- |
|
||||
| PRIMARY | id |
|
||||
| uid_is-default | uid, is-default |
|
||||
| pub_keywords | FULLTEXT, pub_keywords |
|
||||
| Name | Fields |
|
||||
| -------------- | --------------- |
|
||||
| PRIMARY | id |
|
||||
| uid_is-default | uid, is-default |
|
||||
|
||||
Foreign Keys
|
||||
------------
|
||||
|
|
|
@ -6,29 +6,30 @@ User specific public contact data
|
|||
Fields
|
||||
------
|
||||
|
||||
| Field | Description | Type | Null | Key | Default | Extra |
|
||||
| ------------------------- | ----------------------------------------------------------------------- | ------------------ | ---- | --- | ------- | ----- |
|
||||
| cid | Contact id of the linked public contact | int unsigned | NO | PRI | 0 | |
|
||||
| uid | User id | mediumint unsigned | NO | PRI | 0 | |
|
||||
| uri-id | Id of the item-uri table entry that contains the contact url | int unsigned | YES | | NULL | |
|
||||
| blocked | Contact is completely blocked for this user | boolean | YES | | NULL | |
|
||||
| ignored | Posts from this contact are ignored | boolean | YES | | NULL | |
|
||||
| collapsed | Posts from this contact are collapsed | boolean | YES | | NULL | |
|
||||
| hidden | This contact is hidden from the others | boolean | YES | | NULL | |
|
||||
| is-blocked | User is blocked by this contact | boolean | YES | | NULL | |
|
||||
| channel-frequency | Controls the frequency of the appearance of this contact in channels | tinyint unsigned | YES | | NULL | |
|
||||
| pending | | boolean | YES | | NULL | |
|
||||
| rel | The kind of the relation between the user and the contact | tinyint unsigned | YES | | NULL | |
|
||||
| info | | mediumtext | YES | | NULL | |
|
||||
| notify_new_posts | | boolean | YES | | NULL | |
|
||||
| remote_self | 0 => No mirroring, 1-2 => Mirror as own post, 3 => Mirror as reshare | tinyint unsigned | YES | | NULL | |
|
||||
| fetch_further_information | 0 => None, 1 => Fetch information, 3 => Fetch keywords, 2 => Fetch both | tinyint unsigned | YES | | NULL | |
|
||||
| ffi_keyword_denylist | | text | YES | | NULL | |
|
||||
| subhub | | boolean | YES | | NULL | |
|
||||
| hub-verify | | varbinary(383) | YES | | NULL | |
|
||||
| protocol | Protocol of the contact | char(4) | YES | | NULL | |
|
||||
| rating | Automatically detected feed poll frequency | tinyint | YES | | NULL | |
|
||||
| priority | Feed poll priority | tinyint unsigned | YES | | NULL | |
|
||||
| Field | Description | Type | Null | Key | Default | Extra |
|
||||
| ------------------------- | -------------------------------------------------------------------------- | ------------------ | ---- | --- | ------- | ----- |
|
||||
| cid | Contact id of the linked public contact | int unsigned | NO | PRI | 0 | |
|
||||
| uid | User id | mediumint unsigned | NO | PRI | 0 | |
|
||||
| uri-id | Id of the item-uri table entry that contains the contact url | int unsigned | YES | | NULL | |
|
||||
| blocked | Contact is completely blocked for this user | boolean | YES | | NULL | |
|
||||
| ignored | Posts from this contact are ignored | boolean | YES | | NULL | |
|
||||
| collapsed | Posts from this contact are collapsed | boolean | YES | | NULL | |
|
||||
| hidden | This contact is hidden from the others | boolean | YES | | NULL | |
|
||||
| channel-only | This contact is displayed only in channels, but not in the network stream. | boolean | YES | | NULL | |
|
||||
| is-blocked | User is blocked by this contact | boolean | YES | | NULL | |
|
||||
| channel-frequency | Controls the frequency of the appearance of this contact in channels | tinyint unsigned | YES | | NULL | |
|
||||
| pending | | boolean | YES | | NULL | |
|
||||
| rel | The kind of the relation between the user and the contact | tinyint unsigned | YES | | NULL | |
|
||||
| info | | mediumtext | YES | | NULL | |
|
||||
| notify_new_posts | | boolean | YES | | NULL | |
|
||||
| remote_self | 0 => No mirroring, 1-2 => Mirror as own post, 3 => Mirror as reshare | tinyint unsigned | YES | | NULL | |
|
||||
| fetch_further_information | 0 => None, 1 => Fetch information, 3 => Fetch keywords, 2 => Fetch both | tinyint unsigned | YES | | NULL | |
|
||||
| ffi_keyword_denylist | | text | YES | | NULL | |
|
||||
| subhub | | boolean | YES | | NULL | |
|
||||
| hub-verify | | varbinary(383) | YES | | NULL | |
|
||||
| protocol | Protocol of the contact | char(4) | YES | | NULL | |
|
||||
| rating | Automatically detected feed poll frequency | tinyint | YES | | NULL | |
|
||||
| priority | Feed poll priority | tinyint unsigned | YES | | NULL | |
|
||||
|
||||
Indexes
|
||||
------------
|
||||
|
|
|
@ -34,8 +34,6 @@ Fields
|
|||
| blockwall | Prohibit contacts to post to the profile page of the user | boolean | NO | | 0 | |
|
||||
| hidewall | Hide profile details from unknown viewers | boolean | NO | | 0 | |
|
||||
| blocktags | Prohibit contacts to tag the post of this user | boolean | NO | | 0 | |
|
||||
| unkmail | Permit unknown people to send private mails to this user | boolean | NO | | 0 | |
|
||||
| cntunkmail | | int unsigned | NO | | 10 | |
|
||||
| notify-flags | email notification options | smallint unsigned | NO | | 65535 | |
|
||||
| page-flags | page/profile type | tinyint unsigned | NO | | 0 | |
|
||||
| account-type | | tinyint unsigned | NO | | 0 | |
|
||||
|
|
|
@ -418,10 +418,6 @@ Eine komplette Liste aller Hook-Callbacks mit den zugehörigen Dateien (am 01-Ap
|
|||
Hook::callAll('storage_instance', $data);
|
||||
Hook::callAll('storage_config', $data);
|
||||
|
||||
### src/Module/Notifications/Ping.php
|
||||
|
||||
Hook::callAll('network_ping', $arr);
|
||||
|
||||
### src/Module/PermissionTooltip.php
|
||||
|
||||
Hook::callAll('lockview_content', $item);
|
||||
|
|
|
@ -356,8 +356,8 @@ Zeilen</code></td>
|
|||
[li] Zweites Listenelement<br>
|
||||
[/ul]<br>
|
||||
[list]<br>
|
||||
[*] Erstes Listenelement<br>
|
||||
[*] Zweites Listenelement<br>
|
||||
[li] Erstes Listenelement<br>
|
||||
[li] Zweites Listenelement<br>
|
||||
[/list]</td>
|
||||
<td>
|
||||
<ul class="listbullet" style="list-style-type: circle;">
|
||||
|
@ -368,12 +368,12 @@ Zeilen</code></td>
|
|||
</tr>
|
||||
<tr>
|
||||
<td>[ol]<br>
|
||||
[*] Erstes Listenelement<br>
|
||||
[*] Zweites Listenelement<br>
|
||||
[li] Erstes Listenelement<br>
|
||||
[li] Zweites Listenelement<br>
|
||||
[/ol]<br>
|
||||
[list=1]<br>
|
||||
[*] Erstes Listenelement<br>
|
||||
[*] Zweites Listenelement<br>
|
||||
[li] Erstes Listenelement<br>
|
||||
[li] Zweites Listenelement<br>
|
||||
[/list]</td>
|
||||
<td>
|
||||
<ul class="listdecimal" style="list-style-type: decimal;">
|
||||
|
@ -384,8 +384,8 @@ Zeilen</code></td>
|
|||
</tr>
|
||||
<tr>
|
||||
<td>[list=]<br>
|
||||
[*] Erstes Listenelement<br>
|
||||
[*] Zweites Listenelement<br>
|
||||
[li] Erstes Listenelement<br>
|
||||
[li] Zweites Listenelement<br>
|
||||
[/list]</td>
|
||||
<td>
|
||||
<ul class="listnone" style="list-style-type: none;">
|
||||
|
@ -396,8 +396,8 @@ Zeilen</code></td>
|
|||
</tr>
|
||||
<tr>
|
||||
<td>[list=i]<br>
|
||||
[*] Erstes Listenelement<br>
|
||||
[*] Zweites Listenelement<br>
|
||||
[li] Erstes Listenelement<br>
|
||||
[li] Zweites Listenelement<br>
|
||||
[/list]</td>
|
||||
<td>
|
||||
<ul class="listlowerroman" style="list-style-type: lower-roman;">
|
||||
|
@ -408,8 +408,8 @@ Zeilen</code></td>
|
|||
</tr>
|
||||
<tr>
|
||||
<td>[list=I]<br>
|
||||
[*] Erstes Listenelement<br>
|
||||
[*] Zweites Listenelement<br>
|
||||
[li] Erstes Listenelement<br>
|
||||
[li] Zweites Listenelement<br>
|
||||
[/list]</td>
|
||||
<td>
|
||||
<ul class="listupperroman" style="list-style-type: upper-roman;">
|
||||
|
@ -420,8 +420,8 @@ Zeilen</code></td>
|
|||
</tr>
|
||||
<tr>
|
||||
<td>[list=a]<br>
|
||||
[*] Erstes Listenelement<br>
|
||||
[*] Zweites Listenelement<br>
|
||||
[li] Erstes Listenelement<br>
|
||||
[li] Zweites Listenelement<br>
|
||||
[/list]</td>
|
||||
<td>
|
||||
<ul class="listloweralpha" style="list-style-type: lower-alpha;">
|
||||
|
@ -432,8 +432,8 @@ Zeilen</code></td>
|
|||
</tr>
|
||||
<tr>
|
||||
<td>[list=A]<br>
|
||||
[*] Erstes Listenelement<br>
|
||||
[*] Zweites Listenelement<br>
|
||||
[li] Erstes Listenelement<br>
|
||||
[li] Zweites Listenelement<br>
|
||||
[/list]</td>
|
||||
<td>
|
||||
<ul class="listupperalpha" style="list-style-type: upper-alpha;">
|
||||
|
|
99
doc/de/Channels.md
Normal file
|
@ -0,0 +1,99 @@
|
|||
Kanäle (Channels)
|
||||
=====
|
||||
|
||||
* [Home](help)
|
||||
|
||||
Kanäle sind eine Möglichkeit neue Inhalte zu finden, oder Inhalte anzuzeigen, die du sonst möglicherweise verpasst hättest.
|
||||
Es gibt mehrere vordefinierte Kanäle und zusätzlich kannst du deine eigenen, basierend auf ein paar Regeln, erstellen.
|
||||
Kanäle zeigen nur Beiträge aus den letzten 24 Stunden an. (Dieser Wert kann vom Administrator geändert werden.)
|
||||
|
||||
In den Anzeige-Einstellungen, im Bereich "Timelines", kannst du definieren, welche Kanäle und andere Timelines du im "Kanäle"-Widget auf der "Network"-Seite sehen möchtest und welche Kanäle in der Menüleiste oben auf der Seite erscheinen sollen.
|
||||
|
||||
Ebenfalls in den Anzeige-Einstellungen, im Bereich "Kanäle", kannst du alle die Sprachen einstellen, die du in deinen Kanälen sehen möchtest. Hier kannst du mehr als eine Sprache auswählen.
|
||||
|
||||
Auf der Profilseite kannst du die Kanal-Frequenz für jeden Kontakt definieren. Die Optionen sind:
|
||||
|
||||
* Standardhäufigkeit: Beiträge dieses Kontakts werden im "Für Dich"-Kanal angezeigt, wenn du häufig mit diesem Kontakt interagiert hast oder wenn ein Beitrag ein gewisses Maß an Interaktion erreicht hat.
|
||||
* Alle Beiträge dieses Kontakts anzeigen: Alle Beiträge dieses Kontakts werden auf dem Kanal "Für Dich" erscheinen
|
||||
* Zeige nur einige Beiträge an: Wenn ein Kontakt viele Beiträge in einem kurzen Zeitraum erstellt, reduziert diese Einstellung die Anzahl der angezeigten Beiträge in jedem Kanal.
|
||||
* Zeige keine Beiträge an: Beiträge von diesem Kontakt werden in keinem Kanal angezeigt.
|
||||
|
||||
Voreingestellte Kanäle
|
||||
---
|
||||
|
||||
* Für Dich: Beiträge von Kontakten mit denen du interagierst und die mit dir interagieren. Im Detail bestehend aus:
|
||||
* Beiträge von Leuten, mit denen du überdurchschnittlich viel interagierst.
|
||||
* Beiträge von Kontakten, denen du folgst und mit denen du überdurchschnittlich viel interagierst.
|
||||
* Beiträge von Kontakten, bei denen du "Benachrichtigung bei neuen Beiträgen" aktiviert hast oder wo du die Kanalfrequenz entsprechend eingestellt hast.
|
||||
* Entdecken: Beiträge von Kontakten denen du nicht folgst, aber denen zu folgen für dich interessant sein könnte. Im Detail bestehend aus:
|
||||
* Beiträge von Leuten denen du nicht folgst, aber mit denen du überdurchschnittlich viel interagierst.
|
||||
* Beiträge von Leuten denen du nicht folgst, aber die mit dir überdurchschnittlich viel interagieren.
|
||||
* Beliebte Beiträge von Leuten denen du nicht folgst, aber mit denen du interagiert hast oder die mit dir interagiert haben.
|
||||
* Angesagt: Beiträge mit überdurchschnittlich hoher Anzahl von Interaktionen.
|
||||
* Sprache: Beiträge in deiner Sprache.
|
||||
* Folgende: Beiträge von Leuten die dir folgen, aber denen du nicht folgst.
|
||||
* Geteilt von teilenden: Beiträge von Kontakten denen die Leute folgen, denen du folgst.
|
||||
* Ruhige teilende: Beiträge von Konten denen du folgst, aber die nicht sehr oft posten.
|
||||
* Bilder: Beiträge mit Bildern.
|
||||
* Audio: Beiträge mit Audio.
|
||||
* Videos: Beiträge mit Videos.
|
||||
|
||||
Vom Benutzer eingestellte Kanäle
|
||||
---
|
||||
|
||||
In den Einstellungen, unter "Kanäle", kannst du deine eigenen Kanäle erstellen.
|
||||
|
||||
Jeder Kanal wird durch diese Werte definiert:
|
||||
|
||||
* Bezeichnung: Dieses Feld ist notwendig und wird für die Kanalbezeichnung verwendet.
|
||||
* Beschreibung: Eine kurze Beschreibung des Inhalts. Dies kann helfen den Überblick zu behalten, wenn du viele Kanäle hast.
|
||||
* Zugriffsschlüssel: Wenn du auf diesen Kanal über einen Zugriffsschlüssel zugreifen willst, kannst du ihn hier festlegen. Achte darauf, dass du nicht einen bereits verwendeten Schlüssel benutzt.
|
||||
* Circle/Kanal: Dies definiert die Datenquelle für diesen Kanal. Voreingestellt ist die Globale Gemeinschaft. Es gibt ein paar vorgegebene Werte, wie die Konten denen du folgst, oder die Kontakte, die dir folgen. Außerdem können alle deine Circles ausgewählt werden.
|
||||
* Tags einschließen: Durch Kommata getrennte Liste von Tags. Ein Beitrag wird verwendet, wenn er eines der aufgeführten Tags enthält.
|
||||
* Tags ausschließen: Durch Kommata getrennte Liste von Tags. Wenn ein Beitrag eines dieser Tags enthält, wird er nicht Teil dieses Kanals sein.
|
||||
* Volltextsuche: Dies kann genutzt werden um Inhalte, basierend auf dem Inhalt und ein paar zusätzlichen Schlüsselwörtern, ein- oder auszuschließen. Es nutzt die "boolean mode"-Operatoren von MariaDB: https://mariadb.com/kb/en/full-text-index-overview/#in-boolean-mode
|
||||
* Bilder, Videos, Audio: Wenn ausgewählt, wirst du Inhalte mit dem gewählten Medientyp sehen. Diese Optionen können kombiniert werden. Wenn keines dieser Felder ausgewählt wurde, wirst du alle Inhalte, mit oder ohne angefügten Medien, sehen.
|
||||
|
||||
Zusätzliche Schlüsselwörter für die Volltextsuche
|
||||
---
|
||||
|
||||
Zusätzlich zu der Suche nach Inhalten, gibt es Schlüsselwörter, die in der Volltextsuche genutzt werden können.
|
||||
Alternativen werden durch "|" dargestellt.
|
||||
|
||||
* from - Verwende "from:nickname" oder "from:nickname@domain.tld" um nach Beiträgen von einem bestimmten Autor zu suchen.
|
||||
* to - Verwende "to:nickname" oder "to:nickname@domain.tld" um nach Beiträgen mit dem gegebenen Empfänger zu suchen.
|
||||
* group - Verwende "group:nickname" oder "group:nickname@domain.tld" um nach Beiträgen aus der gegebenen Gruppe zu suchen.
|
||||
* application | relay - Nutze "application:nickname" oder "application:nickname@domain.tld" um Beiträge zu finden, die von der gegebenen relay application geteilt wurden.
|
||||
* server - Verwende "server:hostname" um Beiträge von einem bestimmten Server zu suchen. Im Falle eine Gruppen-Postings enthält der Suchtext beides, den Hostname des Gruppen-Servers und den Hostname des Autors.
|
||||
* source - Der ActivityPub-Typ der Beitragsquelle. Nutze dies um beispielsweise Gruppenpostings oder Beiträge von Services (aka Bots) ein- oder auszuschließen.
|
||||
* source:person - Der Beitrag wurde von einem regulären Nutzerkonto erstellt.
|
||||
* source:organization - Der Beitrag wurde von einer Organisation erstellt.
|
||||
* source:group - Dieser Beitrag wurde über eine Gruppe erstellt oder verteilt.
|
||||
* source:service | source:news - Dieser Beitrag stammt aus einem 'service' Account. Dieser Quellen(source)-Typ wird oft genutzt um Bot Accounts zu markieren.
|
||||
* source:application | source:relay - Dieser Beitrag wurde von einer Anwendung (application) erstellt. Dies wird im Fediverse höchstwahrscheinlich für die Beitragserstellung nicht genutzt.
|
||||
* tag - Nutze "tag:tagname" um nach einem bestimmten tag (Schlagwort) zu suchen.
|
||||
* media - Mit diesem Schlüsselwort kannst du nach angefügten Medien suchen.
|
||||
* media:image | media:photo | media:picture - Dieser Beitrag enthält ein Bild
|
||||
* media:video - Dieser Beitrag enthält ein Video
|
||||
* media:audio - Dieser Beitrag enthält Audio
|
||||
* media:card - Dieser Beitrag enthält eine Linkvorschau-'card'
|
||||
* media:post - Dieser Beitrag verweist auf einen anderen Beitrag, was bedeutet, es ist ein zitierter Beitrag
|
||||
* network | net - Verwende dies um Netzwerke in deinen Kanal einzuschließen oder von ihm auszuschließen.
|
||||
* network:apub | network:activitypub - ActivityPub (verwendet von den Systemen im Fediverse)
|
||||
* network:dfrn | network:friendica - altes Friendica-Protokoll. Heutzutage nutzt Friendica meist ActivityPub.
|
||||
* network:dspr | network:diaspora - Das Diaspora-Protokoll wird hauptsächlich von Diaspora selbst genutzt. Ein paar andere Systeme unterstützen dieses Protokoll ebenfalls, wie Hubzilla, Socialhome or Ganggo.
|
||||
* network:feed - RSS/Atom feeds
|
||||
* network:mail - Mails die via IMAP importiert worden sind.
|
||||
* network:stat | network:ostatus - Das OStatus-Protokoll wird hauptsächlich von alten GNU Social-Installationen genutzt.
|
||||
* network:dscs | network:discourse - Beiträge, die über den Discourse connector empfangen werden.
|
||||
* network:tmbl | network:tumblr - Beiträge, die über den Tumblr connector empfangen werden.
|
||||
* network:bsky | network:bluesky - Beiträge, die über den Bluesky connector empfangen werden.
|
||||
* platform - Benutze dies, um Plattformen in deinen Kanal einzuschließen, oder von ihm auszuschließen, d.h. "+platform:friendica". Im Falle eines Gruppen-Postings enthält der Suchtext beides, die Plattform des Gruppen-Servers und die Plattform des Autors.
|
||||
* visibility - Du hast die Wahl zwischen verschiedenen Sichtbarkeiten. Du kannst nur die ungelisteten oder privaten Beiträge sehen, zu denen du Zugang hast.
|
||||
* visibility:public - (öffentlich)
|
||||
* visibility:unlisted - (ungelistet)
|
||||
* visibility:private - (privat)
|
||||
* language | lang - Verwende "language:code" um nach Beiträgen in der gewünschten Sprache (im [ISO 639-1](https://en.wikipedia.org/wiki/ISO_639-1) format) zu suchen.
|
||||
|
||||
Denke daran, dass du diese Schlüsselwörter kombinieren kannst.
|
||||
So kannst du zum Beispiel einen Kanal erstellen, mit allen Beiträgen, die über das Fediverse sprechen, aber nicht im Fediverse veröffentlich wurden, mit diesen Suchbegriffen: "fediverse -network:apub -network:dfrn".
|
|
@ -1,7 +1,7 @@
|
|||
Friendica - Dokumentation und Ressourcen
|
||||
=====================================
|
||||
Hilfe
|
||||
=====
|
||||
|
||||
**Inhalte**
|
||||
**Dokumentation für Benutzer**
|
||||
|
||||
* Allgemeine Funktionen - Erste Schritte
|
||||
* [Account - Basics](help/Account-Basics)
|
||||
|
@ -17,7 +17,7 @@ Friendica - Dokumentation und Ressourcen
|
|||
* [Circles und Privatsphäre](help/Circles-and-Privacy)
|
||||
* [Tags und Erwähnungen](help/Tags-and-Mentions)
|
||||
* [Community-Gruppen](help/Groups)
|
||||
* [Channels](help/Channels)
|
||||
* [Kanäle (Channels)](help/Channels)
|
||||
* [Chats](help/Chats)
|
||||
* Weiterführende Informationen
|
||||
* [Account umziehen](help/Move-Account)
|
||||
|
@ -60,18 +60,16 @@ Friendica - Dokumentation und Ressourcen
|
|||
* [Translation of Friendica](help/translations) (EN)
|
||||
* [Run tests](help/Tests) (EN)
|
||||
|
||||
**Externe Ressourcen**
|
||||
**Links**
|
||||
|
||||
* [Haupt-Webseite](https://friendi.ca)
|
||||
* Support Kanäle
|
||||
* Friendica Support Gruppe: [@helpers@forum.friendi.ca](https://forum.friendi.ca/~helpers)
|
||||
* [Mailing Listen Archiv](http://mailman.friendi.ca/mailman/listinfo/support-friendi.ca) zum Abonnieren der Liste eine E-Mail an ``support-request(at)friendi.ca?subject=subscribe`` senden
|
||||
* Chats der Friendica Community (die IRC, Matrix und XMPP Räume sind mit einer Brücke verbunden) Logs dieser öffentlichen Chaträume können [hier aus dem IRC](https://gnusociarg.nsupdate.info/2021/%23frie) und [hier aus der Matrix](https://view.matrix.org/alias/%23friendi.ca:matrix.org/) gefunden werden.
|
||||
* XMPP/Jabber MUC: support(at)forum.friendi.ca
|
||||
* IRC: #friendica auf [libera.chat](https://web.libera.chat/?channels=#friendica)
|
||||
* Matrix: [#friendi.ca](https://matrix.to/#/#friendi.ca:matrix.org) oder [#friendica-en](https://matrix.to/#/#friendica-en:matrix.org) auf matrix.org
|
||||
* Website: [https://friendi.ca](https://friendi.ca)
|
||||
* Help Group: [@helpers@forum.friendi.ca](https://forum.friendi.ca/~helpers)
|
||||
* XMPP: [support@forum.friendi.ca](xmpp:support@forum.friendi.ca?join)
|
||||
* IRC: [https://web.libera.chat/?channels=#friendica](https://web.libera.chat/?channels=#friendica)
|
||||
* Matrix: [https://matrix.to/#/#friendi.ca:matrix.org](https://matrix.to/#/#friendi.ca:matrix.org)
|
||||
* Mailing List: [https://mailman.friendi.ca/mailman/listinfo/support-friendi.ca](http://mailman.friendi.ca/mailman/listinfo/support-friendi.ca)
|
||||
|
||||
**Über diese Seite**
|
||||
**Über**
|
||||
|
||||
* [Seite/Friendica-Version](friendica)
|
||||
* [Mitwirkenden bei Friendica](credits)
|
||||
* [Server Information](friendica)
|
||||
* [Mitwirkende](credits)
|
||||
|
|
|
@ -27,7 +27,7 @@ Requirements
|
|||
* Apache mit einer aktiverten mod-rewrite-Funktion und dem Eintrag "Options All", so dass du die lokale .htaccess-Datei nutzen kannst
|
||||
* PHP 7.4+
|
||||
* PHP *Kommandozeilen*-Zugang mit register_argc_argv auf "true" gesetzt in der php.ini-Datei
|
||||
* Curl, GD, GMP, PDO, mbstrings, MySQLi, hash, xml, zip, IntlChar and OpenSSL-Erweiterung
|
||||
* Curl, GD, GMP, PDO, mbstrings, MySQLi, hash, xml, zip, IntlChar, IDN und OpenSSL-Erweiterung
|
||||
* Das POSIX Modul muss aktiviert sein ([CentOS, RHEL](http://www.bigsoft.co.uk/blog/index.php/2014/12/08/posix-php-commands-not-working-under-centos-7http://www.bigsoft.co.uk/blog/index.php/2014/12/08/posix-php-commands-not-working-under-centos-7) haben dies z.B. deaktiviert)
|
||||
* Einen E-Mail Server, so dass PHP `mail()` funktioniert.
|
||||
Wenn kein eigener E-Mail Server zur Verfügung steht, kann alternativ das [phpmailer](https://github.com/friendica/friendica-addons/tree/develop/phpmailer) Addon mit einem externen SMTP Account verwendet werden.
|
||||
|
|
151
doc/themes.md
|
@ -2,153 +2,10 @@
|
|||
|
||||
* [Home](help)
|
||||
|
||||
To change the look of friendica you have to touch the themes.
|
||||
The current default theme is [Vier](https://github.com/friendica/friendica/tree/stable/view/theme/vier) but there are numerous others.
|
||||
Have a look at [github.com/bkil/friendica-themes](https://github.com/bkil/friendica-themes) for an overview of the existing themes.
|
||||
In case none of them suits your needs, there are several ways to change a theme.
|
||||
The default Theme in Friendica is called [frio](https://github.com/friendica/friendica/tree/stable/view/theme/frio).
|
||||
|
||||
So, how to work on the UI of friendica.
|
||||
Open `Settings > Display > Custom Theme Settings` adjust the Theme to your liking. Select your preferred Appearance - light, dark or black - and your favorite Accent color. Click `Submit` to save your changes.
|
||||
|
||||
You can either directly edit an existing theme.
|
||||
But you might loose your changes when the theme is updated by the friendica team.
|
||||
The `Custom` Appearance allows to tweak the themes CSS and set colors for UI elements. So called `schemestrings` can be shared between users.
|
||||
|
||||
If you are almost happy with an existing theme, the easiest way to cover your needs is to create a new theme, inheriting most of the properties of the parent theme and change just minor stuff.
|
||||
The below for a more detailed description of theme heritage.
|
||||
|
||||
Some themes also allow users to select *variants* of the theme.
|
||||
Those theme variants most often contain an additional [CSS](https://en.wikipedia.org/wiki/CSS) file to override some styling of the default theme values.
|
||||
From the themes in the main repository *vier* and *vier* are using this methods for variations.
|
||||
Quattro is using a slightly different approach.
|
||||
|
||||
Third you can start your theme from scratch.
|
||||
Which is the most complex way to change friendicas look.
|
||||
But it leaves you the most freedom.
|
||||
So below for a *detailed* description and the meaning of some special files.
|
||||
|
||||
### Styling
|
||||
|
||||
If you want to change the styling of a theme, have a look at the themes CSS file.
|
||||
In most cases, you can found these in
|
||||
|
||||
/view/theme/**your-theme-name**/style.css
|
||||
|
||||
sometimes, there is also a file called style.php in the theme directory.
|
||||
This is only needed if the theme allows the user to change certain things of the theme dynamically.
|
||||
Say the font size or set a background image.
|
||||
|
||||
### Templates
|
||||
|
||||
If you want to change the structure of the theme, you need to change the templates used by the theme.
|
||||
Friendica themes are using [SMARTY3](http://www.smarty.net/) for templating.
|
||||
The default template can be found in
|
||||
|
||||
/view/templates
|
||||
|
||||
if you want to override any template within your theme create your version of the template in
|
||||
|
||||
/view/theme/**your-theme-name**/templates
|
||||
|
||||
any template that exists there will be used instead of the default one.
|
||||
|
||||
### JavaScript
|
||||
|
||||
The same rule applies to the JavaScript files found in
|
||||
|
||||
/js
|
||||
|
||||
they will be overwritten by files in
|
||||
|
||||
/view/theme/**your-theme-name**/js.
|
||||
|
||||
## Creating a Theme from Scratch
|
||||
|
||||
Keep patient.
|
||||
Basically what you have to do is identify which template you have to change so it looks more like what you want.
|
||||
Adopt the CSS of the theme accordingly.
|
||||
And iterate the process until you have the theme the way you want it.
|
||||
|
||||
*Use the source Luke.* and don't hesitate to ask in @[developers](https://forum.friendi.ca/profile/developers) or @[helpers](https://forum.friendi.ca/profile/helpers).
|
||||
|
||||
## Special Files
|
||||
|
||||
### unsupported
|
||||
|
||||
If a file with this name (which might be empty) exists in the theme directory, the theme is marked as *unsupported*.
|
||||
An unsupported theme may not be selected by a user in the settings.
|
||||
Users who are already using it wont notice anything.
|
||||
|
||||
### README(.md)
|
||||
|
||||
The contents of this file, with or without the .md which indicates [Markdown](https://daringfireball.net/projects/markdown/) syntax, will be displayed at most repository hosting services and in the theme page within the admin panel of friendica.
|
||||
|
||||
This file should contain information you want to let others know about your theme.
|
||||
|
||||
### screenshot.[png|jpg]
|
||||
|
||||
If you want to have a preview image of your theme displayed in the settings you should take a screenshot and save it with this name.
|
||||
Supported formats are PNG and JPEG.
|
||||
|
||||
### theme.php
|
||||
|
||||
This is the main definition file of the theme.
|
||||
In the header of that file, some meta information is stored.
|
||||
For example, have a look at the theme.php of the *vier* theme:
|
||||
|
||||
<?php
|
||||
/**
|
||||
* [Licence]
|
||||
*
|
||||
* Name: Vier
|
||||
* Version: 1.2
|
||||
* Author: Fabio <http://kirgroup.com/profile/fabrixxm>
|
||||
* Author: Ike <http://pirati.ca/profile/heluecht>
|
||||
* Author: Beanow <https://fc.oscp.info/profile/beanow>
|
||||
* Maintainer: Ike <http://pirati.ca/profile/heluecht>
|
||||
* Description: "Vier" is a very compact and modern theme. It uses the font awesome font library: http://fortawesome.github.com/Font-Awesome/
|
||||
*/
|
||||
|
||||
You see the definition of the theme's name, it's version and the initial author of the theme.
|
||||
These three pieces of information should be listed.
|
||||
If the original author is no longer working on the theme, but a maintainer has taken over, the maintainer should be listed as well.
|
||||
The information from the theme header will be displayed in the admin panel.
|
||||
|
||||
The first thing in file is to import the `App` class from `\Friendica\` namespace.
|
||||
|
||||
use Friendica\App;
|
||||
|
||||
This will make our job a little easier, as we don't have to specify the full name every time we need to use the `App` class.
|
||||
|
||||
The next crucial part of the theme.php file is a definition of an init function.
|
||||
The name of the function is <theme-name>_init.
|
||||
So in the case of vier it is
|
||||
|
||||
function vier_init(App $a) {
|
||||
$a->theme_info = array();
|
||||
$a->set_template_engine('smarty3');
|
||||
}
|
||||
|
||||
Here we have set the basic theme information, in this case they are empty.
|
||||
But the array needs to be set.
|
||||
And we have set the template engine that should be used by friendica for this theme.
|
||||
At the moment you should use the *smarty3* engine.
|
||||
There once was a friendica specific templating engine as well but that is not used anymore.
|
||||
If you like to use another templating engine, please implement it.
|
||||
|
||||
If you want to add something to the HTML header of the theme, one way to do so is by adding it to the theme.php file.
|
||||
To do so, add something alike
|
||||
|
||||
DI::page()['htmlhead'] .= <<< EOT
|
||||
/* stuff you want to add to the header */
|
||||
EOT;
|
||||
|
||||
So you can access the properties of this friendica session from the theme.php file as well.
|
||||
|
||||
### default.php
|
||||
|
||||
This file covers the structure of the underlying HTML layout.
|
||||
The default file is in
|
||||
|
||||
/view/default.php
|
||||
|
||||
if you want to change it, say adding a 4th column for banners of your favourite FLOSS projects, place a new default.php file in your theme directory.
|
||||
As with the theme.php file, you can use the properties of the $a variable with holds the friendica application to decide what content is displayed.
|
||||
In the `General Theme Settings` you can also find the [vier](https://github.com/friendica/friendica/tree/stable/view/theme/vier) Theme, which precedes frio and is no longer officially maintained.
|
||||
|
|
Before Width: | Height: | Size: 5 KiB After Width: | Height: | Size: 7.6 KiB |
Before Width: | Height: | Size: 1.2 MiB |
Before Width: | Height: | Size: 185 KiB After Width: | Height: | Size: 150 KiB |
Before Width: | Height: | Size: 166 KiB After Width: | Height: | Size: 138 KiB |
Before Width: | Height: | Size: 400 KiB After Width: | Height: | Size: 371 KiB |
BIN
images/screenshots/friendica-2023-12-frio-desktop.png
Normal file
After Width: | Height: | Size: 707 KiB |
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
27
mod/item.php
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
@ -45,7 +45,8 @@ use Friendica\Model\Post;
|
|||
use Friendica\Network\HTTPException;
|
||||
use Friendica\Util\DateTimeFormat;
|
||||
|
||||
function item_post(App $a) {
|
||||
function item_post()
|
||||
{
|
||||
$uid = DI::userSession()->getLocalUserId();
|
||||
|
||||
if (!$uid) {
|
||||
|
@ -233,13 +234,15 @@ function item_insert(int $uid, array $request, bool $preview, string $return_pat
|
|||
|
||||
function item_process(array $post, array $request, bool $preview, string $return_path): array
|
||||
{
|
||||
$post['self'] = true;
|
||||
$post['api_source'] = false;
|
||||
$post['attach'] = '';
|
||||
$post['title'] = trim($request['title'] ?? '');
|
||||
$post['body'] = $request['body'] ?? '';
|
||||
$post['location'] = trim($request['location'] ?? '');
|
||||
$post['coord'] = trim($request['coord'] ?? '');
|
||||
$post['self'] = true;
|
||||
$post['api_source'] = false;
|
||||
$post['attach'] = '';
|
||||
$post['title'] = trim($request['title'] ?? '');
|
||||
$post['content-warning'] = trim($request['summary'] ?? '');
|
||||
$post['sensitive'] = !empty($request['sensitive'] ?? false);
|
||||
$post['body'] = $request['body'] ?? '';
|
||||
$post['location'] = trim($request['location'] ?? '');
|
||||
$post['coord'] = trim($request['coord'] ?? '');
|
||||
|
||||
$post = DI::contentItem()->addCategories($post, $request['category'] ?? '');
|
||||
|
||||
|
@ -248,7 +251,7 @@ function item_process(array $post, array $request, bool $preview, string $return
|
|||
$post['body'] .= DI::contentItem()->storeAttachmentFromRequest($request);
|
||||
}
|
||||
|
||||
$post = DI::contentItem()->finalizePost($post);
|
||||
$post = DI::contentItem()->finalizePost($post, $preview);
|
||||
|
||||
if (!strlen($post['body'])) {
|
||||
if ($preview) {
|
||||
|
@ -278,13 +281,15 @@ function item_process(array $post, array $request, bool $preview, string $return
|
|||
$post['quote-uri-id'] = Item::getQuoteUriId($post['body'], $post['uid']);
|
||||
$post['body'] = BBCode::removeSharedData(Item::setHashtags($post['body']));
|
||||
$post['writable'] = true;
|
||||
$post['sensitive'] = false;
|
||||
$post['post-reason'] = Item::PR_LOCAL;
|
||||
|
||||
$o = DI::conversation()->render([$post], Conversation::MODE_SEARCH, false, true);
|
||||
|
||||
System::jsonExit(['preview' => $o]);
|
||||
}
|
||||
|
||||
Hook::callAll('post_local',$post);
|
||||
Hook::callAll('post_local', $post);
|
||||
|
||||
unset($post['edit']);
|
||||
unset($post['self']);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
@ -19,7 +19,6 @@
|
|||
*
|
||||
*/
|
||||
|
||||
use Friendica\App;
|
||||
use Friendica\Content\Nav;
|
||||
use Friendica\Content\Pager;
|
||||
use Friendica\Content\Text\BBCode;
|
||||
|
@ -34,7 +33,7 @@ use Friendica\Util\DateTimeFormat;
|
|||
use Friendica\Util\Strings;
|
||||
use Friendica\Util\Temporal;
|
||||
|
||||
function message_init(App $a)
|
||||
function message_init()
|
||||
{
|
||||
$tabs = '';
|
||||
|
||||
|
@ -61,7 +60,7 @@ function message_init(App $a)
|
|||
]);
|
||||
}
|
||||
|
||||
function message_post(App $a)
|
||||
function message_post()
|
||||
{
|
||||
if (!DI::userSession()->getLocalUserId()) {
|
||||
DI::sysmsg()->addNotice(DI::l10n()->t('Permission denied.'));
|
||||
|
@ -104,7 +103,7 @@ function message_post(App $a)
|
|||
}
|
||||
}
|
||||
|
||||
function message_content(App $a)
|
||||
function message_content()
|
||||
{
|
||||
$o = '';
|
||||
Nav::setSelected('messages');
|
||||
|
@ -114,7 +113,7 @@ function message_content(App $a)
|
|||
return Login::form();
|
||||
}
|
||||
|
||||
$myprofile = DI::baseUrl() . '/profile/' . $a->getLoggedInUserNickname();
|
||||
$myprofile = DI::baseUrl() . '/profile/' . DI::userSession()->getLocalUserNickname();
|
||||
|
||||
$tpl = Renderer::getMarkupTemplate('mail_head.tpl');
|
||||
if (DI::args()->getArgc() > 1 && DI::args()->getArgv()[1] == 'new') {
|
||||
|
@ -177,7 +176,7 @@ function message_content(App $a)
|
|||
|
||||
$tpl = Renderer::getMarkupTemplate('msg-header.tpl');
|
||||
DI::page()['htmlhead'] .= Renderer::replaceMacros($tpl, [
|
||||
'$nickname' => $a->getLoggedInUserNickname(),
|
||||
'$nickname' => DI::userSession()->getLocalUserNickname(),
|
||||
'$linkurl' => DI::l10n()->t('Please enter a link URL:')
|
||||
]);
|
||||
|
||||
|
@ -282,7 +281,7 @@ function message_content(App $a)
|
|||
|
||||
$tpl = Renderer::getMarkupTemplate('msg-header.tpl');
|
||||
DI::page()['htmlhead'] .= Renderer::replaceMacros($tpl, [
|
||||
'$nickname' => $a->getLoggedInUserNickname(),
|
||||
'$nickname' => DI::userSession()->getLocalUserNickname(),
|
||||
'$linkurl' => DI::l10n()->t('Please enter a link URL:')
|
||||
]);
|
||||
|
||||
|
@ -415,12 +414,10 @@ function get_messages(int $uid, int $start, int $limit): array
|
|||
|
||||
function render_messages(array $msg, string $t): string
|
||||
{
|
||||
$a = DI::app();
|
||||
|
||||
$tpl = Renderer::getMarkupTemplate($t);
|
||||
$rslt = '';
|
||||
|
||||
$myprofile = DI::baseUrl() . '/profile/' . $a->getLoggedInUserNickname();
|
||||
$myprofile = DI::baseUrl() . '/profile/' . DI::userSession()->getLocalUserNickname();
|
||||
|
||||
foreach ($msg as $rr) {
|
||||
if ($rr['unknown']) {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
@ -46,7 +46,7 @@ function notes_content(App $a, bool $update = false)
|
|||
return;
|
||||
}
|
||||
|
||||
$o = BaseProfile::getTabsHTML('notes', true, $a->getLoggedInUserNickname(), false);
|
||||
$o = BaseProfile::getTabsHTML('notes', true, DI::userSession()->getLocalUserNickname(), false);
|
||||
|
||||
if (!$update) {
|
||||
$o .= '<h3>' . DI::l10n()->t('Personal Notes') . '</h3>';
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
@ -19,11 +19,9 @@
|
|||
*
|
||||
*/
|
||||
|
||||
use Friendica\App;
|
||||
use Friendica\Content\Nav;
|
||||
use Friendica\Content\Pager;
|
||||
use Friendica\Content\Text\BBCode;
|
||||
use Friendica\Content\Widget;
|
||||
use Friendica\Core\ACL;
|
||||
use Friendica\Core\Addon;
|
||||
use Friendica\Core\Hook;
|
||||
|
@ -44,6 +42,7 @@ use Friendica\Module\BaseProfile;
|
|||
use Friendica\Network\HTTPException;
|
||||
use Friendica\Network\Probe;
|
||||
use Friendica\Protocol\Activity;
|
||||
use Friendica\Protocol\ActivityNamespace;
|
||||
use Friendica\Security\Security;
|
||||
use Friendica\Util\Crypto;
|
||||
use Friendica\Util\DateTimeFormat;
|
||||
|
@ -53,7 +52,7 @@ use Friendica\Util\Strings;
|
|||
use Friendica\Util\Temporal;
|
||||
use Friendica\Util\XML;
|
||||
|
||||
function photos_init(App $a)
|
||||
function photos_init()
|
||||
{
|
||||
if (DI::config()->get('system', 'block_public') && !DI::userSession()->isAuthenticated()) {
|
||||
return;
|
||||
|
@ -67,8 +66,6 @@ function photos_init(App $a)
|
|||
throw new HTTPException\NotFoundException(DI::l10n()->t('User not found.'));
|
||||
}
|
||||
|
||||
$is_owner = (DI::userSession()->getLocalUserId() && (DI::userSession()->getLocalUserId() == $owner['uid']));
|
||||
|
||||
$albums = Photo::getAlbums($owner['uid']);
|
||||
|
||||
$albums_visible = ((intval($owner['hidewall']) && !DI::userSession()->isAuthenticated()) ? false : true);
|
||||
|
@ -125,20 +122,18 @@ function photos_init(App $a)
|
|||
return;
|
||||
}
|
||||
|
||||
function photos_post(App $a)
|
||||
function photos_post()
|
||||
{
|
||||
$user = User::getByNickname(DI::args()->getArgv()[1]);
|
||||
if (!DBA::isResult($user)) {
|
||||
throw new HTTPException\NotFoundException(DI::l10n()->t('User not found.'));
|
||||
}
|
||||
|
||||
$phototypes = Images::supportedTypes();
|
||||
|
||||
$can_post = false;
|
||||
$visitor = 0;
|
||||
|
||||
$page_owner_uid = intval($user['uid']);
|
||||
$community_page = $user['page-flags'] == User::PAGE_FLAGS_COMMUNITY;
|
||||
$community_page = in_array($user['page-flags'], [User::PAGE_FLAGS_COMMUNITY, User::PAGE_FLAGS_COMM_MAN]);
|
||||
|
||||
if (DI::userSession()->getLocalUserId() && (DI::userSession()->getLocalUserId() == $page_owner_uid)) {
|
||||
$can_post = true;
|
||||
|
@ -202,7 +197,7 @@ function photos_post(App $a)
|
|||
// Update the photo albums cache
|
||||
Photo::clearAlbumCache($page_owner_uid);
|
||||
|
||||
DI::baseUrl()->redirect('photos/' . $a->getLoggedInUserNickname() . '/album/' . bin2hex($newalbum));
|
||||
DI::baseUrl()->redirect('photos/' . DI::userSession()->getLocalUserNickname() . '/album/' . bin2hex($newalbum));
|
||||
return; // NOTREACHED
|
||||
}
|
||||
|
||||
|
@ -215,14 +210,14 @@ function photos_post(App $a)
|
|||
// get the list of photos we are about to delete
|
||||
if ($visitor) {
|
||||
$r = DBA::toArray(DBA::p(
|
||||
"SELECT distinct(`resource-id`) as `rid` FROM `photo` WHERE `contact-id` = ? AND `uid` = ? AND `album` = ?",
|
||||
"SELECT distinct(`resource-id`) AS `rid` FROM `photo` WHERE `contact-id` = ? AND `uid` = ? AND `album` = ?",
|
||||
$visitor,
|
||||
$page_owner_uid,
|
||||
$album
|
||||
));
|
||||
} else {
|
||||
$r = DBA::toArray(DBA::p(
|
||||
"SELECT distinct(`resource-id`) as `rid` FROM `photo` WHERE `uid` = ? AND `album` = ?",
|
||||
"SELECT distinct(`resource-id`) AS `rid` FROM `photo` WHERE `uid` = ? AND `album` = ?",
|
||||
DI::userSession()->getLocalUserId(),
|
||||
$album
|
||||
));
|
||||
|
@ -337,7 +332,7 @@ function photos_post(App $a)
|
|||
|
||||
if (DBA::isResult($photos)) {
|
||||
$photo = $photos[0];
|
||||
$ext = $phototypes[$photo['type']];
|
||||
$ext = Images::getExtensionByMimeType($photo['type']);
|
||||
Photo::update(
|
||||
['desc' => $desc, 'album' => $albname, 'allow_cid' => $str_contact_allow, 'allow_gid' => $str_circle_allow, 'deny_cid' => $str_contact_deny, 'deny_gid' => $str_circle_deny],
|
||||
['resource-id' => $resource_id, 'uid' => $page_owner_uid]
|
||||
|
@ -414,7 +409,7 @@ function photos_post(App $a)
|
|||
|
||||
if (count($links)) {
|
||||
foreach ($links as $link) {
|
||||
if ($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page') {
|
||||
if ($link['@attributes']['rel'] === ActivityNamespace::WEBFINGERPROFILE) {
|
||||
$profile = $link['@attributes']['href'];
|
||||
}
|
||||
|
||||
|
@ -561,7 +556,7 @@ function photos_post(App $a)
|
|||
}
|
||||
}
|
||||
|
||||
function photos_content(App $a)
|
||||
function photos_content()
|
||||
{
|
||||
// URLs:
|
||||
// photos/name/upload
|
||||
|
@ -590,8 +585,6 @@ function photos_content(App $a)
|
|||
|
||||
$profile = Profile::getByUID($user['uid']);
|
||||
|
||||
$phototypes = Images::supportedTypes();
|
||||
|
||||
$_SESSION['photo_return'] = DI::args()->getCommand();
|
||||
|
||||
// Parse arguments
|
||||
|
@ -622,7 +615,7 @@ function photos_content(App $a)
|
|||
|
||||
$owner_uid = $user['uid'];
|
||||
|
||||
$community_page = (($user['page-flags'] == User::PAGE_FLAGS_COMMUNITY) ? true : false);
|
||||
$community_page = in_array($user['page-flags'], [User::PAGE_FLAGS_COMMUNITY, User::PAGE_FLAGS_COMM_MAN]);
|
||||
|
||||
if (DI::userSession()->getLocalUserId() && (DI::userSession()->getLocalUserId() == $owner_uid)) {
|
||||
$can_post = true;
|
||||
|
@ -676,18 +669,14 @@ function photos_content(App $a)
|
|||
|
||||
$selname = (!is_null($datum) && Strings::isHex($datum)) ? hex2bin($datum) : '';
|
||||
|
||||
$albumselect = '';
|
||||
$albumselect = ['' => '<current year>'];
|
||||
|
||||
$albumselect .= '<option value="" ' . (!$selname ? ' selected="selected" ' : '') . '><current year></option>';
|
||||
$albums = Photo::getAlbums($owner_uid);
|
||||
if (!empty($albums)) {
|
||||
foreach ($albums as $album) {
|
||||
if ($album['album'] === '') {
|
||||
continue;
|
||||
}
|
||||
$selected = (($selname === $album['album']) ? ' selected="selected" ' : '');
|
||||
$albumselect .= '<option value="' . $album['album'] . '"' . $selected . '>' . $album['album'] . '</option>';
|
||||
foreach (Photo::getAlbums($owner_uid) as $album) {
|
||||
if ($album['album'] === '') {
|
||||
continue;
|
||||
}
|
||||
|
||||
$albumselect[$album['album']] = $album['album'];
|
||||
}
|
||||
|
||||
$uploader = '';
|
||||
|
@ -722,7 +711,7 @@ function photos_content(App $a)
|
|||
|
||||
$tpl = Renderer::getMarkupTemplate('photos_upload.tpl');
|
||||
|
||||
$aclselect_e = ($visitor ? '' : ACL::getFullSelectorHTML(DI::page(), $a->getLoggedInUserId()));
|
||||
$aclselect_e = ($visitor ? '' : ACL::getFullSelectorHTML(DI::page(), DI::userSession()->getLocalUserId()));
|
||||
|
||||
$o .= Renderer::replaceMacros($tpl, [
|
||||
'$pagename' => DI::l10n()->t('Upload Photos'),
|
||||
|
@ -733,9 +722,10 @@ function photos_content(App $a)
|
|||
'$existalbumtext' => DI::l10n()->t('or select existing album:'),
|
||||
'$nosharetext' => DI::l10n()->t('Do not show a status post for this upload'),
|
||||
'$albumselect' => $albumselect,
|
||||
'$selname' => $selname,
|
||||
'$permissions' => DI::l10n()->t('Permissions'),
|
||||
'$aclselect' => $aclselect_e,
|
||||
'$lockstate' => ACL::getLockstateForUserId($a->getLoggedInUserId()) ? 'lock' : 'unlock',
|
||||
'$lockstate' => ACL::getLockstateForUserId(DI::userSession()->getLocalUserId()) ? 'lock' : 'unlock',
|
||||
'$alt_uploader' => $ret['addon_text'],
|
||||
'$default_upload_box' => ($ret['default_upload'] ? $default_upload_box : ''),
|
||||
'$default_upload_submit' => ($ret['default_upload'] ? $default_upload_submit : ''),
|
||||
|
@ -762,7 +752,7 @@ function photos_content(App $a)
|
|||
|
||||
$total = 0;
|
||||
$r = DBA::toArray(DBA::p(
|
||||
"SELECT `resource-id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = ? AND `album` = ?
|
||||
"SELECT `resource-id`, MAX(`scale`) AS `scale` FROM `photo` WHERE `uid` = ? AND `album` = ?
|
||||
AND `scale` <= 4 $sql_extra GROUP BY `resource-id`",
|
||||
$owner_uid,
|
||||
$album
|
||||
|
@ -782,9 +772,9 @@ function photos_content(App $a)
|
|||
}
|
||||
|
||||
$r = DBA::toArray(DBA::p(
|
||||
"SELECT `resource-id`, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`filename`) AS `filename`,
|
||||
ANY_VALUE(`type`) AS `type`, max(`scale`) AS `scale`, ANY_VALUE(`desc`) as `desc`,
|
||||
ANY_VALUE(`created`) as `created`
|
||||
"SELECT `resource-id`, MIN(`id`) AS `id`, MIN(`filename`) AS `filename`,
|
||||
MIN(`type`) AS `type`, MAX(`scale`) AS `scale`, MIN(`desc`) AS `desc`,
|
||||
MIN(`created`) AS `created`
|
||||
FROM `photo` WHERE `uid` = ? AND `album` = ?
|
||||
AND `scale` <= 4 $sql_extra GROUP BY `resource-id` ORDER BY `created` $order LIMIT ? , ?",
|
||||
intval($owner_uid),
|
||||
|
@ -844,7 +834,7 @@ function photos_content(App $a)
|
|||
foreach ($r as $rr) {
|
||||
$twist = !$twist;
|
||||
|
||||
$ext = $phototypes[$rr['type']];
|
||||
$ext = Images::getExtensionByMimeType($rr['type']);
|
||||
|
||||
$imgalt_e = $rr['filename'];
|
||||
$desc_e = $rr['desc'];
|
||||
|
@ -855,7 +845,7 @@ function photos_content(App $a)
|
|||
'link' => 'photos/' . $user['nickname'] . '/image/' . $rr['resource-id']
|
||||
. ($order_field === 'created' ? '?order=created' : ''),
|
||||
'title' => DI::l10n()->t('View Photo'),
|
||||
'src' => 'photo/' . $rr['resource-id'] . '-' . $rr['scale'] . '.' . $ext,
|
||||
'src' => 'photo/' . $rr['resource-id'] . '-' . $rr['scale'] . $ext,
|
||||
'alt' => $imgalt_e,
|
||||
'desc' => $desc_e,
|
||||
'ext' => $ext,
|
||||
|
@ -1013,9 +1003,9 @@ function photos_content(App $a)
|
|||
}
|
||||
|
||||
$photo = [
|
||||
'href' => 'photo/' . $hires['resource-id'] . '-' . $hires['scale'] . '.' . $phototypes[$hires['type']],
|
||||
'href' => 'photo/' . $hires['resource-id'] . '-' . $hires['scale'] . Images::getExtensionByMimeType($hires['type']),
|
||||
'title' => DI::l10n()->t('View Full Size'),
|
||||
'src' => 'photo/' . $lores['resource-id'] . '-' . $lores['scale'] . '.' . $phototypes[$lores['type']] . '?_u=' . DateTimeFormat::utcNow('ymdhis'),
|
||||
'src' => 'photo/' . $lores['resource-id'] . '-' . $lores['scale'] . Images::getExtensionByMimeType($lores['type']) . '?_u=' . DateTimeFormat::utcNow('ymdhis'),
|
||||
'height' => $hires['height'],
|
||||
'width' => $hires['width'],
|
||||
'album' => $hires['album'],
|
||||
|
@ -1043,7 +1033,7 @@ function photos_content(App $a)
|
|||
$pager = new Pager(DI::l10n(), DI::args()->getQueryString());
|
||||
|
||||
$params = ['order' => ['id'], 'limit' => [$pager->getStart(), $pager->getItemsPerPage()]];
|
||||
$items = Post::toArray(Post::selectForUser($link_item['uid'], Item::ITEM_FIELDLIST, $condition, $params));
|
||||
$items = Post::toArray(Post::selectForUser($link_item['uid'], array_merge(Item::ITEM_FIELDLIST, ['author-alias']), $condition, $params));
|
||||
|
||||
if (DI::userSession()->getLocalUserId() == $link_item['uid']) {
|
||||
Item::update(['unseen' => false], ['parent' => $link_item['parent']]);
|
||||
|
@ -1081,7 +1071,7 @@ function photos_content(App $a)
|
|||
|
||||
$album_e = $ph[0]['album'];
|
||||
$caption_e = $ph[0]['desc'];
|
||||
$aclselect_e = ACL::getFullSelectorHTML(DI::page(), $a->getLoggedInUserId(), false, ACL::getDefaultUserPermissions($ph[0]));
|
||||
$aclselect_e = ACL::getFullSelectorHTML(DI::page(), DI::userSession()->getLocalUserId(), false, ACL::getDefaultUserPermissions($ph[0]));
|
||||
|
||||
$edit = Renderer::replaceMacros($edit_tpl, [
|
||||
'$id' => $ph[0]['id'],
|
||||
|
@ -1167,11 +1157,11 @@ function photos_content(App $a)
|
|||
}
|
||||
|
||||
if (!empty($conv_responses['like'][$link_item['uri']])) {
|
||||
$like = DI::conversation()->formatActivity($conv_responses['like'][$link_item['uri']]['links'], 'like', $link_item['id']);
|
||||
$like = DI::conversation()->formatActivity($conv_responses['like'][$link_item['uri']]['links'], 'like', $link_item['id'], '', []);
|
||||
}
|
||||
|
||||
if (!empty($conv_responses['dislike'][$link_item['uri']])) {
|
||||
$dislike = DI::conversation()->formatActivity($conv_responses['dislike'][$link_item['uri']]['links'], 'dislike', $link_item['id']);
|
||||
$dislike = DI::conversation()->formatActivity($conv_responses['dislike'][$link_item['uri']]['links'], 'dislike', $link_item['id'], '', []);
|
||||
}
|
||||
|
||||
if (($can_post || Security::canWriteToUserWall($owner_uid))) {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
fpostit
|
||||
|
||||
original author: Devlon Duthied
|
||||
|
||||
see his blog posting:
|
||||
http://blog.duthied.com/2011/09/13/node-agnostic-friendika-bookmarklet/
|
||||
|
||||
original published at github https://github.com/duthied/Friendika-Bookmarklet
|
|
@ -1,11 +0,0 @@
|
|||
javascript: (function() {
|
||||
the_url = 'http://testbubble.com/fpostit.php?url=' + encodeURIComponent(window.location.href) + '&title=' + encodeURIComponent(document.title) + '&text=' + encodeURIComponent('' (window.getSelection ? window.getSelection() : document.getSelection ? document.getSelection() : document.selection.createRange().text));
|
||||
a_funct = function() {
|
||||
if (!window.open(the_url, 'fpostit', 'location=yes,links=no,scrollbars=no,toolbar=no,width=600,height=300')) location.href = the_url;
|
||||
};
|
||||
if (/Firefox/.test(navigator.userAgent)) {
|
||||
setTimeout(a_funct, 0)
|
||||
} else {
|
||||
a_funct()
|
||||
}
|
||||
})()
|
|
@ -1,148 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
if (($_POST["friendica_acct_name"] != '') && ($_POST["friendica_password"] != '')) {
|
||||
setcookie("username", $_POST["friendica_acct_name"], time()+60*60*24*300);
|
||||
setcookie("password", $_POST["friendica_password"], time()+60*60*24*300);
|
||||
}
|
||||
|
||||
?>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
body {
|
||||
font-family: arial, Helvetica,sans-serif;
|
||||
margin: 0px;
|
||||
}
|
||||
.wrap1 {
|
||||
padding: 2px 5px;
|
||||
background-color: #729FCF;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.wrap2 {
|
||||
margin-left: 10px;
|
||||
font-size: 12px;
|
||||
}
|
||||
.logo {
|
||||
margin-left: 3px;
|
||||
margin-right: 5px;
|
||||
float: left;
|
||||
}
|
||||
h2 {
|
||||
color: #ffffff;
|
||||
}
|
||||
.error {
|
||||
background-color: #FFFF66;
|
||||
font-size: 12px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<?php
|
||||
|
||||
if (isset($_GET['title'])) {
|
||||
$title = $_GET['title'];
|
||||
}
|
||||
if (isset($_GET['text'])) {
|
||||
$text = $_GET['text'];
|
||||
}
|
||||
if (isset($_GET['url'])) {
|
||||
$url = $_GET['url'];
|
||||
}
|
||||
|
||||
if ((isset($title)) && (isset($text)) && (isset($url))) {
|
||||
$content = "$title\nsource:$url\n\n$text";
|
||||
} else {
|
||||
$content = $_POST['content'];
|
||||
}
|
||||
|
||||
if (isset($_POST['submit'])) {
|
||||
|
||||
if (($_POST["friendica_acct_name"] != '') && ($_POST["friendica_password"] != '')) {
|
||||
$acctname = $_POST["friendica_acct_name"];
|
||||
$tmp_account_array = explode("@", $acctname);
|
||||
if (isset($tmp_account_array[1])) {
|
||||
$username = $tmp_account_array[0];
|
||||
$hostname = $tmp_account_array[1];
|
||||
}
|
||||
$password = $_POST["friendica_password"];
|
||||
$content = $_POST["content"];
|
||||
|
||||
$url = "http://" . $hostname . '/api/statuses/update';
|
||||
$data = ['status' => $content];
|
||||
|
||||
// echo "posting to: $url<br/>";
|
||||
|
||||
$c = curl_init();
|
||||
curl_setopt($c, CURLOPT_URL, $url);
|
||||
curl_setopt($c, CURLOPT_USERPWD, "$username:$password");
|
||||
curl_setopt($c, CURLOPT_POSTFIELDS, $data);
|
||||
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
|
||||
$c_result = curl_exec($c);
|
||||
if(curl_errno($c)){
|
||||
$error = curl_error($c);
|
||||
showForm($error, $content);
|
||||
}
|
||||
|
||||
curl_close($c);
|
||||
if (!isset($error)) {
|
||||
echo '<script language="javascript" type="text/javascript">window.close();</script>';
|
||||
}
|
||||
|
||||
} else {
|
||||
$error = "Missing account name and/or password...try again please";
|
||||
showForm($error, $content);
|
||||
}
|
||||
|
||||
} else {
|
||||
showForm(null, $content);
|
||||
}
|
||||
|
||||
function showForm($error, $content) {
|
||||
$username_cookie = $_COOKIE['username'];
|
||||
$password_cookie = $_COOKIE['password'];
|
||||
|
||||
echo <<<EOF
|
||||
<div class='wrap1'>
|
||||
<h2><img class='logo' width="32" height="32" src='friendica.svg' align='middle';/>
|
||||
Friendica Bookmarklet</h2>
|
||||
</div>
|
||||
|
||||
<div class="wrap2">
|
||||
<form method="post" action="{$_SERVER['PHP_SELF']}">
|
||||
Enter the email address of the Friendica Account that you want to cross-post to:(example: user@friendica.org)<br /><br />
|
||||
Account ID: <input type="text" name="friendica_acct_name" value="{$username_cookie}" size="50"/><br />
|
||||
Password: <input type="password" name="friendica_password" value="{$password_cookie}" size="50"/><br />
|
||||
<textarea name="content" id="content" rows="6" cols="70">{$content}</textarea><br />
|
||||
<input type="submit" value="PostIt!" name="submit" /> <span class='error'>$error</span>
|
||||
</form>
|
||||
<p></p>
|
||||
</div>
|
||||
EOF;
|
||||
|
||||
}
|
||||
?>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -1 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="192" height="192" viewBox="0 0 1920 1920"><rect width="1800" height="1800" x="60" y="60" fill="#1872a2" rx="333"/><path fill="#febf19" d="M40 371q0-136 98-234 98-97 234-97h1178q136 0 233 97 97 98 97 234v1178q0 136-97 234-97 97-233 97H372q-137 0-234-97-97-98-98-234Zm1510-258h-296v442H666v373l587-4 1 441H666v442h884q107 0 182-75 75-74 74-183V371q0-108-74-182-74-75-182-76z"/></svg>
|
Before Width: | Height: | Size: 428 B |
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
Contact: mailto:info@friendi.ca
|
||||
|
||||
Expires: 2024-10-30T23:59:59Z
|
||||
Expires: 2025-01-30T23:59:59Z
|
||||
|
||||
Preferred-Languages: en
|
||||
|
||||
|
|
88
src/App.php
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
@ -39,10 +39,10 @@ use Friendica\Core\L10n;
|
|||
use Friendica\Core\System;
|
||||
use Friendica\Core\Theme;
|
||||
use Friendica\Database\Database;
|
||||
use Friendica\Model\Contact;
|
||||
use Friendica\Model\Profile;
|
||||
use Friendica\Module\Special\HTTPException as ModuleHTTPException;
|
||||
use Friendica\Network\HTTPException;
|
||||
use Friendica\Protocol\ATProtocol\DID;
|
||||
use Friendica\Security\OpenWebAuth;
|
||||
use Friendica\Util\DateTimeFormat;
|
||||
use Friendica\Util\HTTPInputData;
|
||||
use Friendica\Util\HTTPSignature;
|
||||
|
@ -64,7 +64,7 @@ class App
|
|||
{
|
||||
const PLATFORM = 'Friendica';
|
||||
const CODENAME = 'Yellow Archangel';
|
||||
const VERSION = '2023.12';
|
||||
const VERSION = '2024.06-dev';
|
||||
|
||||
// Allow themes to control internal parameters
|
||||
// by changing App values in theme.php
|
||||
|
@ -93,6 +93,9 @@ class App
|
|||
/** @var string The name of the current mobile theme */
|
||||
private $currentMobileTheme;
|
||||
|
||||
/** @var Authentication */
|
||||
private $auth;
|
||||
|
||||
/**
|
||||
* @var IManageConfigValues The config
|
||||
*/
|
||||
|
@ -133,42 +136,6 @@ class App
|
|||
*/
|
||||
private $session;
|
||||
|
||||
/**
|
||||
* @deprecated 2022.03
|
||||
* @see IHandleUserSessions::isAuthenticated()
|
||||
*/
|
||||
public function isLoggedIn(): bool
|
||||
{
|
||||
return $this->session->isAuthenticated();
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated 2022.03
|
||||
* @see IHandleUserSessions::isSiteAdmin()
|
||||
*/
|
||||
public function isSiteAdmin(): bool
|
||||
{
|
||||
return $this->session->isSiteAdmin();
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated 2022.03
|
||||
* @see IHandleUserSessions::getLocalUserId()
|
||||
*/
|
||||
public function getLoggedInUserId(): int
|
||||
{
|
||||
return $this->session->getLocalUserId();
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated 2022.03
|
||||
* @see IHandleUserSessions::getLocalUserNickname()
|
||||
*/
|
||||
public function getLoggedInUserNickname(): string
|
||||
{
|
||||
return $this->session->getLocalUserNickname();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the profile owner ID
|
||||
*
|
||||
|
@ -314,8 +281,9 @@ class App
|
|||
* @param DbaDefinition $dbaDefinition
|
||||
* @param ViewDefinition $viewDefinition
|
||||
*/
|
||||
public function __construct(Database $database, IManageConfigValues $config, App\Mode $mode, BaseURL $baseURL, LoggerInterface $logger, Profiler $profiler, L10n $l10n, Arguments $args, IManagePersonalConfigValues $pConfig, IHandleUserSessions $session, DbaDefinition $dbaDefinition, ViewDefinition $viewDefinition)
|
||||
public function __construct(Authentication $auth, Database $database, IManageConfigValues $config, App\Mode $mode, BaseURL $baseURL, LoggerInterface $logger, Profiler $profiler, L10n $l10n, Arguments $args, IManagePersonalConfigValues $pConfig, IHandleUserSessions $session, DbaDefinition $dbaDefinition, ViewDefinition $viewDefinition)
|
||||
{
|
||||
$this->auth = $auth;
|
||||
$this->database = $database;
|
||||
$this->config = $config;
|
||||
$this->mode = $mode;
|
||||
|
@ -565,8 +533,8 @@ class App
|
|||
*/
|
||||
public function runFrontend(App\Router $router, IManagePersonalConfigValues $pconfig, Authentication $auth, App\Page $page, Nav $nav, ModuleHTTPException $httpException, HTTPInputData $httpInput, float $start_time, array $server)
|
||||
{
|
||||
$requeststring = ($_SERVER['REQUEST_METHOD'] ?? '') . ' ' . ($_SERVER['REQUEST_URI'] ?? '') . ' ' . ($_SERVER['SERVER_PROTOCOL'] ?? '');
|
||||
$this->logger->debug('Request received', ['address' => $_SERVER['REMOTE_ADDR'] ?? '', 'request' => $requeststring, 'referer' => $_SERVER['HTTP_REFERER'] ?? '', 'user-agent' => $_SERVER['HTTP_USER_AGENT'] ?? '']);
|
||||
$requeststring = ($server['REQUEST_METHOD'] ?? '') . ' ' . ($server['REQUEST_URI'] ?? '') . ' ' . ($server['SERVER_PROTOCOL'] ?? '');
|
||||
$this->logger->debug('Request received', ['address' => $server['REMOTE_ADDR'] ?? '', 'request' => $requeststring, 'referer' => $server['HTTP_REFERER'] ?? '', 'user-agent' => $server['HTTP_USER_AGENT'] ?? '']);
|
||||
$request_start = microtime(true);
|
||||
|
||||
$this->profiler->set($start_time, 'start');
|
||||
|
@ -593,10 +561,12 @@ class App
|
|||
Core\Hook::callAll('init_1');
|
||||
}
|
||||
|
||||
DID::routeRequest($this->args->getCommand(), $server);
|
||||
|
||||
if ($this->mode->isNormal() && !$this->mode->isBackend()) {
|
||||
$requester = HTTPSignature::getSigner('', $_SERVER);
|
||||
$requester = HTTPSignature::getSigner('', $server);
|
||||
if (!empty($requester)) {
|
||||
Profile::addVisitorCookieForHandle($requester);
|
||||
OpenWebAuth::addVisitorCookieForHandle($requester);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -606,17 +576,8 @@ class App
|
|||
// Valid profile links contain a path with "/profile/" and no query parameters
|
||||
if ((parse_url($_GET['zrl'], PHP_URL_QUERY) == '') &&
|
||||
strpos(parse_url($_GET['zrl'], PHP_URL_PATH) ?? '', '/profile/') !== false) {
|
||||
if ($this->session->get('visitor_home') != $_GET['zrl']) {
|
||||
$this->session->set('my_url', $_GET['zrl']);
|
||||
$this->session->set('authenticated', 0);
|
||||
|
||||
$remote_contact = Contact::getByURL($_GET['zrl'], false, ['subscribe']);
|
||||
if (!empty($remote_contact['subscribe'])) {
|
||||
$_SESSION['remote_comment'] = $remote_contact['subscribe'];
|
||||
}
|
||||
}
|
||||
|
||||
Model\Profile::zrlInit($this);
|
||||
$this->auth->setUnauthenticatedVisitor($_GET['zrl']);
|
||||
OpenWebAuth::zrlInit();
|
||||
} else {
|
||||
// Someone came with an invalid parameter, maybe as a DDoS attempt
|
||||
// We simply stop processing here
|
||||
|
@ -627,14 +588,14 @@ class App
|
|||
|
||||
if (!empty($_GET['owt']) && $this->mode->isNormal()) {
|
||||
$token = $_GET['owt'];
|
||||
Model\Profile::openWebAuthInit($token);
|
||||
OpenWebAuth::init($token);
|
||||
}
|
||||
|
||||
if (!$this->mode->isBackend()) {
|
||||
$auth->withSession($this);
|
||||
}
|
||||
|
||||
if (empty($_SESSION['authenticated'])) {
|
||||
if ($this->session->isUnauthenticated()) {
|
||||
header('X-Account-Management-Status: none');
|
||||
}
|
||||
|
||||
|
@ -654,6 +615,11 @@ class App
|
|||
Core\Hook::loadHooks();
|
||||
}
|
||||
|
||||
// Compatibility with Hubzilla
|
||||
if ($moduleName == 'rpost') {
|
||||
$this->baseURL->redirect('compose');
|
||||
}
|
||||
|
||||
// Compatibility with the Android Diaspora client
|
||||
if ($moduleName == 'stream') {
|
||||
$this->baseURL->redirect('network?order=post');
|
||||
|
@ -713,13 +679,13 @@ class App
|
|||
|
||||
// Wrapping HTML responses in the theme template
|
||||
if ($response->getHeaderLine(ICanCreateResponses::X_HEADER) === ICanCreateResponses::TYPE_HTML) {
|
||||
$response = $page->run($this, $this->baseURL, $this->args, $this->mode, $response, $this->l10n, $this->profiler, $this->config, $pconfig, $nav, $this->session->getLocalUserId());
|
||||
$response = $page->run($this, $this->session, $this->baseURL, $this->args, $this->mode, $response, $this->l10n, $this->profiler, $this->config, $pconfig, $nav, $this->session->getLocalUserId());
|
||||
}
|
||||
|
||||
$this->logger->debug('Request processed sucessfully', ['response' => $response->getStatusCode(), 'address' => $_SERVER['REMOTE_ADDR'] ?? '', 'request' => $requeststring, 'referer' => $_SERVER['HTTP_REFERER'] ?? '', 'user-agent' => $_SERVER['HTTP_USER_AGENT'] ?? '', 'duration' => number_format(microtime(true) - $request_start, 3)]);
|
||||
$this->logger->debug('Request processed sucessfully', ['response' => $response->getStatusCode(), 'address' => $server['REMOTE_ADDR'] ?? '', 'request' => $requeststring, 'referer' => $server['HTTP_REFERER'] ?? '', 'user-agent' => $server['HTTP_USER_AGENT'] ?? '', 'duration' => number_format(microtime(true) - $request_start, 3)]);
|
||||
System::echoResponse($response);
|
||||
} catch (HTTPException $e) {
|
||||
$this->logger->debug('Request processed with exception', ['response' => $e->getCode(), 'address' => $_SERVER['REMOTE_ADDR'] ?? '', 'request' => $requeststring, 'referer' => $_SERVER['HTTP_REFERER'] ?? '', 'user-agent' => $_SERVER['HTTP_USER_AGENT'] ?? '', 'duration' => number_format(microtime(true) - $request_start, 3)]);
|
||||
$this->logger->debug('Request processed with exception', ['response' => $e->getCode(), 'address' => $server['REMOTE_ADDR'] ?? '', 'request' => $requeststring, 'referer' => $server['HTTP_REFERER'] ?? '', 'user-agent' => $server['HTTP_USER_AGENT'] ?? '', 'duration' => number_format(microtime(true) - $request_start, 3)]);
|
||||
$httpException->rawContent($e);
|
||||
}
|
||||
$page->logRuntime($this->config, 'runFrontend');
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
@ -32,6 +32,7 @@ use Friendica\Core\L10n;
|
|||
use Friendica\Core\Logger;
|
||||
use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues;
|
||||
use Friendica\Core\Renderer;
|
||||
use Friendica\Core\Session\Model\UserSession;
|
||||
use Friendica\Core\System;
|
||||
use Friendica\Core\Theme;
|
||||
use Friendica\Module\Response;
|
||||
|
@ -325,13 +326,13 @@ class Page implements ArrayAccess
|
|||
*
|
||||
* @throws HTTPException\InternalServerErrorException
|
||||
*/
|
||||
private function initFooter(App $app, Mode $mode, L10n $l10n)
|
||||
private function initFooter(UserSession $session, Mode $mode, L10n $l10n)
|
||||
{
|
||||
// If you're just visiting, let javascript take you home
|
||||
if (!empty($_SESSION['visitor_home'])) {
|
||||
$homebase = $_SESSION['visitor_home'];
|
||||
} elseif (!empty($app->getLoggedInUserNickname())) {
|
||||
$homebase = 'profile/' . $app->getLoggedInUserNickname();
|
||||
} elseif (!empty($session->getLocalUserNickname())) {
|
||||
$homebase = 'profile/' . $session->getLocalUserNickname();
|
||||
}
|
||||
|
||||
if (isset($homebase)) {
|
||||
|
@ -420,7 +421,7 @@ class Page implements ArrayAccess
|
|||
* @throws HTTPException\InternalServerErrorException
|
||||
* @throws HTTPException\ServiceUnavailableException
|
||||
*/
|
||||
public function run(App $app, BaseURL $baseURL, Arguments $args, Mode $mode, ResponseInterface $response, L10n $l10n, Profiler $profiler, IManageConfigValues $config, IManagePersonalConfigValues $pconfig, Nav $nav, int $localUID)
|
||||
public function run(App $app, UserSession $session, BaseURL $baseURL, Arguments $args, Mode $mode, ResponseInterface $response, L10n $l10n, Profiler $profiler, IManageConfigValues $config, IManagePersonalConfigValues $pconfig, Nav $nav, int $localUID)
|
||||
{
|
||||
$moduleName = $args->getModuleName();
|
||||
|
||||
|
@ -459,7 +460,7 @@ class Page implements ArrayAccess
|
|||
/* Build the page ending -- this is stuff that goes right before
|
||||
* the closing </body> tag
|
||||
*/
|
||||
$this->initFooter($app, $mode, $l10n);
|
||||
$this->initFooter($session, $mode, $l10n);
|
||||
|
||||
$profiler->set(microtime(true) - $timestamp, 'aftermath');
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
@ -356,7 +356,7 @@ abstract class BaseModule implements ICanHandleRequests
|
|||
*/
|
||||
public static function getFormSecurityToken(string $typename = ''): string
|
||||
{
|
||||
$user = User::getById(DI::app()->getLoggedInUserId(), ['guid', 'prvkey']);
|
||||
$user = User::getById(DI::userSession()->getLocalUserId(), ['guid', 'prvkey']);
|
||||
$timestamp = time();
|
||||
$sec_hash = hash('whirlpool', ($user['guid'] ?? '') . ($user['prvkey'] ?? '') . session_id() . $timestamp . $typename);
|
||||
|
||||
|
@ -390,7 +390,7 @@ abstract class BaseModule implements ICanHandleRequests
|
|||
|
||||
$max_livetime = 10800; // 3 hours
|
||||
|
||||
$user = User::getById(DI::app()->getLoggedInUserId(), ['guid', 'prvkey']);
|
||||
$user = User::getById(DI::userSession()->getLocalUserId(), ['guid', 'prvkey']);
|
||||
|
||||
$x = explode('.', $hash);
|
||||
if (time() > (intval($x[0]) + $max_livetime)) {
|
||||
|
@ -410,7 +410,7 @@ abstract class BaseModule implements ICanHandleRequests
|
|||
public static function checkFormSecurityTokenRedirectOnError(string $err_redirect, string $typename = '', string $formname = 'form_security_token')
|
||||
{
|
||||
if (!self::checkFormSecurityToken($typename, $formname)) {
|
||||
Logger::notice('checkFormSecurityToken failed: user ' . DI::app()->getLoggedInUserNickname() . ' - form element ' . $typename);
|
||||
Logger::notice('checkFormSecurityToken failed: user ' . DI::userSession()->getLocalUserNickname() . ' - form element ' . $typename);
|
||||
Logger::debug('checkFormSecurityToken failed', ['request' => $_REQUEST]);
|
||||
DI::sysmsg()->addNotice(self::getFormSecurityStandardErrorMessage());
|
||||
DI::baseUrl()->redirect($err_redirect);
|
||||
|
@ -420,7 +420,7 @@ abstract class BaseModule implements ICanHandleRequests
|
|||
public static function checkFormSecurityTokenForbiddenOnError(string $typename = '', string $formname = 'form_security_token')
|
||||
{
|
||||
if (!self::checkFormSecurityToken($typename, $formname)) {
|
||||
Logger::notice('checkFormSecurityToken failed: user ' . DI::app()->getLoggedInUserNickname() . ' - form element ' . $typename);
|
||||
Logger::notice('checkFormSecurityToken failed: user ' . DI::userSession()->getLocalUserNickname() . ' - form element ' . $typename);
|
||||
Logger::debug('checkFormSecurityToken failed', ['request' => $_REQUEST]);
|
||||
|
||||
throw new \Friendica\Network\HTTPException\ForbiddenException();
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2023, the Friendica project
|
||||
* @copyright Copyright (C) 2010-2024, the Friendica project
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
|
|