Compare commits
1088 commits
Author | SHA1 | Date | |
---|---|---|---|
8446de2aa6 | |||
Hypolite Petovan | aa133b5437 | ||
aa596df098 | |||
Hypolite Petovan | a2afb101cd | ||
Tobias Diekershoff | b9fe8ee38f | ||
Hypolite Petovan | c75dbfd3d7 | ||
Hypolite Petovan | 636b84b41c | ||
Hypolite Petovan | c5b46fe748 | ||
Hypolite Petovan | 4cdc0ef267 | ||
Roland Häder | 82bb36e13d | ||
Philipp Holzer | 417b0072bb | ||
Philipp Holzer | 2dc38e5632 | ||
Philipp Holzer | 5bf5b5e6c9 | ||
Philipp Holzer | 12ba37e8d2 | ||
Philipp Holzer | 13783089e7 | ||
Philipp Holzer | d441b90bda | ||
Hypolite Petovan | dbc1ebbb5c | ||
Roland Häder | 3aeeac5d98 | ||
Hypolite Petovan | d322e9288b | ||
Roland Häder | 657a8a7cb5 | ||
Roland Häder | 202857ba7d | ||
Roland Häder | fd8f4269ff | ||
Roland Häder | 5699b03e8d | ||
Roland Häder | a49fb9cbf9 | ||
Roland Häder | 84d3eecc33 | ||
Roland Häder | 57e741f2cf | ||
Roland Häder | 182c3db9b8 | ||
Roland Häder | b8353a6eb7 | ||
Roland Häder | c6c936a80f | ||
Roland Häder | 3f74a59f73 | ||
Roland Häder | 69a68be800 | ||
Roland Häder | f889aeffb3 | ||
Roland Häder | d8ff966d21 | ||
Roland Häder | 35c78ce14c | ||
Roland Häder | c2e26b4f49 | ||
Roland Häder | 2f3705f471 | ||
Hypolite Petovan | 0322456f70 | ||
Roland Häder | 0ddb315b23 | ||
Hypolite Petovan | bf600905d3 | ||
Hypolite Petovan | 859af16cca | ||
Roland Häder | 636fef26f1 | ||
Roland Häder | 589d0360a4 | ||
Roland Häder | 69676c9f7b | ||
Hypolite Petovan | b2aee2cf29 | ||
e3aed8099c | |||
Hypolite Petovan | c824ba43d5 | ||
Roland Häder | 7eefb9aed8 | ||
Roland Häder | 15d8341d9a | ||
Roland Häder | b996712ef7 | ||
Roland Häder | eb231bc548 | ||
78bf7f187c | |||
Hypolite Petovan | b96daeeeef | ||
Roland Häder | d5441da49a | ||
Roland Häder | 101cd2dd10 | ||
Roland Häder | ba45e59313 | ||
Roland Häder | ee8d0ad619 | ||
Roland Häder | feec96cbc4 | ||
Roland Häder | 2dd7d465e8 | ||
Roland Häder | 74ab7648c6 | ||
Roland Häder | 12add2fb64 | ||
Roland Häder | 08f55f0358 | ||
Roland Häder | abd0d9f3fd | ||
Roland Häder | dfa95ea58d | ||
Roland Häder | 84bfc37bf1 | ||
Tobias Diekershoff | fa973d3b0f | ||
Hypolite Petovan | e9f7bb477d | ||
Hypolite Petovan | 7295138f8d | ||
Hypolite Petovan | d68f307337 | ||
Hypolite Petovan | a05baaf249 | ||
Roland Häder | 2f358607c7 | ||
6443713af1 | |||
Roland Häder | cdcfb4064b | ||
Hypolite Petovan | 1c57ea7f75 | ||
Roland Häder | 8092188991 | ||
Roland Häder | f38ad168f5 | ||
Roland Häder | 80c8ec17c2 | ||
Roland Häder | 0332a57bfd | ||
Roland Häder | 3b8d9a7248 | ||
Roland Häder | 9ccb113530 | ||
Roland Häder | dcedd2e5d9 | ||
Roland Häder | 5e57ad4d44 | ||
Roland Häder | 5fe428d3e4 | ||
Roland Häder | a7651fa1d5 | ||
Roland Häder | 1080a840f5 | ||
Roland Häder | 945cd1a2c2 | ||
Roland Häder | 0d81a08e3c | ||
Roland Häder | 44a9ec9b17 | ||
Roland Häder | f62c28008a | ||
Roland Häder | cefffde691 | ||
Roland Häder | f1867463a0 | ||
Roland Häder | 77c37ff2db | ||
Hypolite Petovan | e6ddb167f6 | ||
Tobias Diekershoff | 4650ff53d9 | ||
Tobias Diekershoff | fff6e30782 | ||
Hypolite Petovan | d2ca812647 | ||
Roland Häder | 3e522ed512 | ||
Roland Häder | 95f9eb34ac | ||
Hypolite Petovan | ee9bc338a5 | ||
Roland Häder | b6fa022a73 | ||
Roland Häder | 6a98ffa330 | ||
Roland Häder | fbae0b8bcf | ||
Roland Häder | ea22e88896 | ||
Roland Häder | 752953e472 | ||
Hypolite Petovan | 88eacbf66e | ||
Roland Häder | 0c12e947dd | ||
Roland Häder | feb87e8dc3 | ||
Roland Häder | 4fb03cf163 | ||
Roland Häder | e96a548286 | ||
Roland Häder | e5cc7a5ab1 | ||
Roland Häder | 6743de63f5 | ||
Roland Häder | cc750d743b | ||
Roland Häder | 9c80dd35e5 | ||
Tobias Diekershoff | 13a5a30b28 | ||
Roland Häder | cd3b01fd82 | ||
Roland Häder | 94a594eeb2 | ||
Roland Häder | ec96f2252e | ||
Roland Häder | 14bf72e4fe | ||
Roland Häder | 97904ea7dd | ||
Roland Häder | a0c8fc6d6e | ||
Hypolite Petovan | 7528b79469 | ||
Hypolite Petovan | d48e40c1bf | ||
Roland Häder | d276f2c62b | ||
Roland Häder | 8c38265b37 | ||
Roland Häder | 2512449751 | ||
Roland Häder | 9f24a4b60e | ||
Roland Häder | 96954e2b18 | ||
Hypolite Petovan | 622b978a84 | ||
Roland Häder | 5a553df7d8 | ||
Roland Häder | ed3c53a5f8 | ||
Roland Häder | bff57bb030 | ||
Hypolite Petovan | 777872e6fa | ||
Roland Häder | c0d7f8944d | ||
Roland Häder | 60f8c2d795 | ||
Roland Häder | 5f6943b008 | ||
Roland Häder | 5792a01a01 | ||
Roland Häder | f3599fa3e9 | ||
Tobias Diekershoff | 065dad79ca | ||
Tobias Diekershoff | a063a89c57 | ||
Roland Häder | b6bfe72083 | ||
Roland Häder | 7bb0cb5323 | ||
Roland Häder | 2c5685c89c | ||
Roland Häder | d7d2ad77ff | ||
Roland Häder | 39f2d197ea | ||
Roland Häder | 6f1d52cf71 | ||
Roland Häder | 2f961b11bf | ||
Roland Häder | fa14a02a19 | ||
Roland Häder | f3b57008b5 | ||
Roland Häder | 41f34c4261 | ||
Roland Häder | 9691bb06fb | ||
Roland Häder | 94eb426151 | ||
Roland Häder | c29c49797a | ||
Roland Häder | 4e437190c5 | ||
Roland Häder | a1a81cdc6b | ||
Roland Häder | 8fc710f82a | ||
Roland Häder | 8ba3f13fae | ||
Roland Häder | 7ec07178c8 | ||
Hypolite Petovan | e90ad0c1cd | ||
Hypolite Petovan | b2e5993314 | ||
Roland Häder | 92a1d14e5e | ||
Roland Häder | 8756d92316 | ||
Roland Häder | 8aaf99c61d | ||
Roland Häder | bd3a7b9877 | ||
Roland Häder | 69cda4f760 | ||
Roland Häder | 7cbb818c93 | ||
Roland Häder | 89302d0843 | ||
Roland Häder | aaf5c323b6 | ||
Roland Häder | adb4aea6ad | ||
Roland Häder | 51f43278d6 | ||
Roland Häder | 88c40f3336 | ||
Roland Häder | a770634b95 | ||
Roland Häder | 36d56a4041 | ||
Roland Häder | c467bff79f | ||
Roland Häder | 4f3321cc9f | ||
Roland Häder | 10bb7d5625 | ||
Roland Häder | fdd237a090 | ||
Roland Häder | 605e7d55b3 | ||
Roland Häder | 0c9aff8a09 | ||
Roland Häder | af8cd5ca86 | ||
Roland Häder | 227bab43a8 | ||
Roland Häder | f7c1eaa858 | ||
Roland Häder | e484b6d6dc | ||
Roland Häder | 45b5f67bca | ||
Roland Häder | 5c9ce790bf | ||
Roland Häder | 33768ea1c6 | ||
Roland Häder | 4e53666c70 | ||
Roland Häder | 7560dccc08 | ||
Roland Häder | 2766c7d9cf | ||
Roland Häder | a587217f47 | ||
Roland Häder | dd54e52575 | ||
Roland Häder | c351099c5a | ||
Roland Häder | 2c5595c358 | ||
Roland Häder | 40d7f29a11 | ||
Roland Häder | 1edc6b3c3b | ||
Roland Häder | 42b04f397b | ||
Roland Häder | aa5f0d5ec1 | ||
Roland Häder | 97e27cb523 | ||
Roland Häder | c2e889cfae | ||
Hypolite Petovan | a8a21c7fb6 | ||
Roland Häder | 5106bb2881 | ||
Roland Häder | a903dbd77e | ||
Hypolite Petovan | 51b31a846f | ||
Roland Häder | 6035de6883 | ||
Hypolite Petovan | 341d8860d1 | ||
Roland Häder | 51a7b5c584 | ||
Roland Häder | 0e1f734b03 | ||
Roland Häder | e8fee5644b | ||
Roland Häder | 624e4c192c | ||
Roland Häder | 962b06bf41 | ||
Roland Häder | f2b7326650 | ||
Roland Häder | 7814ba4fc4 | ||
Roland Häder | b200874f17 | ||
Roland Häder | b1e4c0931a | ||
Hypolite Petovan | bb57d45237 | ||
Roland Häder | e9af4b5bb9 | ||
Roland Häder | 65da5246ca | ||
Tobias Diekershoff | 13ef86d4a3 | ||
Roland Häder | 58c48977ec | ||
Roland Häder | fd0d4aedee | ||
Hypolite Petovan | 207bf58801 | ||
Roland Häder | 5fa954208a | ||
Roland Häder | a3fa95e8e4 | ||
Roland Häder | 34aee64349 | ||
Roland Häder | 143e4c4a18 | ||
Tobias Diekershoff | 98954dd14e | ||
Michael | 726c4dff7d | ||
Hypolite Petovan | f839cd3826 | ||
Michael | b816ae4db5 | ||
1eadcb4855 | |||
Tobias Diekershoff | 6d6f356446 | ||
Tobias Diekershoff | 7614ace843 | ||
Tobias Diekershoff | cc77052817 | ||
Hypolite Petovan | 663296b107 | ||
Michael | 70b9a8114d | ||
Michael | d9fb081db9 | ||
Michael | a47f1efec3 | ||
Michael | c1a64b77c0 | ||
Michael | a5b5f9316d | ||
Michael | e0a0c57c44 | ||
Tobias Diekershoff | 05a76a3dc2 | ||
Tobias Diekershoff | 13d7242463 | ||
Tobias Diekershoff | 7fe7d0c904 | ||
Tobias Diekershoff | 21028a4bf4 | ||
Tobias Diekershoff | ddbd1d9d7b | ||
Tobias Diekershoff | 5ec1891e0a | ||
Tobias Diekershoff | 5bd3f62665 | ||
Tobias Diekershoff | 5573540ecf | ||
Michael | d7d8a6ab55 | ||
Tobias Diekershoff | 3394b65c60 | ||
Michael | 4cf46b9770 | ||
Hypolite Petovan | c0863d2fb9 | ||
Michael | 176f0c1216 | ||
Hypolite Petovan | 143120b9c4 | ||
Michael | 4157f816f5 | ||
Michael | 9a1abda314 | ||
Michael | 7e747b2f41 | ||
Hypolite Petovan | 37405567c1 | ||
Roland Häder | 1e890e16ac | ||
Tobias Diekershoff | 86837ddb4a | ||
a1a265091a | |||
Michael | 2064a2ce87 | ||
Tobias Diekershoff | 06769dfc91 | ||
Tobias Diekershoff | a18a95b870 | ||
Hypolite Petovan | 2dc45af57a | ||
Michael | d2772908e4 | ||
Hypolite Petovan | 6b0b8848a4 | ||
Michael | d665b78ea8 | ||
Tobias Diekershoff | df33b88eb1 | ||
79205b8377 | |||
Tobias Diekershoff | 17877d9fd7 | ||
Tobias Diekershoff | e3183cb4b4 | ||
Tobias Diekershoff | 579a23ba6e | ||
Tobias Diekershoff | 64fac441a6 | ||
Hypolite Petovan | 21d4726619 | ||
Michael | 56e88d2c4c | ||
Michael | 19772f29f3 | ||
Hypolite Petovan | 90eeacde3c | ||
Michael | d435203f72 | ||
Hypolite Petovan | 9c7568cffc | ||
Michael | 069c1d0b35 | ||
Michael | 9bb371850a | ||
Michael | a07e47f50c | ||
Michael | 62701b49e1 | ||
Hypolite Petovan | 3f711b5301 | ||
Michael | da33517a2d | ||
Michael | 557b1125e2 | ||
Tobias Diekershoff | e5802b7c30 | ||
Michael | 1196df4895 | ||
Michael | 001aac9952 | ||
Tobias Diekershoff | 9e37435ae6 | ||
Michael | 9daeb552dd | ||
Michael | 24559b711b | ||
Michael | d242332aa4 | ||
Hypolite Petovan | 7c3dcc6f1d | ||
Michael | 13e216032f | ||
Hypolite Petovan | 28ce00c102 | ||
913f5ada27 | |||
Michael | 57b8708425 | ||
Tobias Diekershoff | b6d2d71cbd | ||
Tobias Diekershoff | c3024e5b92 | ||
Hypolite Petovan | b1afcb5ebf | ||
Tobias Diekershoff | fd48a8c9ab | ||
Tobias Diekershoff | 327b29d794 | ||
Michael | f1913b28e0 | ||
Michael | db4ad7883f | ||
Michael | 3b2c2e5d33 | ||
Tobias Diekershoff | 7684cd4f07 | ||
Michael | 50a0034744 | ||
Tobias Diekershoff | 4a5d230aad | ||
Michael | 4108704ee3 | ||
Michael | 194f0f7058 | ||
Hypolite Petovan | 6e3b5d251e | ||
Michael | 0aee9a054a | ||
Tobias Diekershoff | 69c8bd3b5e | ||
Michael | 5442d09cc1 | ||
e4c13bb1c7 | |||
Tobias Diekershoff | ec07a31fb3 | ||
Tobias Diekershoff | 5d4aec176e | ||
Michael | b794c599a9 | ||
Michael | e46354a522 | ||
aae735413e | |||
Tobias Diekershoff | 078334ce53 | ||
514250073f | |||
Tobias Diekershoff | d67c4d1e91 | ||
Tobias Diekershoff | 8c4ec6adde | ||
Hypolite Petovan | 749130b226 | ||
Michael | 36b80eb704 | ||
Michael | f4e680c97e | ||
Tobias Diekershoff | 8e09f6f579 | ||
Tobias Diekershoff | d6d826329f | ||
Michael | 7b219718c4 | ||
Tobias Diekershoff | bce376ef6f | ||
Tobias Diekershoff | 78a0c98a11 | ||
Michael | 592665ed28 | ||
Hypolite Petovan | 0a44143ef5 | ||
Michael | cc6192df02 | ||
Tobias Diekershoff | 94a178c590 | ||
0b312ae9b3 | |||
Tobias Diekershoff | d7eb78e65e | ||
Tobias Diekershoff | 6ec812208f | ||
Tobias Diekershoff | 406b3f14dd | ||
ee40d8ea04 | |||
Hypolite Petovan | 7f711e266f | ||
Hypolite Petovan | 9160fde8ca | ||
Hypolite Petovan | 220703575c | ||
Hypolite Petovan | 1e68c90fb2 | ||
Michael | aabb56c70d | ||
47a3d8e6ce | |||
Hypolite Petovan | 4c5d9e22a8 | ||
Hypolite Petovan | 121d26999c | ||
Michael | 540b3f892b | ||
Hypolite Petovan | 1301a53f20 | ||
Hypolite Petovan | f1630ebb05 | ||
Hypolite Petovan | 7d09ce86c4 | ||
Michael | 42d3e5c1ce | ||
Hypolite Petovan | 697b8a6cb8 | ||
Michael | 1dccc31508 | ||
Tobias Diekershoff | 92bf5213cc | ||
Michael | 02473d8a0e | ||
511a51b9a3 | |||
Hypolite Petovan | a924716131 | ||
Hypolite Petovan | faa3f26d3b | ||
Hypolite Petovan | a503d5ac1b | ||
Hypolite Petovan | 875d84435c | ||
Michael | 4ef7f42257 | ||
Michael | 881c4204b4 | ||
Michael | ba8088bf3c | ||
c7608983dc | |||
Tobias Diekershoff | efa15ab0b8 | ||
Tobias Diekershoff | d3624af1b6 | ||
Michael | b05aa824f7 | ||
Michael | 0a43fe857c | ||
e793438e0d | |||
Tobias Diekershoff | cf91734f4f | ||
Hypolite Petovan | d4631176b2 | ||
Michael | 4475b3ff39 | ||
Michael | 8c901ebd74 | ||
Hypolite Petovan | 1d29025091 | ||
Tobias Diekershoff | cb5b6f345e | ||
Tobias Diekershoff | 314431507d | ||
Tobias Diekershoff | 620352d1a2 | ||
Tobias Diekershoff | 5a1108352c | ||
Tobias Diekershoff | 5c9aa13147 | ||
Tobias Diekershoff | 1ed2b1af7a | ||
Tobias Diekershoff | dc13704dd4 | ||
Hypolite Petovan | 488fdd9791 | ||
Hypolite Petovan | ae3acba231 | ||
Hypolite Petovan | 36ccb25bd2 | ||
Michael | 918c1eeb56 | ||
Michael | f5d69b3b6a | ||
Michael | e8864653d8 | ||
Michael | dadebdd061 | ||
Tobias Diekershoff | 737d9e7a58 | ||
Tobias Diekershoff | 2a0ab3f0f1 | ||
Hypolite Petovan | 9804c71b53 | ||
Hypolite Petovan | 0de50a5118 | ||
e5e509ea21 | |||
Michael | 2fbfc0633a | ||
Michael | d3709d8497 | ||
Michael | 9da0e637a3 | ||
Michael | 80adad3ad2 | ||
Michael | fb0e31791f | ||
Michael | 077c6ece64 | ||
Michael | 2ead69c7a5 | ||
0374f0e523 | |||
Michael | 0ff8ca8053 | ||
eddfab7122 | |||
Michael | f764ab7429 | ||
Michael | 74b102b948 | ||
Michael | bee6ffe968 | ||
Michael | 034d838248 | ||
Michael | 8969e83134 | ||
Michael | e68ff3b3bb | ||
Michael | b1a2de5cb5 | ||
Michael | f16cb13dc7 | ||
Tobias Diekershoff | 9b860f4051 | ||
Michael | 7b91c4f333 | ||
Michael | 68599c7efa | ||
Michael | 299c4df8f4 | ||
Michael | d658c81107 | ||
Michael | d6242aacf6 | ||
Tobias Diekershoff | a1871756ee | ||
Philipp Holzer | 218fc0c20d | ||
Philipp Holzer | 783b05cbb1 | ||
Hypolite Petovan | c4ec80e839 | ||
Michael | 087ad25c87 | ||
Michael | 54d7a435a3 | ||
Tobias Diekershoff | ed350e472f | ||
Michael | 49dab14215 | ||
Tobias Diekershoff | 9e19043c15 | ||
Michael | 3444c29b0b | ||
Hypolite Petovan | 11538376ed | ||
Hypolite Petovan | c374630c65 | ||
Michael | e4e8b8cb46 | ||
Michael | 5095ce621a | ||
7857c329cf | |||
Michael | 9ded39eff6 | ||
Hypolite Petovan | 8af0af5f35 | ||
Tobias Diekershoff | d858aa86e5 | ||
Michael | 2fc5957abb | ||
Michael | 653af77e5f | ||
Michael | 6ce23bd9ca | ||
Michael | dc16e6d471 | ||
87e14d9d28 | |||
a13d33e057 | |||
Tobias Diekershoff | e151e5958f | ||
Michael | 49c47008d1 | ||
0b8e0a09e3 | |||
Philipp Holzer | c33611c484 | ||
Michael | 5aa798b1dc | ||
Michael | 536ce232a7 | ||
Tobias Diekershoff | 7d958e8804 | ||
Tobias Diekershoff | b18880221a | ||
Tobias Diekershoff | 23e5ae15e3 | ||
Michael | 4622814e5f | ||
Michael | 2e6e3597e5 | ||
Michael | f6167b4cfd | ||
Michael | 4e9d7df31a | ||
Michael | aacaa3c2cf | ||
Michael | 4016a576d5 | ||
Tobias Diekershoff | 6eb70bea16 | ||
Michael | 0b50dc363b | ||
Michael | c3fd8b39aa | ||
Michael | 4e3e9dc763 | ||
Michael | 75534fa3f3 | ||
Michael | 73019284ce | ||
Michael | a880d8b982 | ||
Michael | 610f8a086f | ||
Tobias Diekershoff | 3493f91801 | ||
Michael | 10cdefa232 | ||
Tobias Diekershoff | e555ea6aad | ||
Michael | 1ccf22a496 | ||
Tobias Diekershoff | 9f1cc2fb67 | ||
Michael | 3f8da997f4 | ||
Hypolite Petovan | 65516a1d3a | ||
257ae2ac17 | |||
Michael | 4daae255d8 | ||
Tobias Diekershoff | f07422634a | ||
Michael | 62a1cf257e | ||
Tobias Diekershoff | 69984ac6bc | ||
7199a91289 | |||
Michael | 2dc9b4eda2 | ||
Michael | f277d9cd2f | ||
Michael | 1555c82196 | ||
Michael | a63caefe3d | ||
Hypolite Petovan | 4829c240e9 | ||
Hypolite Petovan | 2bde5c4850 | ||
Michael | 2c511b8a23 | ||
Michael | 440b6d7956 | ||
Michael | d77b043d9c | ||
Michael | 324cce7a19 | ||
Tobias Diekershoff | 204e52ea30 | ||
Michael | 972f91436c | ||
Tobias Diekershoff | 6f70d21e07 | ||
Michael | 5af7c30026 | ||
Tobias Diekershoff | 66004f4d2d | ||
Tobias Diekershoff | 44291a465b | ||
Michael | 30b9af10ac | ||
Tobias Diekershoff | 036b565a78 | ||
Michael | f0bfa9a690 | ||
Michael | 689b71c696 | ||
Michael | fbdb73cdd6 | ||
Michael | 43dbd1c396 | ||
Michael | f8d929d94e | ||
Michael | 962b35a76a | ||
Michael | a8839517fe | ||
Michael | 30bcb24af7 | ||
Michael | 4b5a743645 | ||
Tobias Diekershoff | 74167043a8 | ||
Michael | 4ef2679ca6 | ||
Michael | fab5ba39ff | ||
Michael | 065d73f860 | ||
Michael | 65b86fe0d5 | ||
Michael | 0f0f4bc2c7 | ||
Tobias Diekershoff | bb44ff1528 | ||
Michael | a662245c74 | ||
Michael | 47cd1edb9f | ||
201610dfe6 | |||
Michael | 2595b5e12f | ||
Michael | 2049fbce91 | ||
Michael | 4f68be82ef | ||
Michael | 67a74c15e1 | ||
5409998047 | |||
Michael | b0b67f1fde | ||
Tobias Diekershoff | dfeb2e9a62 | ||
Tobias Diekershoff | ce7bf8524d | ||
Michael | a943dbb420 | ||
Michael | d5d2892f59 | ||
Hypolite Petovan | f128c00ca5 | ||
Michael | 3d7ecb4fde | ||
Hypolite Petovan | 610b3fc39e | ||
Michael | afa57edf8e | ||
Hypolite Petovan | fc364df7c2 | ||
Michael | 47ee6fd009 | ||
449df1a583 | |||
Tobias Diekershoff | d816f02ab8 | ||
Hypolite Petovan | 7026dd37db | ||
Michael | 0f0b649e8d | ||
Michael | 34f594137e | ||
Michael | ffb8491c3f | ||
Michael | 020ba7a4ed | ||
Michael | 695e3d8b61 | ||
Tobias Diekershoff | b5129eb4ed | ||
Michael | 47808ab0e9 | ||
Hypolite Petovan | e374c2e3da | ||
Michael | d9de8b6d2f | ||
Michael | fae414fedd | ||
Hypolite Petovan | 776ce3f63a | ||
Tobias Diekershoff | 4be52cdc4e | ||
Michael | 7c3173a0ae | ||
Michael | 945f5c6db2 | ||
Hypolite Petovan | d195d934be | ||
Michael | 22da88b43f | ||
Michael | 548bf469ca | ||
Hypolite Petovan | c50ca418a5 | ||
Michael | 630d25a24b | ||
Michael | 34030a736d | ||
Michael | 916aa1c9a9 | ||
Hypolite Petovan | e1f32f7f15 | ||
Michael | cbe4a42906 | ||
Michael | f785026289 | ||
Michael | f744dd362d | ||
Michael | 9d1ff0a4ce | ||
Michael | 006b7a95f0 | ||
Michael | 681d19a3bc | ||
Michael | 53d064c283 | ||
Michael | e3692c0105 | ||
Hypolite Petovan | b9e091eb2f | ||
6b9f543c4e | |||
Michael | f220e26f00 | ||
Michael | 805dc8e6bd | ||
Michael | dd422a1e03 | ||
Michael | 7b0187c4c5 | ||
ee81c266e1 | |||
Michael | 2d856f48b7 | ||
Michael | a31256412e | ||
Hypolite Petovan | 510dacf4df | ||
Hypolite Petovan | 25876099ce | ||
Tobias Diekershoff | 166f38ef3b | ||
Michael | 67c3a20c4f | ||
Hypolite Petovan | 4729fca5d9 | ||
1e7a55180a | |||
Michael | 2433fee461 | ||
Michael | ab42fd88a4 | ||
Michael | 2a4b5b4cb4 | ||
Michael | 4d359b7de1 | ||
Michael | d34432c517 | ||
Michael | 2f74a7bca4 | ||
Michael | 10b453bfc2 | ||
Michael | 60532ee7e4 | ||
Michael | f6218427a4 | ||
Tobias Diekershoff | ff8e839139 | ||
4171ff7563 | |||
9953abb8aa | |||
Tobias Diekershoff | a7237ac036 | ||
Michael | fdf8002df1 | ||
Michael | 4ba28e0199 | ||
Michael | 49ec5e5e6e | ||
Michael | e6440471ae | ||
Michael | 690682a37e | ||
Michael | 632a98965c | ||
Tobias Diekershoff | 8bf806c550 | ||
Michael | 3163760343 | ||
Michael | 6e394ac6ff | ||
Michael | 76789acace | ||
Michael | fcb245947e | ||
Michael | 9c2fe81ac6 | ||
Michael | c608d85707 | ||
Michael | a9990db98c | ||
Michael | 40aa67f8be | ||
Tobias Diekershoff | f8b75ad1cc | ||
e7bfe0bf31 | |||
Hypolite Petovan | 51854754b6 | ||
c938eb5002 | |||
Hypolite Petovan | 196a381a52 | ||
Hypolite Petovan | 6dc13b9fc6 | ||
Michael | 13e4144ba6 | ||
Michael | f7b6507438 | ||
Tobias Diekershoff | 815b76db8b | ||
Tobias Diekershoff | 37ddda7fc2 | ||
Tobias Diekershoff | 245fe3dade | ||
Tobias Diekershoff | da68774e91 | ||
Michael | 19c1b31ab2 | ||
Michael | e19681684b | ||
d255c3128e | |||
Michael | 1f43332a1d | ||
Michael | fb3353d4bd | ||
Tobias Diekershoff | 7ce6fd19b5 | ||
Tobias Diekershoff | 6161485b2f | ||
Michael | fdf70c1047 | ||
Hypolite Petovan | 18c642f2a7 | ||
Michael | a2452b33eb | ||
Michael | 8dc0ab9bb3 | ||
Michael | d3de2497bc | ||
Michael | d44641e58c | ||
Michael | 1326239576 | ||
Hypolite Petovan | aa65e3032d | ||
Michael | 9eafcf8484 | ||
51380af100 | |||
748b7528d3 | |||
Hypolite Petovan | 55db2670d1 | ||
420f4c54b7 | |||
31ed9b450d | |||
Hypolite Petovan | dc05172272 | ||
Hypolite Petovan | 5a08bca15b | ||
Michael | 0ad18afb7b | ||
Michael | 144c9f00f4 | ||
Hypolite Petovan | 973257ae13 | ||
Michael | 171354181d | ||
Hypolite Petovan | 478ee7b6fc | ||
Michael | 83e311decb | ||
Michael | 990eea2c4e | ||
Tobias Diekershoff | b89f727cca | ||
Hypolite Petovan | f4c073674e | ||
Michael | 069a008ca4 | ||
Hypolite Petovan | 7bc449215f | ||
Hypolite Petovan | 967c438312 | ||
Hypolite Petovan | 90368d7484 | ||
Hypolite Petovan | 64330f9895 | ||
Hypolite Petovan | 904ee0ea59 | ||
Michael | ac08bc1362 | ||
Michael | f7142f0144 | ||
Michael | 4af6e730d3 | ||
Michael | 0a3c5cc40c | ||
Michael | 060597f619 | ||
Hypolite Petovan | 1c0c787d1c | ||
Michael | 9b646dad97 | ||
Hypolite Petovan | ee05bd91a3 | ||
Michael | f34b7b91fa | ||
Hypolite Petovan | 45c4af3832 | ||
Michael | 666b3bbca3 | ||
Michael | 5a41c2039a | ||
Tobias Diekershoff | 691136c396 | ||
Michael | eb1f38df22 | ||
Hypolite Petovan | 70392df68d | ||
Michael | 2236e5cfb0 | ||
Hypolite Petovan | e1a8f8aff6 | ||
Michael | 94a8f430e3 | ||
Hypolite Petovan | 333863684a | ||
Michael | 8d25094719 | ||
Michael | 834844573b | ||
Hypolite Petovan | 8dbd1d0e52 | ||
Michael | 62b31900a6 | ||
Hypolite Petovan | 75f49a41af | ||
6617b6c088 | |||
Michael | 0380a3e216 | ||
foss- | ea148050dc | ||
foss- | ec5905aee2 | ||
Hypolite Petovan | 60afca1fea | ||
Hypolite Petovan | d2d368781d | ||
51fe7876d1 | |||
065e379198 | |||
foss- | c796f854f2 | ||
9f58141dad | |||
Michael | cca7d40a8f | ||
Hypolite Petovan | 627e91f209 | ||
a2a5f27d76 | |||
Michael | eaa8163201 | ||
Michael | 0696da3d1b | ||
Tobias Diekershoff | e4682a522e | ||
Michael | 0d8cf06e4a | ||
Tobias Diekershoff | d5f0829cad | ||
Michael | 30e5ef928a | ||
Hypolite Petovan | 8720561e49 | ||
Michael | 62367923e0 | ||
Hypolite Petovan | 3842f02b02 | ||
Michael | c88d306a41 | ||
Michael | 989ac2fda8 | ||
Michael | 4a22034be6 | ||
Michael | d15023fe4b | ||
Michael | 344e12c4fc | ||
Michael | a1e675ded1 | ||
Michael | d7df0825db | ||
Hypolite Petovan | 4eecf733e1 | ||
Philipp Holzer | 3033f79529 | ||
Philipp Holzer | 8e2cc678dc | ||
Philipp Holzer | 277cd51433 | ||
Hypolite Petovan | ba1bdc6920 | ||
b2b8b23ed6 | |||
Michael | 69b7923df2 | ||
Michael | 2764859350 | ||
Michael | 6c8ea1d0d8 | ||
Michael | 75bc4eccb7 | ||
Hypolite Petovan | 2024d45971 | ||
Tobias Diekershoff | 32aea615e6 | ||
Hypolite Petovan | f4aa8236c4 | ||
72a3ab6382 | |||
Hypolite Petovan | 8669f12176 | ||
Michael | 65071ffc9e | ||
Hypolite Petovan | 9339d4e53b | ||
Michael | 5a3fe900f0 | ||
Michael | 612e91b603 | ||
Michael | a1dd299eb3 | ||
Hypolite Petovan | 29f65d250f | ||
Michael | e6ea015cb4 | ||
Michael | c0b3c527d6 | ||
Hypolite Petovan | 79526564ca | ||
Michael | dcbca0c6a3 | ||
Michael | a5a5a4b603 | ||
Michael | 61abc6377d | ||
Michael | e6caed7b5f | ||
Michael | aa2a32d16f | ||
Hypolite Petovan | eceaf782cc | ||
Hypolite Petovan | 8ab477320a | ||
Philipp Holzer | 04866195b4 | ||
Michael | 1475f53e21 | ||
Michael | 39a1745361 | ||
Michael | 5290f0cd51 | ||
Michael | 029daef997 | ||
5fe75ed50d | |||
Philipp Holzer | 4aeccd3157 | ||
Philipp Holzer | e299fc67c8 | ||
Philipp Holzer | 73c3b21665 | ||
c700645385 | |||
Tobias Diekershoff | 3faa4142c1 | ||
Michael | 1db3143dc5 | ||
Michael | 71afbabbd8 | ||
Hypolite Petovan | e9a6c4a7e3 | ||
Michael | 5d497f9962 | ||
db60557a4f | |||
Michael | 2ca51f752d | ||
Michael | 3e21b035b7 | ||
Michael | 94b7c1fc77 | ||
Michael | 28e3eee91b | ||
Michael | 908d2594ed | ||
Michael | 1fae0123ec | ||
Tobias Diekershoff | 173e72169b | ||
Michael | 51b2bf6f70 | ||
Hypolite Petovan | 797db32992 | ||
Michael | ff70f74952 | ||
Michael | 4f2d659d42 | ||
Hypolite Petovan | e09e1b2336 | ||
Philipp Holzer | 80a533ddab | ||
c396e3099e | |||
Tobias Diekershoff | 7bea941f3c | ||
Michael | 0e6dcaebcc | ||
Tobias Diekershoff | c1fd163b97 | ||
Michael | 8c34c3b8ae | ||
Michael | 7aec520b32 | ||
Tobias Diekershoff | 1f0d828cd9 | ||
Michael | 212eba327b | ||
aa1ef0516d | |||
Hypolite Petovan | 719f47932d | ||
Hypolite Petovan | ad1d11487e | ||
Tobias Diekershoff | ab60cf0572 | ||
Hypolite Petovan | 4b2cc546f1 | ||
Michael | 6f43821ebf | ||
Hypolite Petovan | 709e9dcf9c | ||
Tobias Diekershoff | 5cb83900ff | ||
Hypolite Petovan | 2438eb78dd | ||
Hypolite Petovan | 56d0a33286 | ||
Michael | 53ba68e222 | ||
Michael | 45199b498d | ||
Michael | 13addaf901 | ||
Michael | bbb4ffb7a0 | ||
Michael | be016b0c45 | ||
Hypolite Petovan | 5a4018a05b | ||
Michael | a2a5f05a19 | ||
Hypolite Petovan | 7c282c597d | ||
Michael | 7959bc1e63 | ||
Michael | 4dace46159 | ||
Tobias Diekershoff | 09e55c15e4 | ||
Michael | 85fce09b1a | ||
75a7ff9b11 | |||
Tobias Diekershoff | f66020e767 | ||
Hypolite Petovan | e738428876 | ||
Michael | e4a5094c90 | ||
Michael | 91905bea89 | ||
Hypolite Petovan | 014c7b5943 | ||
fcad961e57 | |||
Michael | fb6a435a6a | ||
Tobias Diekershoff | 111d42ce8f | ||
Hypolite Petovan | a4a24e06a5 | ||
Michael | f9369141a4 | ||
Michael | 351e9a307c | ||
Michael | 3f15a20e4a | ||
Michael | 4e45987f74 | ||
Hypolite Petovan | 4329f5381b | ||
677cbf8aea | |||
Michael | aef9cb9992 | ||
Michael | 1fe756b5b6 | ||
Hypolite Petovan | 9eb6299f19 | ||
Hypolite Petovan | 61e023d448 | ||
Michael | 0aa229489f | ||
Michael | 040abc7743 | ||
5c3226d88e | |||
Hypolite Petovan | 04ac4841f9 | ||
Hypolite Petovan | 6818c8e69a | ||
Michael | 0b10806ce3 | ||
Hypolite Petovan | 2703fd50fc | ||
Tobias Diekershoff | 77cb9405be | ||
Tobias Diekershoff | cd7b9177ea | ||
f5bcc4ad4b | |||
72c31c060d | |||
Tobias Diekershoff | 69dc90ffd1 | ||
ef8dce89b6 | |||
Tobias Diekershoff | 8d3bef8e63 | ||
Tobias Diekershoff | 8d64cf4f9b | ||
Hypolite Petovan | 7b9e62198e | ||
Tobias Diekershoff | 79772214ad | ||
Hypolite Petovan | a07f840c74 | ||
a30b553c28 | |||
Tobias Diekershoff | 02b6ac3ed3 | ||
Tobias Diekershoff | 12038d45d0 | ||
e252b5972e | |||
Hypolite Petovan | 634c785d4b | ||
Hypolite Petovan | 07d4cdbdde | ||
Hypolite Petovan | 36e85b01c6 | ||
Hypolite Petovan | 73c7b88fb2 | ||
Hypolite Petovan | 371b2b22bd | ||
1138abe923 | |||
Michael | 7940b31685 | ||
Hypolite Petovan | ee60c96269 | ||
Hypolite Petovan | e6f745bcb1 | ||
Hypolite Petovan | 49971b1465 | ||
Hypolite Petovan | 1ae7cac236 | ||
Hypolite Petovan | b002f6f027 | ||
Hypolite Petovan | 5a12bd87f3 | ||
Hypolite Petovan | b7cee324b0 | ||
Hypolite Petovan | deafdcde95 | ||
Hypolite Petovan | 7ce97459d4 | ||
Tobias Diekershoff | b98243826f | ||
Michael | 0956d1dd64 | ||
Tobias Diekershoff | 5a4b97b0e6 | ||
Michael | 2642996171 | ||
Hypolite Petovan | 7da13cf335 | ||
Michael | ca086b880b | ||
4eba3c0126 | |||
Tobias Diekershoff | 5db3e02bbd | ||
Tobias Diekershoff | 3194c5d89f | ||
Michael | 12d7c99f46 | ||
Hypolite Petovan | 9e3dbfab3e | ||
Michael | 314bf92ead | ||
Michael | fb13890341 | ||
Michael | 8c778ca02e | ||
Michael | 56cd98b38b | ||
Michael | c1bb1cf0fc | ||
5c4871fe6d | |||
Michael | 5a16a424ac | ||
Hypolite Petovan | 6a9c2173fb | ||
Michael | 073a6afaaf | ||
Hypolite Petovan | f9ad561a26 | ||
Hypolite Petovan | d15ebb6fd3 | ||
Hypolite Petovan | 0c4f1eadb8 | ||
Michael | 5eb647585d | ||
Hypolite Petovan | 1b74ead75c | ||
Michael | f264923cad | ||
Hypolite Petovan | e3025c2c15 | ||
Michael | 2f97d61a09 | ||
Hypolite Petovan | e9df177055 | ||
Michael | 03d38d9e35 | ||
Hypolite Petovan | c81eb78e38 | ||
Michael | 38fbe281f9 | ||
Hypolite Petovan | 00aa905c15 | ||
Hypolite Petovan | 0f9a239d59 | ||
Hypolite Petovan | c13ae36256 | ||
Michael | 4803b99157 | ||
Hypolite Petovan | 82e25a7cf7 | ||
Michael | e0295abdab | ||
Michael | e0468ac914 | ||
Michael | 8039ab731f | ||
Hypolite Petovan | 8cf843abc3 | ||
Tobias Diekershoff | 8cfbe9b49b | ||
Tobias Diekershoff | 4b6bbe3632 | ||
Tobias Diekershoff | 79bc863831 | ||
Tobias Diekershoff | f660c38944 | ||
Tobias Diekershoff | 352c493247 | ||
Tobias Diekershoff | 1ee8cb7380 | ||
Hypolite Petovan | 2e8d018192 | ||
Philipp Holzer | 6bb94fcabc | ||
Hypolite Petovan | 285ff75482 | ||
f73fe42d8f | |||
Tobias Diekershoff | 5e3ee23b8f | ||
acba7d25a0 | |||
Tobias Diekershoff | 8095898a6b | ||
Michael | 31dbdd3677 | ||
Hypolite Petovan | bad0c1b090 | ||
Michael | 903bc9b679 | ||
1ec1adf904 | |||
7f07b84f78 | |||
Tobias Diekershoff | 18bdc5fbc1 | ||
Tobias Diekershoff | 8bf0b96792 | ||
Michael | 421dd028ce | ||
Tobias Diekershoff | e351122cc5 | ||
Michael | 5539e42743 | ||
Tobias Diekershoff | aa28761d38 | ||
Michael | 15de709b89 | ||
Hypolite Petovan | 7df5b41f2e | ||
Michael | f059e56e0f | ||
Hypolite Petovan | e00c12f09d | ||
Michael | f853d58198 | ||
Tobias Diekershoff | 1178e8f324 | ||
Tobias Diekershoff | 3852cb65d4 | ||
Michael | 1f1d3b2578 | ||
Hypolite Petovan | 136b46919d | ||
Michael | 772294494e | ||
Tobias Diekershoff | 4fcf2f99ae | ||
Tobias Diekershoff | a6c206be41 | ||
4b5aa80aba | |||
Tobias Diekershoff | d787c12956 | ||
Hypolite Petovan | f36d4891bc | ||
Michael | 918bf5b6dd | ||
Michael | 329dc22137 | ||
Michael | 6415fc62a0 | ||
Michael | bf5c8a2c43 | ||
Hypolite Petovan | 419fe67c6c | ||
cbbe83294d | |||
d1141c63fb | |||
e4cfd4a7c3 | |||
8a10b0c635 | |||
4492a09131 | |||
33c4fbf2a6 | |||
470be2b5e4 | |||
335be6f032 | |||
67eb9ae360 | |||
Hypolite Petovan | f38888ecc6 | ||
Hypolite Petovan | cddead2343 | ||
Hypolite Petovan | 6a1f9a7fa3 | ||
Hypolite Petovan | 48e2963ac7 | ||
Hypolite Petovan | 52f5d924b7 | ||
Hypolite Petovan | 093dd70e79 | ||
dd71196b86 | |||
Tobias Diekershoff | 201525f932 | ||
Michael | d32b9d5d95 | ||
40259c7f04 | |||
Hypolite Petovan | b3622e74b2 | ||
Hypolite Petovan | 1d779c6193 | ||
Hypolite Petovan | b24fe917e4 | ||
Hypolite Petovan | f6e4984d7e | ||
Michael | 59630a2c82 | ||
Hypolite Petovan | 1617e9fc64 | ||
dac67baf11 | |||
b0ab82355b | |||
948405a486 | |||
Hypolite Petovan | ece09f4919 | ||
Hypolite Petovan | b83b4f9108 | ||
Tobias Diekershoff | 9bb7e4cdfe | ||
Michael | ec0b05d826 | ||
Hypolite Petovan | d7b573c6d7 | ||
Hypolite Petovan | e0ea51818e | ||
Hypolite Petovan | bed1139093 | ||
Michael | cec9c6d1a6 | ||
Michael | 2321c7a55b | ||
Michael | d6725437b0 | ||
Michael | a0b6bdc8de | ||
Michael | 39e820e6a3 | ||
ff439272b9 | |||
50580fd04c | |||
Hypolite Petovan | c86cc83524 | ||
0209892631 | |||
Hypolite Petovan | d2be291502 | ||
6607f9bebe | |||
Michael | 706bcfa832 | ||
Tobias Diekershoff | 9afb35d158 | ||
Tobias Diekershoff | 446775cdc8 | ||
d5373c583b | |||
Michael | 311c1fdd81 | ||
9c6f6bcb95 | |||
Hypolite Petovan | b1d31471ec | ||
Michael | 00f39cd308 | ||
Michael | 22952f88ca | ||
Michael | b081227b47 | ||
Michael | 9aa0f6f547 | ||
Michael | c867581530 | ||
Tobias Diekershoff | 32c4d8c565 | ||
Tobias Diekershoff | 4770903f54 | ||
Hypolite Petovan | 30dcf3380c | ||
Hypolite Petovan | 4fe2257d8e | ||
Hypolite Petovan | 26c86e25c9 | ||
Hypolite Petovan | 35abf33c05 | ||
Hypolite Petovan | c03ff7833b | ||
4c39faca95 | |||
Tobias Diekershoff | 4c7d3a6371 | ||
Hypolite Petovan | c376081d0d | ||
Hypolite Petovan | 17d49422b4 | ||
Michael | 39724d5079 | ||
Michael | ebb4c0f947 | ||
Michael | 0ce756596e | ||
Michael | 830a91e586 | ||
Michael | 7a5a8c8d68 | ||
Michael | 49dd97e5fd | ||
Michael | 234dac49b4 | ||
Michael | 1b6b6bcc6d | ||
Michael | 51fb265621 | ||
618dda7dd2 | |||
Michael | ccf92fc922 | ||
Michael | 9ac24a0f36 | ||
76a50a6942 | |||
Tobias Diekershoff | b703d053ab | ||
Hypolite Petovan | 6c0dbc1775 | ||
Hypolite Petovan | 7dadc7f6dc | ||
18e0fb375b | |||
Michael | 33edfc6a5f | ||
Philipp Holzer | c4e40734df | ||
Philipp Holzer | be240ca500 | ||
Philipp Holzer | 4e58c6981c | ||
Hypolite Petovan | 3b6c40e2e6 | ||
Hypolite Petovan | 785ea0325e | ||
Hypolite Petovan | 99979019bf | ||
Hypolite Petovan | 361fdccdc7 | ||
Michael | d019ef57d2 | ||
4d274cc3ea | |||
Hypolite Petovan | f329d5c067 | ||
Hypolite Petovan | 9ae0234bb5 | ||
Michael | 29d83c0ffb | ||
Michael | 2b0518ac04 | ||
31ff583c5e | |||
Michael | d404f15312 | ||
Michael | a5a1c81790 | ||
Michael | 9c60b4127b | ||
Tobias Diekershoff | 41f502266e | ||
Tobias Diekershoff | ef0014a4c6 | ||
Michael | ee3a8ccb3b | ||
Michael | e394143148 | ||
6bc69f3353 | |||
Michael | cdee2b44db | ||
Michael | a3ba3fb383 | ||
203d87e047 | |||
Tobias Diekershoff | c0c1799508 | ||
15a340cf89 | |||
Tobias Diekershoff | d65357dd92 | ||
Hypolite Petovan | 1b73e4d267 | ||
Hypolite Petovan | 0e6fe8d8ad | ||
Hypolite Petovan | c80f7b07e5 | ||
Michael | 5b46b41226 | ||
Michael | 85eab6ebee | ||
80e0e7440a | |||
Michael | 6c156e3bc6 | ||
Michael | 9a764516d0 | ||
Tobias Diekershoff | 5a334deeaf | ||
Michael | b857c26999 | ||
Michael | 14f0a1a1ed | ||
Michael | f87b80266c | ||
ce762b4154 | |||
Tobias Diekershoff | 85791348cb | ||
Hypolite Petovan | 98f55ddb2b | ||
Michael | 061a6d9239 | ||
a1e6c148b1 | |||
Tobias Diekershoff | c2617bd793 | ||
Michael | cda348def2 | ||
Michael | 8e70e19061 | ||
Tobias Diekershoff | 5525420fa9 | ||
Michael | 384fe562a8 | ||
Michael | bdba75ec47 | ||
Michael | 58b4ecd6ae | ||
Michael | 2fdd33f504 | ||
Michael | adfd7d621d | ||
Michael | 92a71f8c27 | ||
Tobias Diekershoff | 960d440ab6 |
|
@ -8,7 +8,11 @@ coverage:
|
|||
round: down
|
||||
range: "70...100"
|
||||
status:
|
||||
project: false
|
||||
patch: false
|
||||
project:
|
||||
default:
|
||||
informational: true
|
||||
patch:
|
||||
default:
|
||||
informational: true
|
||||
|
||||
comment: false
|
||||
|
|
14
.gitignore
vendored
|
@ -85,4 +85,16 @@ venv/
|
|||
/bin/phpunit
|
||||
|
||||
#Ignore cache file
|
||||
.php_cs.cache
|
||||
.php_cs.cache
|
||||
|
||||
#ignore avatar picture cache path
|
||||
/avatar
|
||||
|
||||
#Ignore autotest results
|
||||
autotest-results.xml
|
||||
|
||||
#ignore phpunit result cache
|
||||
tests/.phpunit.result.cache
|
||||
|
||||
#ignore .php_cs (local copy)
|
||||
.php_cs
|
||||
|
|
|
@ -6,6 +6,7 @@ AddType application/x-java-archive .jar
|
|||
AddType audio/ogg .oga
|
||||
#AddHandler php53-cgi .php
|
||||
|
||||
# deny access to log files (friendica.log or php.out)
|
||||
<FilesMatch "\.(out|log)$">
|
||||
<IfModule authz_host_module>
|
||||
#Apache 2.4
|
||||
|
@ -17,6 +18,18 @@ AddType audio/ogg .oga
|
|||
</IfModule>
|
||||
</FilesMatch>
|
||||
|
||||
# deny access to backup files
|
||||
<FilesMatch "(\~|\.bak|\.swp)$">
|
||||
<IfModule authz_host_module>
|
||||
#Apache 2.4
|
||||
Require all denied
|
||||
</IfModule>
|
||||
<IfModule !authz_host_module>
|
||||
#Apache 2.2
|
||||
Deny from all
|
||||
</IfModule>
|
||||
</FilesMatch>
|
||||
|
||||
<IfModule mod_rewrite.c>
|
||||
RewriteEngine on
|
||||
# Protect repository directory from browsing
|
||||
|
|
|
@ -62,7 +62,7 @@ pipeline:
|
|||
- export RELEASE="friendica-full-$VERSION"
|
||||
- export ARTIFACT="$RELEASE.tar.gz"
|
||||
- tar
|
||||
--transform "s,^,$RELEASE/,"
|
||||
--transform "s,^,$RELEASE/,S"
|
||||
-X mods/release-list-exclude.txt
|
||||
-T mods/release-list-include.txt
|
||||
-cvzf ./build/$ARTIFACT
|
||||
|
|
|
@ -60,7 +60,7 @@ pipeline:
|
|||
- export RELEASE="friendica-full-$VERSION"
|
||||
- export ARTIFACT="$RELEASE.tar.gz"
|
||||
- tar
|
||||
--transform "s,^,$RELEASE/,"
|
||||
--transform "s,^,$RELEASE/,S"
|
||||
-X mods/release-list-exclude.txt
|
||||
-T mods/release-list-include.txt
|
||||
-cvzf ./build/$ARTIFACT
|
||||
|
|
98
CHANGELOG
|
@ -1,3 +1,101 @@
|
|||
Version 2022.09 (unreleased)
|
||||
Friendica Core
|
||||
|
||||
Friendica Addons
|
||||
|
||||
Closed Issues
|
||||
|
||||
|
||||
Version 2022.06 (2022-06-11)
|
||||
Friendica Core
|
||||
Added DA DK translation, updates to the translations DE, FR, HU, PL, RU, ZH CN [translation teams]
|
||||
Updates to the documentation [foss-]
|
||||
General code cleanup [annando, MrPetovan, nupplaphil, tobiasd]
|
||||
Added caching for several AP endpoints [annando]
|
||||
Added the display of pinned/featured postings of contacts [annando]
|
||||
Added the display of polls and current votes [annando]
|
||||
Added node relocation to the console tool [MrPetovan]
|
||||
Added tool to move avatars to the avatar cache [annando]
|
||||
Added storage of edit history of postings [annando]
|
||||
Added the possibility to set custom posting dates [annando]
|
||||
Added the possibility that pending events in a forum are send to new members [annando]
|
||||
Removed node relocation functionality from the Admin Panel [MrPetovan]
|
||||
Enhanced performance (database related, global directory) [annando]
|
||||
Enhanced the logging [annando]
|
||||
Enhanced the federation statistics page in the admin panel [annando]
|
||||
Enhanced the Mastodon compatible API [annando]
|
||||
Enhanced the .htaccess-dist file to prevent accessing some common backup files [tobiasd]
|
||||
Enhanced the priority values of some worker queue jobs [annando]
|
||||
Enhanced the possibility for the user selecting which notifications should be shown [MrPetovan]
|
||||
Enhanced the relay server handling [annando]
|
||||
Enhanced the users control what they are notified about [annando]
|
||||
Changed the default icons to the flat icons [atjn]
|
||||
Changed the order of starred posts and posts with mention by the last comment date [annando]
|
||||
Fixed a problem with the local cache of contact avatars [annando]
|
||||
Fixed a problem in the federation with Lemmy nodes [annando]
|
||||
Fixed a problem importing some RSS feeds [annando]
|
||||
Fixed a problem fetching attached media files [annando]
|
||||
Fixed a problem with the abstract being formatted [annando]
|
||||
Fixed a problem preventing the import of contacts [tobiasd]
|
||||
Fixed a problem with IDN URLs [annando]
|
||||
Fixed a problem parsing abstract BBCode tags [MrPetovan]
|
||||
Fixed a problem that could cause unintentionally changing the password by password managers [MrPetovan]
|
||||
Fixed a problem with the language detection of postings [annando]
|
||||
Fixed a problem with the selection of JSON/XML webfinger results [annando]
|
||||
Fixed a problem with re-shared postings that were pinned [annando]
|
||||
Fixed a problem that caused the display of a wrong information about a new follower for some account types [annando]
|
||||
Fixed a problem that caused interaction abilities on postings not to be possible [annando]
|
||||
Fixed a problem causing links to larger photos lead to smaller ones [annando]
|
||||
Fixed a regression that caused pinned private notes to be shown publically [annando]
|
||||
Fixed a problem during the language detection for notifications [annando]
|
||||
|
||||
Friendica Addons
|
||||
Breaking: The obsolete hooks settings_form and settings_post have been removed,
|
||||
custom addons developers should use the addon_settings hook instead.
|
||||
Updates to the translations DA DK, FR, HU, PL [translation teams]
|
||||
advancedcontentfilter
|
||||
Use a random item to validate fields on rule save [MrPetovan]
|
||||
twitter
|
||||
Fix usage of unfollow / block hooks [MrPetovan]
|
||||
S3 storage back-end
|
||||
Added the addon [nupplaphil]
|
||||
|
||||
Closed Issues
|
||||
4639, 9650, 10926, 11040, 11146, 11212, 11223, 11226, 11291, 11299,
|
||||
11309, 11310, 11315, 11319, 11338, 11339, 11340, 11343, 11350, 11353,
|
||||
11371, 11393, 11407, 11425, 11427, 11431, 11440, 11445, 11450, 11461,
|
||||
11469, 11470, 11487, 11488, 11491, 11492, 11504, 11507, 11508, 11510,
|
||||
11511, 11512, 11557, 11560, 11561, 11594, 11602, 11625
|
||||
|
||||
Version 2022.03 (2022-03-07)
|
||||
Friendica Core
|
||||
Updates to the translations AR, DE, HU [translation teams]
|
||||
Updates to the documentation [bkil, tobiasd]
|
||||
General code cleanup [annando, MrPetovan]
|
||||
Enhanced the federation statistics page in the admin panel [annando]
|
||||
Enhanced handling of database errors [annando]
|
||||
Enhanced the thread completion [annando, MrPetovan]
|
||||
Enhanced the handling of unfollow/revoke actions [MrPetovan]
|
||||
Enhanced the API [annando]
|
||||
Fixed a bug that caused wrong categories were displayed in a users profile [MrPetovan]
|
||||
Fixed a bug that lead to private messages being send to the wrong recipient [MrPetovan]
|
||||
Added display of post receivers [annando]
|
||||
Added pleroma like version to the API results [MrPetovan]
|
||||
Added advanced configuration option to automatically re-use the abstract field from AP conversations [annando]
|
||||
Switched to SMARTY-4 templating engine [MrPetovan]
|
||||
Breaking: The distribution of _private forums_ was moved to ActivityPub,
|
||||
making them incompatible with older versions of Friendica [annando]
|
||||
Breaking: The Twitter-/Friendica-/Statusnet-API now uses the same base
|
||||
for the id as the Mastodon API (uri-id instead of id). To still
|
||||
receive new posts with (for example) Friendiqa you have to remove
|
||||
the account and add it again. [annando]
|
||||
|
||||
Friendica Addons
|
||||
Added S3 Storage Backend addon [nupplaphil]
|
||||
|
||||
Closed Issues
|
||||
11220, 11222, 11232, 11234, 11248, 11245, 11264, 11274
|
||||
|
||||
Version 2022.02 (2022-02-06)
|
||||
Friendica Core
|
||||
Updates to the translations AR, DE, ET, FR, GB_EN, GB_US, HU, IT, RU, SV [translation teams]
|
||||
|
|
5
CONTRIBUTING.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
# How to Contribute
|
||||
|
||||
If you want to contribute to the project, you don’t need to have coding experience. There are a number of tasks listed in the issue tracker with the label “[Junior Jobs](https://github.com/friendica/friendica/issues?q=is%3Aopen+is%3Aissue+label%3A%22Junior+Jobs%22)” we think are good for new contributors. But you are by no means limited to these – if you find a solution to a problem (even a new one) please make a pull request at [github](https://github.com/friendica/friendica) or let us know in the [development forum](https://forum.friendi.ca/profile/developers).
|
||||
|
||||
Contribution to Friendica is also not limited to coding. Any contribution to the [documentation](https://github.com/friendica/friendica/tree/develop/doc), the [translation](https://www.transifex.com/Friendica/friendica/dashboard/) or advertisement materials is welcome or reporting a problem. You don’t need to deal with Git(Hub) or Transifex if you don’t like to. Just [get in touch](https://forum.friendi.ca/profile/helpers) with us and we will get the materials to the appropriate places.
|
10
CREDITS.txt
|
@ -28,9 +28,11 @@ Andy
|
|||
Andy Hee
|
||||
Angristan
|
||||
Anthronaut
|
||||
Anton
|
||||
Antron Samurai
|
||||
Arian - Cazare Muncitori
|
||||
Asher Pen
|
||||
atjn
|
||||
aweiher
|
||||
axelt
|
||||
balderino
|
||||
|
@ -45,6 +47,7 @@ ben-utzer
|
|||
Beringer Zsolt
|
||||
BinkaDroid
|
||||
Bjoessi
|
||||
bkil
|
||||
bob lebonche
|
||||
Boris Daniel Martinez Millàn
|
||||
bufalo1973
|
||||
|
@ -54,6 +57,7 @@ Carlos Solís
|
|||
Carsten Pfeiffer
|
||||
Casper
|
||||
Cat Gray
|
||||
chinnux
|
||||
Chris Case
|
||||
Christian González
|
||||
Christian Kalkhoff
|
||||
|
@ -89,6 +93,7 @@ effex7
|
|||
Elena
|
||||
emilia.krawczyk
|
||||
Eric Côté
|
||||
Erich
|
||||
erik
|
||||
Erkan Yilmaz
|
||||
Eugene Veresk
|
||||
|
@ -112,6 +117,7 @@ Gidi Kroon
|
|||
GLComo
|
||||
greeneyedred
|
||||
Gregory Smith
|
||||
gudzpoz
|
||||
guzzisti
|
||||
Haakon Meland Eriksen
|
||||
Hans Meine
|
||||
|
@ -137,12 +143,14 @@ Joe Doe
|
|||
joe slam
|
||||
Johannes Schwab
|
||||
John Brazil
|
||||
John Mortensen
|
||||
Jonatan Nyberg
|
||||
Jonny Tischbein
|
||||
Josef Moravek
|
||||
juanman
|
||||
julia.domagalska
|
||||
Julio Cova
|
||||
k-alin
|
||||
Karel
|
||||
Karolina
|
||||
Kastal András
|
||||
|
@ -214,6 +222,7 @@ Philipp Holzer
|
|||
Pierre Bernardeau
|
||||
Pierre Rudloff
|
||||
Piotr Blonkowski
|
||||
Piotr Strębski
|
||||
pokerazor
|
||||
R C
|
||||
Rabuzarus
|
||||
|
@ -282,6 +291,7 @@ Tobias Diekershoff
|
|||
Tobias Hößl
|
||||
Tom
|
||||
Tom Aurlund
|
||||
Tom Hu
|
||||
tomamplius
|
||||
tomtom84
|
||||
Tony Baldwin
|
||||
|
|
2
Doxyfile
|
@ -1,7 +1,7 @@
|
|||
INPUT = README.md index.php boot.php update.php bin/ mod/ include/ view/ src/ VERSION
|
||||
RECURSIVE = YES
|
||||
PROJECT_NAME = "Friendica"
|
||||
PROJECT_LOGO = images/friendica-64.jpg
|
||||
PROJECT_LOGO = images/friendica-64.png
|
||||
EXCLUDE = .htconfig.php config/ library/ doc/ .git/ log/ addon/ report/ privacy_image_cache/ photo/ proxy/ local/
|
||||
EXCLUDE_PATTERNS = *smarty3* strings.php *.log *.out *test*
|
||||
OUTPUT_DIRECTORY = doc
|
||||
|
|
|
@ -18,11 +18,13 @@
|
|||
* 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Run the worker from a daemon.
|
||||
*
|
||||
* This script was taken from http://php.net/manual/en/function.pcntl-fork.php
|
||||
*/
|
||||
|
||||
if (php_sapi_name() !== 'cli') {
|
||||
header($_SERVER["SERVER_PROTOCOL"] . ' 403 Forbidden');
|
||||
exit();
|
||||
|
@ -230,7 +232,7 @@ while (true) {
|
|||
}
|
||||
|
||||
$timeout = ($seconds >= $wait_interval);
|
||||
} while (!$timeout && !Worker::IPCJobsExists());
|
||||
} while (!$timeout && !Worker\IPC::JobsExists());
|
||||
|
||||
if ($timeout) {
|
||||
$do_cron = true;
|
||||
|
|
|
@ -15,33 +15,34 @@
|
|||
# - TEST_SELECTION= ... Specify which tests are used to run (based on the test-labeling)
|
||||
# - XDEBUG_CONFIG= ... Set some XDEBUG specific environment settings for development
|
||||
|
||||
DATABASENAME=${MYSQL_DATABASE:-test}
|
||||
DATABASEUSER=${MYSQL_USERNAME:-friendica}
|
||||
DATABASEHOST=${MYSQL_HOST:-localhost}
|
||||
BASEDIR=$PWD
|
||||
DATABASE_NAME=${FRIENDICA_MYSQL_DATABASE:-test}
|
||||
DATABASE_USER=${FRIENDICA_MYSQL_USERNAME:-friendica}
|
||||
DATABASE_HOST=${FRIENDICA_MYSQL_HOST:-localhost}
|
||||
DATABASE_PASSWORD=${FRIENDICA_MYSQL_PASSWORD:-friendica}
|
||||
BASEDIR=${PWD}
|
||||
|
||||
DBCONFIGS="mysql mariadb"
|
||||
TESTS="REDIS MEMCACHE MEMCACHED APCU NODB"
|
||||
|
||||
export MYSQL_DATABASE="$DATABASENAME"
|
||||
export MYSQL_USERNAME="$DATABASEUSER"
|
||||
export MYSQL_PASSWORD="friendica"
|
||||
export MYSQL_DATABASE="${DATABASE_NAME}"
|
||||
export MYSQL_USERNAME="${DATABASE_USER}"
|
||||
export MYSQL_PASSWORD="${DATABASE_PASSWORD}"
|
||||
|
||||
if [ -z "$PHP_EXE" ]; then
|
||||
if [ -z "${PHP_EXE}" ]; then
|
||||
PHP_EXE=php
|
||||
fi
|
||||
PHP=$(which "$PHP_EXE")
|
||||
PHP=$(which "${PHP_EXE}")
|
||||
# Use the Friendica internal composer
|
||||
COMPOSER="$BASEDIR/bin/composer.phar"
|
||||
COMPOSER="${BASEDIR}/bin/composer.phar"
|
||||
|
||||
set -e
|
||||
|
||||
_XDEBUG_CONFIG=$XDEBUG_CONFIG
|
||||
_XDEBUG_CONFIG=${XDEBUG_CONFIG}
|
||||
unset XDEBUG_CONFIG
|
||||
|
||||
function show_syntax() {
|
||||
echo -e "Syntax: ./autotest.sh [dbconfigname] [testfile]\n" >&2
|
||||
echo -e "\t\"dbconfigname\" can be one of: $DBCONFIGS" >&2
|
||||
echo -e "\t\"dbconfigname\" can be one of: ${DBCONFIGS}" >&2
|
||||
echo -e "\t\"testfile\" is the name of a test file, for example lib/template.php" >&2
|
||||
echo -e "\nDatabase environment variables:\n" >&2
|
||||
echo -e "\t\"MYSQL_HOST\" Mysql Hostname (Default: localhost)" >&2
|
||||
|
@ -57,22 +58,22 @@ function show_syntax() {
|
|||
echo -e "\nIf no arguments are specified, all tests will be run with all database configs" >&2
|
||||
}
|
||||
|
||||
if [ -x "$PHP" ]; then
|
||||
echo "Using PHP executable $PHP"
|
||||
if [ -x "${PHP}" ]; then
|
||||
echo "Using PHP executable ${PHP}"
|
||||
else
|
||||
echo "Could not find PHP executable $PHP_EXE" >&2
|
||||
echo "Could not find PHP executable ${PHP_EXE}" >&2
|
||||
exit 3
|
||||
fi
|
||||
|
||||
echo "Installing depdendencies"
|
||||
$PHP "$COMPOSER" install
|
||||
${PHP} "$COMPOSER" install
|
||||
|
||||
PHPUNIT="$BASEDIR/vendor/bin/phpunit"
|
||||
PHPUNIT="${BASEDIR}/vendor/bin/phpunit"
|
||||
|
||||
if [ -x "$PHPUNIT" ]; then
|
||||
echo "Using PHPUnit executable $PHPUNIT"
|
||||
if [ -x "${PHPUNIT}" ]; then
|
||||
echo "Using PHPUnit executable ${PHPUNIT}"
|
||||
else
|
||||
echo "Could not find PHPUnit executable after composer $PHPUNIT" >&2
|
||||
echo "Could not find PHPUnit executable after composer ${PHPUNIT}" >&2
|
||||
exit 3
|
||||
fi
|
||||
|
||||
|
@ -83,8 +84,8 @@ fi
|
|||
|
||||
if [ "$1" ]; then
|
||||
FOUND=0
|
||||
for DBCONFIG in $DBCONFIGS; do
|
||||
if [ "$1" = "$DBCONFIG" ]; then
|
||||
for DBCONFIG in ${DBCONFIGS}; do
|
||||
if [ "$1" = "${DBCONFIG}" ]; then
|
||||
FOUND=1
|
||||
break
|
||||
fi
|
||||
|
@ -103,13 +104,13 @@ fi
|
|||
|
||||
function cleanup_config() {
|
||||
|
||||
if [ -n "$DOCKER_CONTAINER_ID" ]; then
|
||||
echo "Kill the docker $DOCKER_CONTAINER_ID"
|
||||
docker stop "$DOCKER_CONTAINER_ID"
|
||||
docker rm -f "$DOCKER_CONTAINER_ID"
|
||||
if [ -n "${DOCKER_CONTAINER_ID}" ]; then
|
||||
echo "Kill the docker ${DOCKER_CONTAINER_ID}"
|
||||
docker stop "${DOCKER_CONTAINER_ID}"
|
||||
docker rm -f "${DOCKER_CONTAINER_ID}"
|
||||
fi
|
||||
|
||||
cd "$BASEDIR"
|
||||
cd "${BASEDIR}"
|
||||
|
||||
# Restore existing config
|
||||
if [ -f config/local.config-autotest-backup.php ]; then
|
||||
|
@ -122,77 +123,77 @@ trap cleanup_config EXIT
|
|||
|
||||
function execute_tests() {
|
||||
DB=$1
|
||||
echo "Setup environment for $DB testing ..."
|
||||
echo "Setup environment for ${DB} testing ..."
|
||||
# back to root folder
|
||||
cd "$BASEDIR"
|
||||
cd "${BASEDIR}"
|
||||
|
||||
# backup current config
|
||||
if [ -f config/local.config.php ]; then
|
||||
mv config/local.config.php config/local.config-autotest-backup.php
|
||||
fi
|
||||
|
||||
if [ -z "$NOINSTALL" ]; then
|
||||
if [ -z "${NOINSTALL}" ]; then
|
||||
#drop database
|
||||
if [ "$DB" == "mysql" ]; then
|
||||
if [ -n "$USEDOCKER" ]; then
|
||||
if [ "${DB}" == "mysql" ]; then
|
||||
if [ -n "${USEDOCKER}" ]; then
|
||||
echo "Fire up the mysql docker"
|
||||
DOCKER_CONTAINER_ID=$(docker run \
|
||||
-e MYSQL_ROOT_PASSWORD=friendica \
|
||||
-e MYSQL_USER="$DATABASEUSER" \
|
||||
-e MYSQL_USER="${DATABASE_USER}" \
|
||||
-e MYSQL_PASSWORD=friendica \
|
||||
-e MYSQL_DATABASE="$DATABASENAME" \
|
||||
-e MYSQL_DATABASE="${DATABASE_NAME}" \
|
||||
-d mysql)
|
||||
DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID")
|
||||
DATABASE_HOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "${DOCKER_CONTAINER_ID}")
|
||||
|
||||
else
|
||||
if [ -z "$DRONE" ]; then # no need to drop the DB when we are on CI
|
||||
if [ -z "${DRONE}" ]; then # no need to drop the DB when we are on CI
|
||||
if [ "mysql" != "$(mysql --version | grep -o mysql)" ]; then
|
||||
echo "Your mysql binary is not provided by mysql"
|
||||
echo "To use the docker container set the USEDOCKER environment variable"
|
||||
exit 3
|
||||
fi
|
||||
mysql -u "$DATABASEUSER" -pfriendica -e "DROP DATABASE IF EXISTS $DATABASENAME" -h $DATABASEHOST || true
|
||||
mysql -u "$DATABASEUSER" -pfriendica -e "CREATE DATABASE $DATABASENAME DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci" -h $DATABASEHOST
|
||||
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}
|
||||
else
|
||||
DATABASEHOST=mysql
|
||||
DATABASE_HOST=mysql
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Waiting for MySQL $DATABASEHOST initialization..."
|
||||
if ! bin/wait-for-connection $DATABASEHOST 3306 300; then
|
||||
echo "Waiting for MySQL ${DATABASE_HOST} initialization..."
|
||||
if ! bin/wait-for-connection ${DATABASE_HOST} 3306 300; then
|
||||
echo "[ERROR] Waited 300 seconds, no response" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "MySQL is up."
|
||||
fi
|
||||
if [ "$DB" == "mariadb" ]; then
|
||||
if [ -n "$USEDOCKER" ]; then
|
||||
if [ "${DB}" == "mariadb" ]; then
|
||||
if [ -n "${USEDOCKER}" ]; then
|
||||
echo "Fire up the mariadb docker"
|
||||
DOCKER_CONTAINER_ID=$(docker run \
|
||||
-e MYSQL_ROOT_PASSWORD=friendica \
|
||||
-e MYSQL_USER="$DATABASEUSER" \
|
||||
-e MYSQL_USER="${DATABASE_USER}" \
|
||||
-e MYSQL_PASSWORD=friendica \
|
||||
-e MYSQL_DATABASE="$DATABASENAME" \
|
||||
-e MYSQL_DATABASE="${DATABASE_NAME}" \
|
||||
-d mariadb)
|
||||
DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID")
|
||||
DATABASE_HOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "${DOCKER_CONTAINER_ID}")
|
||||
|
||||
else
|
||||
if [ -z "$DRONE" ]; then # no need to drop the DB when we are on CI
|
||||
if [ -z "${DRONE}" ]; then # no need to drop the DB when we are on CI
|
||||
if [ "MariaDB" != "$(mysql --version | grep -o MariaDB)" ]; then
|
||||
echo "Your mysql binary is not provided by mysql"
|
||||
echo "To use the docker container set the USEDOCKER environment variable"
|
||||
exit 3
|
||||
fi
|
||||
mysql -u "$DATABASEUSER" -pfriendica -e "DROP DATABASE IF EXISTS $DATABASENAME" -h $DATABASEHOST || true
|
||||
mysql -u "$DATABASEUSER" -pfriendica -e "CREATE DATABASE $DATABASENAME DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci" -h $DATABASEHOST
|
||||
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}
|
||||
else
|
||||
DATABASEHOST=mariadb
|
||||
DATABASE_HOST=mariadb
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Waiting for MariaDB $DATABASEHOST initialization..."
|
||||
if ! bin/wait-for-connection $DATABASEHOST 3306 300; then
|
||||
echo "Waiting for MariaDB ${DATABASE_HOST} initialization..."
|
||||
if ! bin/wait-for-connection ${DATABASE_HOST} 3306 300; then
|
||||
echo "[ERROR] Waited 300 seconds, no response" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
@ -200,28 +201,28 @@ function execute_tests() {
|
|||
echo "MariaDB is up."
|
||||
fi
|
||||
|
||||
if [ -n "$USEDOCKER" ]; then
|
||||
if [ -n "${USEDOCKER}" ]; then
|
||||
echo "Initialize database..."
|
||||
docker exec $DOCKER_CONTAINER_ID mysql -u root -pfriendica -e 'CREATE DATABASE IF NOT EXISTS $DATABASENAME;'
|
||||
docker exec ${DOCKER_CONTAINER_ID} mysql -u root -pfriendica -e "CREATE DATABASE IF NOT EXISTS ${DATABASE_NAME};"
|
||||
fi
|
||||
|
||||
export MYSQL_HOST="$DATABASEHOST"
|
||||
export MYSQL_HOST="${DATABASE_HOST}"
|
||||
|
||||
#call installer
|
||||
echo "Installing Friendica..."
|
||||
"$PHP" ./bin/console.php autoinstall --dbuser="$DATABASEUSER" --dbpass=friendica --dbdata="$DATABASENAME" --dbhost="$DATABASEHOST" --url=https://friendica.local --admin=admin@friendica.local
|
||||
"${PHP}" ./bin/console.php autoinstall --dbuser="${DATABASE_USER}" --dbpass=friendica --dbdata="${DATABASE_NAME}" --dbhost="${DATABASE_HOST}" --url=https://friendica.local --admin=admin@friendica.local
|
||||
fi
|
||||
|
||||
#test execution
|
||||
echo "Testing..."
|
||||
rm -fr "coverage-html"
|
||||
mkdir "coverage-html"
|
||||
if [[ "$_XDEBUG_CONFIG" ]]; then
|
||||
export XDEBUG_CONFIG=$_XDEBUG_CONFIG
|
||||
if [[ "${_XDEBUG_CONFIG}" ]]; then
|
||||
export XDEBUG_CONFIG=${_XDEBUG_CONFIG}
|
||||
fi
|
||||
|
||||
COVER=''
|
||||
if [ -z "$NOCOVERAGE" ]; then
|
||||
if [ -z "${NOCOVERAGE}" ]; then
|
||||
COVER="--coverage-clover tests/autotest-clover.xml"
|
||||
else
|
||||
echo "No coverage"
|
||||
|
@ -229,51 +230,51 @@ function execute_tests() {
|
|||
|
||||
# per default, there is no cache installed
|
||||
GROUP='--exclude-group REDIS,MEMCACHE,MEMCACHED,APCU'
|
||||
if [ "$TEST_SELECTION" == "REDIS" ]; then
|
||||
if [ "${TEST_SELECTION}" == "REDIS" ]; then
|
||||
GROUP="--group REDIS"
|
||||
fi
|
||||
if [ "$TEST_SELECTION" == "MEMCACHE" ]; then
|
||||
if [ "${TEST_SELECTION}" == "MEMCACHE" ]; then
|
||||
GROUP="--group MEMCACHE"
|
||||
fi
|
||||
if [ "$TEST_SELECTION" == "MEMCACHED" ]; then
|
||||
if [ "${TEST_SELECTION}" == "MEMCACHED" ]; then
|
||||
GROUP="--group MEMCACHED"
|
||||
fi
|
||||
if [ "$TEST_SELECTION" == "APCU" ]; then
|
||||
if [ "${TEST_SELECTION}" == "APCU" ]; then
|
||||
GROUP="--group APCU"
|
||||
fi
|
||||
if [ "$TEST_SELECTION" == "NODB" ]; then
|
||||
if [ "${TEST_SELECTION}" == "NODB" ]; then
|
||||
GROUP="--exclude-group DB,SLOWDB"
|
||||
fi
|
||||
|
||||
INPUT="$BASEDIR/tests"
|
||||
INPUT="${BASEDIR}/tests"
|
||||
if [ -n "$2" ]; then
|
||||
INPUT="$INPUT/$2"
|
||||
INPUT="${INPUT}/$2"
|
||||
fi
|
||||
|
||||
echo "${PHPUNIT[@]}" --configuration tests/phpunit.xml $GROUP $COVER --log-junit "autotest-results.xml" "$INPUT" "$3"
|
||||
"${PHPUNIT[@]}" --configuration tests/phpunit.xml $GROUP $COVER --log-junit "autotest-results.xml" "$INPUT" "$3"
|
||||
echo "${PHPUNIT[@]}" --configuration tests/phpunit.xml ${GROUP} ${COVER} --log-junit "autotest-results.xml" "${INPUT}" "$3"
|
||||
"${PHPUNIT[@]}" --configuration tests/phpunit.xml ${GROUP} ${COVER} --log-junit "autotest-results.xml" "${INPUT}" "$3"
|
||||
RESULT=$?
|
||||
|
||||
if [ -n "$DOCKER_CONTAINER_ID" ]; then
|
||||
echo "Kill the docker $DOCKER_CONTAINER_ID"
|
||||
docker stop $DOCKER_CONTAINER_ID
|
||||
docker rm -f $DOCKER_CONTAINER_ID
|
||||
unset $DOCKER_CONTAINER_ID
|
||||
if [ -n "${DOCKER_CONTAINER_ID}" ]; then
|
||||
echo "Kill the docker ${DOCKER_CONTAINER_ID}"
|
||||
docker stop ${DOCKER_CONTAINER_ID}
|
||||
docker rm -f ${DOCKER_CONTAINER_ID}
|
||||
unset ${DOCKER_CONTAINER_ID}
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# Start the test execution
|
||||
#
|
||||
if [ -z "$1" ] && [ -n "$TEST_SELECTION" ]; then
|
||||
if [ -z "$1" ] && [ -n "${TEST_SELECTION}" ]; then
|
||||
# run all known database configs
|
||||
for DBCONFIG in $DBCONFIGS; do
|
||||
execute_tests "$DBCONFIG"
|
||||
for DBCONFIG in ${DBCONFIGS}; do
|
||||
execute_tests "${DBCONFIG}"
|
||||
done
|
||||
else
|
||||
FILENAME="$2"
|
||||
if [ -n "$2" ] && [ ! -f "tests/$FILENAME" ] && [ "${FILENAME:0:2}" != "--" ]; then
|
||||
FILENAME="../$FILENAME"
|
||||
if [ -n "$2" ] && [ ! -f "tests/${FILENAME}" ] && [ "${FILENAME:0:2}" != "--" ]; then
|
||||
FILENAME="../${FILENAME}"
|
||||
fi
|
||||
execute_tests "$1" "$FILENAME" "$3"
|
||||
execute_tests "$1" "${FILENAME}" "$3"
|
||||
fi
|
|
@ -58,7 +58,7 @@ case "$MODE" in
|
|||
OUTFILE="$FULLPATH/../view/lang/C/messages.po"
|
||||
FINDSTARTDIR="."
|
||||
# skip addon folder
|
||||
FINDOPTS="( -path ./addon -or -path ./addons -or -path ./addons-extra -or -path ./tests -or -path ./view/lang -or -path ./view/smarty3 -or -path ./vendor ) -prune -or"
|
||||
FINDOPTS="( -path ./addon -or -path ./addons -or -path ./addons-extra -or -path ./tests -or -path ./view/lang -or -path ./view/smarty3 -or -path ./vendor -or -path ./local -or -path ./avatar -or -path ./proxy ) -prune -or"
|
||||
|
||||
F9KVERSION=$(cat ./VERSION);
|
||||
echo "Friendica version $F9KVERSION"
|
||||
|
|
13
boot.php
|
@ -30,8 +30,8 @@
|
|||
use Friendica\Model\Contact;
|
||||
|
||||
define('FRIENDICA_PLATFORM', 'Friendica');
|
||||
define('FRIENDICA_CODENAME', 'Siberian Iris');
|
||||
define('FRIENDICA_VERSION', '2022.02');
|
||||
define('FRIENDICA_CODENAME', 'Giant Rhubarb');
|
||||
define('FRIENDICA_VERSION', '2022.09-dev');
|
||||
define('DFRN_PROTOCOL_VERSION', '2.23');
|
||||
define('NEW_TABLE_STRUCTURE_VERSION', 1288);
|
||||
|
||||
|
@ -87,8 +87,8 @@ define('PRIORITIES', [PRIORITY_CRITICAL, PRIORITY_HIGH, PRIORITY_MEDIUM, PRIORIT
|
|||
/* @}*/
|
||||
|
||||
// Normally this constant is defined - but not if "pcntl" isn't installed
|
||||
if (!defined("SIGTERM")) {
|
||||
define("SIGTERM", 15);
|
||||
if (!defined('SIGTERM')) {
|
||||
define('SIGTERM', 15);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -117,6 +117,7 @@ function local_user()
|
|||
if (!empty($_SESSION['authenticated']) && !empty($_SESSION['uid'])) {
|
||||
return intval($_SESSION['uid']);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -169,7 +170,7 @@ function remote_user()
|
|||
*
|
||||
* @param string $s - Text of notice
|
||||
*/
|
||||
function notice($s)
|
||||
function notice(string $s)
|
||||
{
|
||||
if (empty($_SESSION)) {
|
||||
return;
|
||||
|
@ -189,7 +190,7 @@ function notice($s)
|
|||
*
|
||||
* @param string $s - Text of notice
|
||||
*/
|
||||
function info($s)
|
||||
function info(string $s)
|
||||
{
|
||||
if (empty($_SESSION)) {
|
||||
return;
|
||||
|
|
|
@ -51,7 +51,7 @@
|
|||
"pragmarx/recovery": "^0.2",
|
||||
"psr/container": "^1.0",
|
||||
"seld/cli-prompt": "^1.0",
|
||||
"smarty/smarty": "^3.1",
|
||||
"smarty/smarty": "^4",
|
||||
"ua-parser/uap-php": "^3.9",
|
||||
"xemlock/htmlpurifier-html5": "^0.1.11",
|
||||
"fxp/composer-asset-plugin": "^1.4",
|
||||
|
|
312
composer.lock
generated
|
@ -4,7 +4,7 @@
|
|||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "3d221e30c9cb7e3f34d8d8141b6fea6c",
|
||||
"content-hash": "f5922f03b367e68a5930df6ed80c5c2f",
|
||||
"packages": [
|
||||
{
|
||||
"name": "asika/simple-console",
|
||||
|
@ -545,12 +545,12 @@
|
|||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"DivineOmega\\PasswordExposed\\": "src/"
|
||||
},
|
||||
"files": [
|
||||
"src/PasswordExposedFunction.php"
|
||||
]
|
||||
],
|
||||
"psr-4": {
|
||||
"DivineOmega\\PasswordExposed\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
|
@ -587,12 +587,12 @@
|
|||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"HTMLPurifier": "library/"
|
||||
},
|
||||
"files": [
|
||||
"library/HTMLPurifier.composer.php"
|
||||
],
|
||||
"psr-0": {
|
||||
"HTMLPurifier": "library/"
|
||||
},
|
||||
"exclude-from-classmap": [
|
||||
"/library/HTMLPurifier/Language/"
|
||||
]
|
||||
|
@ -839,24 +839,24 @@
|
|||
},
|
||||
{
|
||||
"name": "guzzlehttp/guzzle",
|
||||
"version": "6.5.5",
|
||||
"version": "6.5.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/guzzle/guzzle.git",
|
||||
"reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e"
|
||||
"reference": "a52f0440530b54fa079ce76e8c5d196a42cad981"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e",
|
||||
"reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e",
|
||||
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/a52f0440530b54fa079ce76e8c5d196a42cad981",
|
||||
"reference": "a52f0440530b54fa079ce76e8c5d196a42cad981",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-json": "*",
|
||||
"guzzlehttp/promises": "^1.0",
|
||||
"guzzlehttp/psr7": "^1.6.1",
|
||||
"guzzlehttp/psr7": "^1.9",
|
||||
"php": ">=5.5",
|
||||
"symfony/polyfill-intl-idn": "^1.17.0"
|
||||
"symfony/polyfill-intl-idn": "^1.17"
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-curl": "*",
|
||||
|
@ -873,22 +873,52 @@
|
|||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"GuzzleHttp\\": "src/"
|
||||
},
|
||||
"files": [
|
||||
"src/functions_include.php"
|
||||
]
|
||||
],
|
||||
"psr-4": {
|
||||
"GuzzleHttp\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Graham Campbell",
|
||||
"email": "hello@gjcampbell.co.uk",
|
||||
"homepage": "https://github.com/GrahamCampbell"
|
||||
},
|
||||
{
|
||||
"name": "Michael Dowling",
|
||||
"email": "mtdowling@gmail.com",
|
||||
"homepage": "https://github.com/mtdowling"
|
||||
},
|
||||
{
|
||||
"name": "Jeremy Lindblom",
|
||||
"email": "jeremeamia@gmail.com",
|
||||
"homepage": "https://github.com/jeremeamia"
|
||||
},
|
||||
{
|
||||
"name": "George Mponos",
|
||||
"email": "gmponos@gmail.com",
|
||||
"homepage": "https://github.com/gmponos"
|
||||
},
|
||||
{
|
||||
"name": "Tobias Nyholm",
|
||||
"email": "tobias.nyholm@gmail.com",
|
||||
"homepage": "https://github.com/Nyholm"
|
||||
},
|
||||
{
|
||||
"name": "Márk Sági-Kazár",
|
||||
"email": "mark.sagikazar@gmail.com",
|
||||
"homepage": "https://github.com/sagikazarmark"
|
||||
},
|
||||
{
|
||||
"name": "Tobias Schultze",
|
||||
"email": "webmaster@tubo-world.de",
|
||||
"homepage": "https://github.com/Tobion"
|
||||
}
|
||||
],
|
||||
"description": "Guzzle is a PHP HTTP client library",
|
||||
|
@ -902,7 +932,21 @@
|
|||
"rest",
|
||||
"web service"
|
||||
],
|
||||
"time": "2020-06-16T21:01:06+00:00"
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/GrahamCampbell",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/Nyholm",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2022-06-20T22:16:07+00:00"
|
||||
},
|
||||
{
|
||||
"name": "guzzlehttp/promises",
|
||||
|
@ -931,12 +975,12 @@
|
|||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"GuzzleHttp\\Promise\\": "src/"
|
||||
},
|
||||
"files": [
|
||||
"src/functions_include.php"
|
||||
]
|
||||
],
|
||||
"psr-4": {
|
||||
"GuzzleHttp\\Promise\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
|
@ -986,16 +1030,16 @@
|
|||
},
|
||||
{
|
||||
"name": "guzzlehttp/psr7",
|
||||
"version": "1.8.3",
|
||||
"version": "1.9.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/guzzle/psr7.git",
|
||||
"reference": "1afdd860a2566ed3c2b0b4a3de6e23434a79ec85"
|
||||
"reference": "e98e3e6d4f86621a9b75f623996e6bbdeb4b9318"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/guzzle/psr7/zipball/1afdd860a2566ed3c2b0b4a3de6e23434a79ec85",
|
||||
"reference": "1afdd860a2566ed3c2b0b4a3de6e23434a79ec85",
|
||||
"url": "https://api.github.com/repos/guzzle/psr7/zipball/e98e3e6d4f86621a9b75f623996e6bbdeb4b9318",
|
||||
"reference": "e98e3e6d4f86621a9b75f623996e6bbdeb4b9318",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -1016,16 +1060,16 @@
|
|||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.7-dev"
|
||||
"dev-master": "1.9-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"GuzzleHttp\\Psr7\\": "src/"
|
||||
},
|
||||
"files": [
|
||||
"src/functions_include.php"
|
||||
]
|
||||
],
|
||||
"psr-4": {
|
||||
"GuzzleHttp\\Psr7\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
|
@ -1088,7 +1132,7 @@
|
|||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2021-10-05T13:56:00+00:00"
|
||||
"time": "2022-06-20T21:43:03+00:00"
|
||||
},
|
||||
{
|
||||
"name": "league/html-to-markdown",
|
||||
|
@ -1152,6 +1196,24 @@
|
|||
"html",
|
||||
"markdown"
|
||||
],
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://www.colinodell.com/sponsor",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://www.paypal.me/colinpodell/10.00",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/colinodell",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://www.patreon.com/colinodell",
|
||||
"type": "patreon"
|
||||
}
|
||||
],
|
||||
"time": "2020-07-01T00:34:03+00:00"
|
||||
},
|
||||
{
|
||||
|
@ -1453,12 +1515,12 @@
|
|||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"Mobile_Detect.php"
|
||||
],
|
||||
"psr-0": {
|
||||
"Detection": "namespaced/"
|
||||
}
|
||||
},
|
||||
"classmap": [
|
||||
"Mobile_Detect.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
|
@ -1481,6 +1543,12 @@
|
|||
"mobile detector",
|
||||
"php mobile detect"
|
||||
],
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/serbanghita",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2021-02-19T21:22:57+00:00"
|
||||
},
|
||||
{
|
||||
|
@ -1553,6 +1621,16 @@
|
|||
"logging",
|
||||
"psr-3"
|
||||
],
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/Seldaek",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2021-05-28T08:32:12+00:00"
|
||||
},
|
||||
{
|
||||
|
@ -1577,12 +1655,12 @@
|
|||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"FastRoute\\": "src/"
|
||||
},
|
||||
"files": [
|
||||
"src/functions.php"
|
||||
]
|
||||
],
|
||||
"psr-4": {
|
||||
"FastRoute\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
|
@ -3647,29 +3725,29 @@
|
|||
},
|
||||
{
|
||||
"name": "smarty/smarty",
|
||||
"version": "v3.1.43",
|
||||
"version": "v4.1.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/smarty-php/smarty.git",
|
||||
"reference": "273f7e00fec034f6d61112552e9caf08d19565b7"
|
||||
"reference": "9e0536de18b53ba193364291ef0303b0ab9903e1"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/smarty-php/smarty/zipball/273f7e00fec034f6d61112552e9caf08d19565b7",
|
||||
"reference": "273f7e00fec034f6d61112552e9caf08d19565b7",
|
||||
"url": "https://api.github.com/repos/smarty-php/smarty/zipball/9e0536de18b53ba193364291ef0303b0ab9903e1",
|
||||
"reference": "9e0536de18b53ba193364291ef0303b0ab9903e1",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.2"
|
||||
"php": "^7.1 || ^8.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^7.5 || ^6.5 || ^5.7 || ^4.8",
|
||||
"phpunit/phpunit": "^8.5 || ^7.5",
|
||||
"smarty/smarty-lexer": "^3.1"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "3.1.x-dev"
|
||||
"dev-master": "4.0.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
|
@ -3693,14 +3771,18 @@
|
|||
{
|
||||
"name": "Rodney Rehm",
|
||||
"email": "rodney.rehm@medialize.de"
|
||||
},
|
||||
{
|
||||
"name": "Simon Wisselink",
|
||||
"homepage": "https://www.iwink.nl/"
|
||||
}
|
||||
],
|
||||
"description": "Smarty - the compiling PHP template engine",
|
||||
"homepage": "http://www.smarty.net",
|
||||
"homepage": "https://smarty-php.github.io/smarty/",
|
||||
"keywords": [
|
||||
"templating"
|
||||
],
|
||||
"time": "2022-01-10T09:52:40+00:00"
|
||||
"time": "2022-02-06T20:34:27+00:00"
|
||||
},
|
||||
{
|
||||
"name": "spomky-labs/base64url",
|
||||
|
@ -3751,20 +3833,30 @@
|
|||
"safe",
|
||||
"url"
|
||||
],
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/Spomky",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://www.patreon.com/FlorentMorselli",
|
||||
"type": "patreon"
|
||||
}
|
||||
],
|
||||
"time": "2020-11-03T09:10:25+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-intl-idn",
|
||||
"version": "v1.23.0",
|
||||
"version": "v1.26.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-intl-idn.git",
|
||||
"reference": "65bd267525e82759e7d8c4e8ceea44f398838e65"
|
||||
"reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65",
|
||||
"reference": "65bd267525e82759e7d8c4e8ceea44f398838e65",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/59a8d271f00dd0e4c2e518104cc7963f655a1aa8",
|
||||
"reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -3778,7 +3870,7 @@
|
|||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-main": "1.23-dev"
|
||||
"dev-main": "1.26-dev"
|
||||
},
|
||||
"thanks": {
|
||||
"name": "symfony/polyfill",
|
||||
|
@ -3786,12 +3878,12 @@
|
|||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Symfony\\Polyfill\\Intl\\Idn\\": ""
|
||||
},
|
||||
"files": [
|
||||
"bootstrap.php"
|
||||
]
|
||||
],
|
||||
"psr-4": {
|
||||
"Symfony\\Polyfill\\Intl\\Idn\\": ""
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
|
@ -3835,20 +3927,20 @@
|
|||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2021-05-27T09:27:20+00:00"
|
||||
"time": "2022-05-24T11:49:31+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-intl-normalizer",
|
||||
"version": "v1.23.0",
|
||||
"version": "v1.26.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
|
||||
"reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8"
|
||||
"reference": "219aa369ceff116e673852dce47c3a41794c14bd"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8",
|
||||
"reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd",
|
||||
"reference": "219aa369ceff116e673852dce47c3a41794c14bd",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -3860,7 +3952,7 @@
|
|||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-main": "1.23-dev"
|
||||
"dev-main": "1.26-dev"
|
||||
},
|
||||
"thanks": {
|
||||
"name": "symfony/polyfill",
|
||||
|
@ -3868,12 +3960,12 @@
|
|||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Symfony\\Polyfill\\Intl\\Normalizer\\": ""
|
||||
},
|
||||
"files": [
|
||||
"bootstrap.php"
|
||||
],
|
||||
"psr-4": {
|
||||
"Symfony\\Polyfill\\Intl\\Normalizer\\": ""
|
||||
},
|
||||
"classmap": [
|
||||
"Resources/stubs"
|
||||
]
|
||||
|
@ -3916,7 +4008,7 @@
|
|||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2021-02-19T12:13:01+00:00"
|
||||
"time": "2022-05-24T11:49:31+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php56",
|
||||
|
@ -3985,16 +4077,16 @@
|
|||
},
|
||||
{
|
||||
"name": "symfony/polyfill-php72",
|
||||
"version": "v1.23.0",
|
||||
"version": "v1.26.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-php72.git",
|
||||
"reference": "9a142215a36a3888e30d0a9eeea9766764e96976"
|
||||
"reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976",
|
||||
"reference": "9a142215a36a3888e30d0a9eeea9766764e96976",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2",
|
||||
"reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -4003,7 +4095,7 @@
|
|||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-main": "1.23-dev"
|
||||
"dev-main": "1.26-dev"
|
||||
},
|
||||
"thanks": {
|
||||
"name": "symfony/polyfill",
|
||||
|
@ -4011,12 +4103,12 @@
|
|||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Symfony\\Polyfill\\Php72\\": ""
|
||||
},
|
||||
"files": [
|
||||
"bootstrap.php"
|
||||
]
|
||||
],
|
||||
"psr-4": {
|
||||
"Symfony\\Polyfill\\Php72\\": ""
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
|
@ -4054,7 +4146,7 @@
|
|||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2021-05-27T09:17:38+00:00"
|
||||
"time": "2022-05-24T11:49:31+00:00"
|
||||
},
|
||||
{
|
||||
"name": "ua-parser/uap-php",
|
||||
|
@ -4613,6 +4705,20 @@
|
|||
"constructor",
|
||||
"instantiate"
|
||||
],
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://www.doctrine-project.org/sponsorship.html",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://www.patreon.com/phpdoctrine",
|
||||
"type": "patreon"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2020-11-10T18:47:58+00:00"
|
||||
},
|
||||
{
|
||||
|
@ -4803,12 +4909,12 @@
|
|||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"DeepCopy\\": "src/DeepCopy/"
|
||||
},
|
||||
"files": [
|
||||
"src/DeepCopy/deep_copy.php"
|
||||
]
|
||||
],
|
||||
"psr-4": {
|
||||
"DeepCopy\\": "src/DeepCopy/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
|
@ -4822,6 +4928,12 @@
|
|||
"object",
|
||||
"object graph"
|
||||
],
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2020-11-13T09:40:50+00:00"
|
||||
},
|
||||
{
|
||||
|
@ -5550,11 +5662,11 @@
|
|||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
],
|
||||
"files": [
|
||||
"src/Framework/Assert/Functions.php"
|
||||
],
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
|
@ -6518,12 +6630,12 @@
|
|||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Symfony\\Polyfill\\Ctype\\": ""
|
||||
},
|
||||
"files": [
|
||||
"bootstrap.php"
|
||||
]
|
||||
],
|
||||
"psr-4": {
|
||||
"Symfony\\Polyfill\\Ctype\\": ""
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
|
@ -6547,6 +6659,20 @@
|
|||
"polyfill",
|
||||
"portable"
|
||||
],
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://symfony.com/sponsor",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2021-02-19T12:13:01+00:00"
|
||||
},
|
||||
{
|
||||
|
@ -6587,6 +6713,12 @@
|
|||
}
|
||||
],
|
||||
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/theseer",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2021-07-28T10:34:58+00:00"
|
||||
},
|
||||
{
|
||||
|
|
266
database.sql
|
@ -1,6 +1,6 @@
|
|||
-- ------------------------------------------
|
||||
-- Friendica 2022.02 (Siberian Iris)
|
||||
-- DB_UPDATE_VERSION 1449
|
||||
-- Friendica 2022.09-dev (Giant Rhubarb)
|
||||
-- DB_UPDATE_VERSION 1472
|
||||
-- ------------------------------------------
|
||||
|
||||
|
||||
|
@ -16,6 +16,11 @@ CREATE TABLE IF NOT EXISTS `gserver` (
|
|||
`info` text COMMENT '',
|
||||
`register_policy` tinyint NOT NULL DEFAULT 0 COMMENT '',
|
||||
`registered-users` int unsigned NOT NULL DEFAULT 0 COMMENT 'Number of registered users',
|
||||
`active-week-users` int unsigned COMMENT 'Number of active users in the last week',
|
||||
`active-month-users` int unsigned COMMENT 'Number of active users in the last month',
|
||||
`active-halfyear-users` int unsigned COMMENT 'Number of active users in the last six month',
|
||||
`local-posts` int unsigned COMMENT 'Number of local posts',
|
||||
`local-comments` int unsigned COMMENT 'Number of local comments',
|
||||
`directory-type` tinyint DEFAULT 0 COMMENT 'Type of directory service (Poco, Mastodon)',
|
||||
`poco` varchar(255) NOT NULL DEFAULT '' COMMENT '',
|
||||
`noscrape` varchar(255) NOT NULL DEFAULT '' COMMENT '',
|
||||
|
@ -227,6 +232,7 @@ CREATE TABLE IF NOT EXISTS `tag` (
|
|||
`id` int unsigned NOT NULL auto_increment COMMENT '',
|
||||
`name` varchar(96) NOT NULL DEFAULT '' COMMENT '',
|
||||
`url` varbinary(255) NOT NULL DEFAULT '' COMMENT '',
|
||||
`type` tinyint unsigned COMMENT 'Type of the tag (Unknown, General Collection, Follower Collection or Account)',
|
||||
PRIMARY KEY(`id`),
|
||||
UNIQUE INDEX `type_name_url` (`name`,`url`),
|
||||
INDEX `url` (`url`)
|
||||
|
@ -327,6 +333,8 @@ CREATE TABLE IF NOT EXISTS `apcontact` (
|
|||
`inbox` varchar(255) NOT NULL COMMENT '',
|
||||
`outbox` varchar(255) COMMENT '',
|
||||
`sharedinbox` varchar(255) COMMENT '',
|
||||
`featured` varchar(255) COMMENT 'Address for the collection of featured posts',
|
||||
`featured-tags` varchar(255) COMMENT 'Address for the collection of featured tags',
|
||||
`manually-approve` boolean COMMENT '',
|
||||
`discoverable` boolean COMMENT 'Mastodon extension: true if profile is published in their directory',
|
||||
`nick` varchar(255) NOT NULL DEFAULT '' COMMENT '',
|
||||
|
@ -378,6 +386,22 @@ CREATE TABLE IF NOT EXISTS `application` (
|
|||
UNIQUE INDEX `client_id` (`client_id`)
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='OAuth application';
|
||||
|
||||
--
|
||||
-- TABLE application-marker
|
||||
--
|
||||
CREATE TABLE IF NOT EXISTS `application-marker` (
|
||||
`application-id` int unsigned NOT NULL COMMENT '',
|
||||
`uid` mediumint unsigned NOT NULL COMMENT 'Owner User id',
|
||||
`timeline` varchar(64) NOT NULL COMMENT 'Marker (home, notifications)',
|
||||
`last_read_id` varchar(255) COMMENT 'Marker id for the timeline',
|
||||
`version` smallint unsigned COMMENT 'Version number',
|
||||
`updated_at` datetime COMMENT 'creation time',
|
||||
PRIMARY KEY(`application-id`,`uid`,`timeline`),
|
||||
INDEX `uid_id` (`uid`),
|
||||
FOREIGN KEY (`application-id`) REFERENCES `application` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
|
||||
FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Timeline marker';
|
||||
|
||||
--
|
||||
-- TABLE application-token
|
||||
--
|
||||
|
@ -546,6 +570,18 @@ CREATE TABLE IF NOT EXISTS `diaspora-interaction` (
|
|||
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Signed Diaspora Interaction';
|
||||
|
||||
--
|
||||
-- TABLE endpoint
|
||||
--
|
||||
CREATE TABLE IF NOT EXISTS `endpoint` (
|
||||
`url` varbinary(255) NOT NULL COMMENT 'URL of the contact',
|
||||
`type` varchar(20) NOT NULL COMMENT '',
|
||||
`owner-uri-id` int unsigned COMMENT 'Id of the item-uri table entry that contains the apcontact url',
|
||||
PRIMARY KEY(`url`),
|
||||
UNIQUE INDEX `owner-uri-id_type` (`owner-uri-id`,`type`),
|
||||
FOREIGN KEY (`owner-uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='ActivityPub endpoints - used in the ActivityPub implementation';
|
||||
|
||||
--
|
||||
-- TABLE event
|
||||
--
|
||||
|
@ -639,10 +675,13 @@ CREATE TABLE IF NOT EXISTS `group` (
|
|||
`uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'Owner User id',
|
||||
`visible` boolean NOT NULL DEFAULT '0' COMMENT '1 indicates the member list is not private',
|
||||
`deleted` boolean NOT NULL DEFAULT '0' COMMENT '1 indicates the group has been deleted',
|
||||
`cid` int unsigned COMMENT 'Contact id of forum. When this field is filled then the members are synced automatically.',
|
||||
`name` varchar(255) NOT NULL DEFAULT '' COMMENT 'human readable name of group',
|
||||
PRIMARY KEY(`id`),
|
||||
INDEX `uid` (`uid`),
|
||||
FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
INDEX `cid` (`cid`),
|
||||
FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
|
||||
FOREIGN KEY (`cid`) REFERENCES `contact` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='privacy groups, group info';
|
||||
|
||||
--
|
||||
|
@ -689,13 +728,16 @@ CREATE TABLE IF NOT EXISTS `hook` (
|
|||
--
|
||||
CREATE TABLE IF NOT EXISTS `inbox-status` (
|
||||
`url` varbinary(255) NOT NULL COMMENT 'URL of the inbox',
|
||||
`uri-id` int unsigned COMMENT 'Item-uri id of inbox url',
|
||||
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Creation date of this entry',
|
||||
`success` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Date of the last successful delivery',
|
||||
`failure` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Date of the last failed delivery',
|
||||
`previous` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Previous delivery date',
|
||||
`archive` boolean NOT NULL DEFAULT '0' COMMENT 'Is the inbox archived?',
|
||||
`shared` boolean NOT NULL DEFAULT '0' COMMENT 'Is it a shared inbox?',
|
||||
PRIMARY KEY(`url`)
|
||||
PRIMARY KEY(`url`),
|
||||
INDEX `uri-id` (`uri-id`),
|
||||
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Status of ActivityPub inboxes';
|
||||
|
||||
--
|
||||
|
@ -822,7 +864,7 @@ CREATE TABLE IF NOT EXISTS `notification` (
|
|||
`id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID',
|
||||
`uid` mediumint unsigned COMMENT 'Owner User id',
|
||||
`vid` smallint unsigned COMMENT 'Id of the verb table entry that contains the activity verbs',
|
||||
`type` tinyint unsigned COMMENT '',
|
||||
`type` smallint unsigned COMMENT '',
|
||||
`actor-id` int unsigned COMMENT 'Link to the contact table with uid=0 of the actor that caused the notification',
|
||||
`target-uri-id` int unsigned COMMENT 'Item-uri id of the related post',
|
||||
`parent-uri-id` int unsigned COMMENT 'Item-uri id of the parent of the related post',
|
||||
|
@ -874,7 +916,7 @@ CREATE TABLE IF NOT EXISTS `notify` (
|
|||
FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE,
|
||||
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
|
||||
FOREIGN KEY (`parent-uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='notifications';
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='[Deprecated] User notifications';
|
||||
|
||||
--
|
||||
-- TABLE notify-threads
|
||||
|
@ -1045,13 +1087,24 @@ CREATE TABLE IF NOT EXISTS `post-category` (
|
|||
`type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
|
||||
`tid` int unsigned NOT NULL DEFAULT 0 COMMENT '',
|
||||
PRIMARY KEY(`uri-id`,`uid`,`type`,`tid`),
|
||||
INDEX `uri-id` (`tid`),
|
||||
INDEX `uid` (`uid`),
|
||||
INDEX `tid` (`tid`),
|
||||
INDEX `uid_uri-id` (`uid`,`uri-id`),
|
||||
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 (`tid`) REFERENCES `tag` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='post relation to categories';
|
||||
|
||||
--
|
||||
-- TABLE post-collection
|
||||
--
|
||||
CREATE TABLE IF NOT EXISTS `post-collection` (
|
||||
`uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
|
||||
`type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '0 - Featured',
|
||||
PRIMARY KEY(`uri-id`,`type`),
|
||||
INDEX `type` (`type`),
|
||||
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Collection of posts';
|
||||
|
||||
--
|
||||
-- TABLE post-content
|
||||
--
|
||||
|
@ -1080,6 +1133,25 @@ CREATE TABLE IF NOT EXISTS `post-content` (
|
|||
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Content for all posts';
|
||||
|
||||
--
|
||||
-- TABLE post-delivery
|
||||
--
|
||||
CREATE TABLE IF NOT EXISTS `post-delivery` (
|
||||
`uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
|
||||
`inbox-id` int unsigned NOT NULL COMMENT 'Item-uri id of inbox url',
|
||||
`uid` mediumint unsigned COMMENT 'Delivering user',
|
||||
`created` datetime DEFAULT '0001-01-01 00:00:00' COMMENT '',
|
||||
`command` varbinary(32) COMMENT '',
|
||||
`failed` tinyint DEFAULT 0 COMMENT 'Number of times the delivery has failed',
|
||||
`receivers` mediumtext COMMENT 'JSON encoded array with the receiving contacts',
|
||||
PRIMARY KEY(`uri-id`,`inbox-id`),
|
||||
INDEX `inbox-id_created` (`inbox-id`,`created`),
|
||||
INDEX `uid` (`uid`),
|
||||
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
|
||||
FOREIGN KEY (`inbox-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
|
||||
FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Delivery data for posts for the batch processing';
|
||||
|
||||
--
|
||||
-- TABLE post-delivery-data
|
||||
--
|
||||
|
@ -1099,6 +1171,32 @@ CREATE TABLE IF NOT EXISTS `post-delivery-data` (
|
|||
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Delivery data for items';
|
||||
|
||||
--
|
||||
-- TABLE post-history
|
||||
--
|
||||
CREATE TABLE IF NOT EXISTS `post-history` (
|
||||
`uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
|
||||
`edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Date of edit',
|
||||
`title` varchar(255) NOT NULL DEFAULT '' COMMENT 'item title',
|
||||
`content-warning` varchar(255) NOT NULL DEFAULT '' COMMENT '',
|
||||
`body` mediumtext COMMENT 'item body content',
|
||||
`raw-body` mediumtext COMMENT 'Body without embedded media links',
|
||||
`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',
|
||||
`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',
|
||||
`object-type` varchar(100) NOT NULL DEFAULT '' COMMENT 'ActivityStreams object type',
|
||||
`object` text COMMENT 'JSON encoded object structure unless it is an implied object (normal post)',
|
||||
`target-type` varchar(100) NOT NULL DEFAULT '' COMMENT 'ActivityStreams target type if applicable (URI)',
|
||||
`target` text COMMENT 'JSON encoded target structure if used',
|
||||
`resource-id` varchar(32) NOT NULL DEFAULT '' COMMENT 'Used to link other tables to items, it identifies the linked resource (e.g. photo) and if set must also set resource_type',
|
||||
`plink` varchar(255) NOT NULL DEFAULT '' COMMENT 'permalink or URL to a displayable copy of the message at its source',
|
||||
PRIMARY KEY(`uri-id`,`edited`),
|
||||
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Post history';
|
||||
|
||||
--
|
||||
-- TABLE post-link
|
||||
--
|
||||
|
@ -1118,13 +1216,13 @@ CREATE TABLE IF NOT EXISTS `post-link` (
|
|||
CREATE TABLE IF NOT EXISTS `post-media` (
|
||||
`id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID',
|
||||
`uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
|
||||
`url` varbinary(511) NOT NULL COMMENT 'Media URL',
|
||||
`url` varbinary(1024) NOT NULL COMMENT 'Media URL',
|
||||
`type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'Media type',
|
||||
`mimetype` varchar(60) COMMENT '',
|
||||
`height` smallint unsigned COMMENT 'Height of the media',
|
||||
`width` smallint unsigned COMMENT 'Width of the media',
|
||||
`size` int unsigned COMMENT 'Media size',
|
||||
`preview` varbinary(255) COMMENT 'Preview URL',
|
||||
`size` bigint unsigned COMMENT 'Media size',
|
||||
`preview` varbinary(512) COMMENT 'Preview URL',
|
||||
`preview-height` smallint unsigned COMMENT 'Height of the preview picture',
|
||||
`preview-width` smallint unsigned COMMENT 'Width of the preview picture',
|
||||
`description` text COMMENT '',
|
||||
|
@ -1136,10 +1234,37 @@ CREATE TABLE IF NOT EXISTS `post-media` (
|
|||
`publisher-name` varchar(255) COMMENT 'Name of the publisher of the media',
|
||||
`publisher-image` varbinary(255) COMMENT 'Image of the publisher of the media',
|
||||
PRIMARY KEY(`id`),
|
||||
UNIQUE INDEX `uri-id-url` (`uri-id`,`url`),
|
||||
UNIQUE INDEX `uri-id-url` (`uri-id`,`url`(512)),
|
||||
INDEX `uri-id-id` (`uri-id`,`id`),
|
||||
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Attached media';
|
||||
|
||||
--
|
||||
-- TABLE post-question
|
||||
--
|
||||
CREATE TABLE IF NOT EXISTS `post-question` (
|
||||
`id` int unsigned NOT NULL auto_increment COMMENT 'sequential ID',
|
||||
`uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
|
||||
`multiple` boolean NOT NULL DEFAULT '0' COMMENT 'Multiple choice',
|
||||
`voters` int unsigned COMMENT 'Number of voters for this question',
|
||||
`end-time` datetime DEFAULT '0001-01-01 00:00:00' COMMENT 'Question end time',
|
||||
PRIMARY KEY(`id`),
|
||||
UNIQUE INDEX `uri-id` (`uri-id`),
|
||||
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Question';
|
||||
|
||||
--
|
||||
-- TABLE post-question-option
|
||||
--
|
||||
CREATE TABLE IF NOT EXISTS `post-question-option` (
|
||||
`id` int unsigned NOT NULL COMMENT 'Id of the question',
|
||||
`uri-id` int unsigned NOT NULL COMMENT 'Id of the item-uri table entry that contains the item uri',
|
||||
`name` varchar(255) COMMENT 'Name of the option',
|
||||
`replies` int unsigned COMMENT 'Number of replies for this question option',
|
||||
PRIMARY KEY(`uri-id`,`id`),
|
||||
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE
|
||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Question option';
|
||||
|
||||
--
|
||||
-- TABLE post-tag
|
||||
--
|
||||
|
@ -1263,13 +1388,13 @@ CREATE TABLE IF NOT EXISTS `post-thread-user` (
|
|||
`changed` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Date that something in the conversation changed, indicating clients should fetch the conversation again',
|
||||
`commented` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
|
||||
`uid` mediumint unsigned NOT NULL DEFAULT 0 COMMENT 'Owner id which owns this copy of the item',
|
||||
`pinned` boolean NOT NULL DEFAULT '0' COMMENT 'The thread is pinned on the profile page',
|
||||
`pinned` boolean NOT NULL DEFAULT '0' COMMENT 'deprecated',
|
||||
`starred` boolean NOT NULL DEFAULT '0' COMMENT '',
|
||||
`ignored` boolean NOT NULL DEFAULT '0' COMMENT 'Ignore updates for this thread',
|
||||
`wall` boolean NOT NULL DEFAULT '0' COMMENT 'This item was posted to the wall of uid',
|
||||
`mention` boolean NOT NULL DEFAULT '0' COMMENT '',
|
||||
`pubmail` boolean NOT NULL DEFAULT '0' COMMENT '',
|
||||
`forum_mode` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
|
||||
`forum_mode` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'Deprecated',
|
||||
`contact-id` int unsigned NOT NULL DEFAULT 0 COMMENT 'contact.id',
|
||||
`unseen` boolean NOT NULL DEFAULT '1' COMMENT 'post has not been seen',
|
||||
`hidden` boolean NOT NULL DEFAULT '0' COMMENT 'Marker to hide the post from the user',
|
||||
|
@ -1288,7 +1413,6 @@ CREATE TABLE IF NOT EXISTS `post-thread-user` (
|
|||
INDEX `commented` (`commented`),
|
||||
INDEX `uid_received` (`uid`,`received`),
|
||||
INDEX `uid_wall_received` (`uid`,`wall`,`received`),
|
||||
INDEX `uid_pinned` (`uid`,`pinned`),
|
||||
INDEX `uid_commented` (`uid`,`commented`),
|
||||
INDEX `uid_starred` (`uid`,`starred`),
|
||||
INDEX `uid_mention` (`uid`,`mention`),
|
||||
|
@ -1308,7 +1432,7 @@ CREATE TABLE IF NOT EXISTS `post-thread-user` (
|
|||
CREATE TABLE IF NOT EXISTS `post-user-notification` (
|
||||
`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',
|
||||
`notification-type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '',
|
||||
`notification-type` smallint unsigned NOT NULL DEFAULT 0 COMMENT '',
|
||||
PRIMARY KEY(`uid`,`uri-id`),
|
||||
INDEX `uri-id` (`uri-id`),
|
||||
FOREIGN KEY (`uri-id`) REFERENCES `item-uri` (`id`) ON UPDATE RESTRICT ON DELETE CASCADE,
|
||||
|
@ -1516,6 +1640,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',
|
||||
`is-blocked` boolean COMMENT 'User is blocked by this contact',
|
||||
`pending` boolean COMMENT '',
|
||||
`rel` tinyint unsigned COMMENT 'The kind of the relation between the user and the contact',
|
||||
`info` mediumtext COMMENT '',
|
||||
|
@ -1599,14 +1724,13 @@ CREATE VIEW `post-user-view` AS SELECT
|
|||
`post-thread-user`.`pubmail` AS `pubmail`,
|
||||
`post-user`.`visible` AS `visible`,
|
||||
`post-thread-user`.`starred` AS `starred`,
|
||||
`post-thread-user`.`pinned` AS `pinned`,
|
||||
`post-user`.`unseen` AS `unseen`,
|
||||
`post-user`.`deleted` AS `deleted`,
|
||||
`post-user`.`origin` AS `origin`,
|
||||
`post-thread-user`.`origin` AS `parent-origin`,
|
||||
`post-thread-user`.`forum_mode` AS `forum_mode`,
|
||||
`post-thread-user`.`mention` AS `mention`,
|
||||
`post-user`.`global` AS `global`,
|
||||
EXISTS(SELECT `type` FROM `post-collection` WHERE `type` = 0 AND `uri-id` = `post-user`.`uri-id`) AS `featured`,
|
||||
`post-user`.`network` AS `network`,
|
||||
`post-user`.`vid` AS `vid`,
|
||||
`post-user`.`psid` AS `psid`,
|
||||
|
@ -1628,6 +1752,7 @@ CREATE VIEW `post-user-view` AS SELECT
|
|||
`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`,
|
||||
|
@ -1652,6 +1777,7 @@ CREATE VIEW `post-user-view` AS SELECT
|
|||
`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`,
|
||||
|
@ -1660,7 +1786,10 @@ CREATE VIEW `post-user-view` AS SELECT
|
|||
`author`.`network` AS `author-network`,
|
||||
`author`.`blocked` AS `author-blocked`,
|
||||
`author`.`hidden` AS `author-hidden`,
|
||||
`author`.`updated` AS `author-updated`,
|
||||
`author`.`gsid` AS `author-gsid`,
|
||||
`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`,
|
||||
|
@ -1669,8 +1798,10 @@ CREATE VIEW `post-user-view` AS SELECT
|
|||
`owner`.`network` AS `owner-network`,
|
||||
`owner`.`blocked` AS `owner-blocked`,
|
||||
`owner`.`hidden` AS `owner-hidden`,
|
||||
`owner`.`updated` AS `owner-updated`,
|
||||
`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`,
|
||||
|
@ -1700,6 +1831,12 @@ CREATE VIEW `post-user-view` AS SELECT
|
|||
`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-user`.`uri-id` AND `post-category`.`uid` = `post-user`.`uid`) AS `has-categories`,
|
||||
EXISTS(SELECT `id` FROM `post-media` WHERE `post-media`.`uri-id` = `post-user`.`uri-id`) AS `has-media`,
|
||||
`diaspora-interaction`.`interaction` AS `signed_text`,
|
||||
`parent-item-uri`.`guid` AS `parent-guid`,
|
||||
`parent-post`.`network` AS `parent-network`,
|
||||
|
@ -1725,6 +1862,7 @@ CREATE VIEW `post-user-view` AS SELECT
|
|||
LEFT JOIN `diaspora-interaction` ON `diaspora-interaction`.`uri-id` = `post-user`.`uri-id`
|
||||
LEFT JOIN `post-content` ON `post-content`.`uri-id` = `post-user`.`uri-id`
|
||||
LEFT JOIN `post-delivery-data` ON `post-delivery-data`.`uri-id` = `post-user`.`uri-id` AND `post-user`.`origin`
|
||||
LEFT JOIN `post-question` ON `post-question`.`uri-id` = `post-user`.`uri-id`
|
||||
LEFT JOIN `permissionset` ON `permissionset`.`id` = `post-user`.`psid`
|
||||
LEFT JOIN `post-user` AS `parent-post` ON `parent-post`.`uri-id` = `post-user`.`parent-uri-id` AND `parent-post`.`uid` = `post-user`.`uid`
|
||||
LEFT JOIN `contact` AS `parent-post-author` ON `parent-post-author`.`id` = `parent-post`.`author-id`;
|
||||
|
@ -1761,13 +1899,12 @@ CREATE VIEW `post-thread-user-view` AS SELECT
|
|||
`post-thread-user`.`ignored` AS `ignored`,
|
||||
`post-user`.`visible` AS `visible`,
|
||||
`post-thread-user`.`starred` AS `starred`,
|
||||
`post-thread-user`.`pinned` AS `pinned`,
|
||||
`post-thread-user`.`unseen` AS `unseen`,
|
||||
`post-user`.`deleted` AS `deleted`,
|
||||
`post-thread-user`.`origin` AS `origin`,
|
||||
`post-thread-user`.`forum_mode` AS `forum_mode`,
|
||||
`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-user`.`vid` AS `vid`,
|
||||
`post-thread-user`.`psid` AS `psid`,
|
||||
|
@ -1789,6 +1926,7 @@ CREATE VIEW `post-thread-user-view` AS SELECT
|
|||
`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`,
|
||||
|
@ -1813,6 +1951,7 @@ CREATE VIEW `post-thread-user-view` AS SELECT
|
|||
`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`,
|
||||
|
@ -1821,7 +1960,10 @@ CREATE VIEW `post-thread-user-view` AS SELECT
|
|||
`author`.`network` AS `author-network`,
|
||||
`author`.`blocked` AS `author-blocked`,
|
||||
`author`.`hidden` AS `author-hidden`,
|
||||
`author`.`updated` AS `author-updated`,
|
||||
`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`,
|
||||
|
@ -1830,8 +1972,10 @@ CREATE VIEW `post-thread-user-view` AS SELECT
|
|||
`owner`.`network` AS `owner-network`,
|
||||
`owner`.`blocked` AS `owner-blocked`,
|
||||
`owner`.`hidden` AS `owner-hidden`,
|
||||
`owner`.`updated` AS `owner-updated`,
|
||||
`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`,
|
||||
|
@ -1861,6 +2005,12 @@ CREATE VIEW `post-thread-user-view` AS SELECT
|
|||
`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`,
|
||||
`parent-post`.`network` AS `parent-network`,
|
||||
|
@ -1885,6 +2035,7 @@ CREATE VIEW `post-thread-user-view` AS SELECT
|
|||
LEFT JOIN `diaspora-interaction` ON `diaspora-interaction`.`uri-id` = `post-thread-user`.`uri-id`
|
||||
LEFT JOIN `post-content` ON `post-content`.`uri-id` = `post-thread-user`.`uri-id`
|
||||
LEFT JOIN `post-delivery-data` ON `post-delivery-data`.`uri-id` = `post-thread-user`.`uri-id` AND `post-thread-user`.`origin`
|
||||
LEFT JOIN `post-question` ON `post-question`.`uri-id` = `post-thread-user`.`uri-id`
|
||||
LEFT JOIN `permissionset` ON `permissionset`.`id` = `post-thread-user`.`psid`
|
||||
LEFT JOIN `post-user` AS `parent-post` ON `parent-post`.`uri-id` = `post-user`.`parent-uri-id` AND `parent-post`.`uid` = `post-thread-user`.`uid`
|
||||
LEFT JOIN `contact` AS `parent-post-author` ON `parent-post-author`.`id` = `parent-post`.`author-id`;
|
||||
|
@ -1914,6 +2065,7 @@ CREATE VIEW `post-view` AS SELECT
|
|||
`post`.`visible` AS `visible`,
|
||||
`post`.`deleted` AS `deleted`,
|
||||
`post`.`global` AS `global`,
|
||||
EXISTS(SELECT `type` FROM `post-collection` WHERE `type` = 0 AND `uri-id` = `post`.`uri-id`) AS `featured`,
|
||||
`post`.`network` AS `network`,
|
||||
`post`.`vid` AS `vid`,
|
||||
IF (`post`.`vid` IS NULL, '', `verb`.`name`) AS `verb`,
|
||||
|
@ -1934,6 +2086,7 @@ CREATE VIEW `post-view` AS SELECT
|
|||
`post-content`.`target` AS `target`,
|
||||
`post-content`.`resource-id` AS `resource-id`,
|
||||
`post`.`author-id` AS `contact-id`,
|
||||
`author`.`uri-id` AS `contact-uri-id`,
|
||||
`author`.`url` AS `contact-link`,
|
||||
`author`.`addr` AS `contact-addr`,
|
||||
`author`.`name` AS `contact-name`,
|
||||
|
@ -1958,6 +2111,7 @@ CREATE VIEW `post-view` AS SELECT
|
|||
`author`.`avatar-date` AS `avatar-date`,
|
||||
`author`.`thumb` AS `thumb`,
|
||||
`post`.`author-id` AS `author-id`,
|
||||
`author`.`uri-id` AS `author-uri-id`,
|
||||
`author`.`url` AS `author-link`,
|
||||
`author`.`addr` AS `author-addr`,
|
||||
`author`.`name` AS `author-name`,
|
||||
|
@ -1966,7 +2120,10 @@ CREATE VIEW `post-view` AS SELECT
|
|||
`author`.`network` AS `author-network`,
|
||||
`author`.`blocked` AS `author-blocked`,
|
||||
`author`.`hidden` AS `author-hidden`,
|
||||
`author`.`updated` AS `author-updated`,
|
||||
`author`.`gsid` AS `author-gsid`,
|
||||
`post`.`owner-id` AS `owner-id`,
|
||||
`owner`.`uri-id` AS `owner-uri-id`,
|
||||
`owner`.`url` AS `owner-link`,
|
||||
`owner`.`addr` AS `owner-addr`,
|
||||
`owner`.`name` AS `owner-name`,
|
||||
|
@ -1975,8 +2132,10 @@ CREATE VIEW `post-view` AS SELECT
|
|||
`owner`.`network` AS `owner-network`,
|
||||
`owner`.`blocked` AS `owner-blocked`,
|
||||
`owner`.`hidden` AS `owner-hidden`,
|
||||
`owner`.`updated` AS `owner-updated`,
|
||||
`owner`.`contact-type` AS `owner-contact-type`,
|
||||
`post`.`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`,
|
||||
|
@ -1986,6 +2145,12 @@ CREATE VIEW `post-view` AS SELECT
|
|||
`causer`.`blocked` AS `causer-blocked`,
|
||||
`causer`.`hidden` AS `causer-hidden`,
|
||||
`causer`.`contact-type` AS `causer-contact-type`,
|
||||
`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`,
|
||||
0 AS `has-categories`,
|
||||
EXISTS(SELECT `id` FROM `post-media` WHERE `post-media`.`uri-id` = `post`.`uri-id`) AS `has-media`,
|
||||
`diaspora-interaction`.`interaction` AS `signed_text`,
|
||||
`parent-item-uri`.`guid` AS `parent-guid`,
|
||||
`parent-post`.`network` AS `parent-network`,
|
||||
|
@ -2007,6 +2172,7 @@ CREATE VIEW `post-view` AS SELECT
|
|||
LEFT JOIN `verb` ON `verb`.`id` = `post`.`vid`
|
||||
LEFT JOIN `diaspora-interaction` ON `diaspora-interaction`.`uri-id` = `post`.`uri-id`
|
||||
LEFT JOIN `post-content` ON `post-content`.`uri-id` = `post`.`uri-id`
|
||||
LEFT JOIN `post-question` ON `post-question`.`uri-id` = `post`.`uri-id`
|
||||
LEFT JOIN `post` AS `parent-post` ON `parent-post`.`uri-id` = `post`.`parent-uri-id`
|
||||
LEFT JOIN `contact` AS `parent-post-author` ON `parent-post-author`.`id` = `parent-post`.`author-id`;
|
||||
|
||||
|
@ -2035,6 +2201,7 @@ CREATE VIEW `post-thread-view` AS SELECT
|
|||
`post`.`visible` AS `visible`,
|
||||
`post`.`deleted` AS `deleted`,
|
||||
`post`.`global` AS `global`,
|
||||
EXISTS(SELECT `type` FROM `post-collection` WHERE `type` = 0 AND `uri-id` = `post-thread`.`uri-id`) AS `featured`,
|
||||
`post-thread`.`network` AS `network`,
|
||||
`post`.`vid` AS `vid`,
|
||||
IF (`post`.`vid` IS NULL, '', `verb`.`name`) AS `verb`,
|
||||
|
@ -2055,6 +2222,7 @@ CREATE VIEW `post-thread-view` AS SELECT
|
|||
`post-content`.`target` AS `target`,
|
||||
`post-content`.`resource-id` AS `resource-id`,
|
||||
`post-thread`.`author-id` AS `contact-id`,
|
||||
`author`.`uri-id` AS `contact-uri-id`,
|
||||
`author`.`url` AS `contact-link`,
|
||||
`author`.`addr` AS `contact-addr`,
|
||||
`author`.`name` AS `contact-name`,
|
||||
|
@ -2079,6 +2247,7 @@ CREATE VIEW `post-thread-view` AS SELECT
|
|||
`author`.`avatar-date` AS `avatar-date`,
|
||||
`author`.`thumb` AS `thumb`,
|
||||
`post-thread`.`author-id` AS `author-id`,
|
||||
`author`.`uri-id` AS `author-uri-id`,
|
||||
`author`.`url` AS `author-link`,
|
||||
`author`.`addr` AS `author-addr`,
|
||||
`author`.`name` AS `author-name`,
|
||||
|
@ -2087,7 +2256,10 @@ CREATE VIEW `post-thread-view` AS SELECT
|
|||
`author`.`network` AS `author-network`,
|
||||
`author`.`blocked` AS `author-blocked`,
|
||||
`author`.`hidden` AS `author-hidden`,
|
||||
`author`.`updated` AS `author-updated`,
|
||||
`author`.`gsid` AS `author-gsid`,
|
||||
`post-thread`.`owner-id` AS `owner-id`,
|
||||
`owner`.`uri-id` AS `owner-uri-id`,
|
||||
`owner`.`url` AS `owner-link`,
|
||||
`owner`.`addr` AS `owner-addr`,
|
||||
`owner`.`name` AS `owner-name`,
|
||||
|
@ -2096,8 +2268,10 @@ CREATE VIEW `post-thread-view` AS SELECT
|
|||
`owner`.`network` AS `owner-network`,
|
||||
`owner`.`blocked` AS `owner-blocked`,
|
||||
`owner`.`hidden` AS `owner-hidden`,
|
||||
`owner`.`updated` AS `owner-updated`,
|
||||
`owner`.`contact-type` AS `owner-contact-type`,
|
||||
`post-thread`.`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`,
|
||||
|
@ -2107,6 +2281,12 @@ CREATE VIEW `post-thread-view` AS SELECT
|
|||
`causer`.`blocked` AS `causer-blocked`,
|
||||
`causer`.`hidden` AS `causer-hidden`,
|
||||
`causer`.`contact-type` AS `causer-contact-type`,
|
||||
`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`,
|
||||
0 AS `has-categories`,
|
||||
EXISTS(SELECT `id` FROM `post-media` WHERE `post-media`.`uri-id` = `post-thread`.`uri-id`) AS `has-media`,
|
||||
`diaspora-interaction`.`interaction` AS `signed_text`,
|
||||
`parent-item-uri`.`guid` AS `parent-guid`,
|
||||
`parent-post`.`network` AS `parent-network`,
|
||||
|
@ -2128,6 +2308,7 @@ CREATE VIEW `post-thread-view` AS SELECT
|
|||
LEFT JOIN `verb` ON `verb`.`id` = `post`.`vid`
|
||||
LEFT JOIN `diaspora-interaction` ON `diaspora-interaction`.`uri-id` = `post-thread`.`uri-id`
|
||||
LEFT JOIN `post-content` ON `post-content`.`uri-id` = `post-thread`.`uri-id`
|
||||
LEFT JOIN `post-question` ON `post-question`.`uri-id` = `post-thread`.`uri-id`
|
||||
LEFT JOIN `post` AS `parent-post` ON `parent-post`.`uri-id` = `post`.`parent-uri-id`
|
||||
LEFT JOIN `contact` AS `parent-post-author` ON `parent-post-author`.`id` = `parent-post`.`author-id`;
|
||||
|
||||
|
@ -2145,6 +2326,27 @@ CREATE VIEW `category-view` AS SELECT
|
|||
FROM `post-category`
|
||||
LEFT JOIN `tag` ON `post-category`.`tid` = `tag`.`id`;
|
||||
|
||||
--
|
||||
-- VIEW collection-view
|
||||
--
|
||||
DROP VIEW IF EXISTS `collection-view`;
|
||||
CREATE VIEW `collection-view` AS SELECT
|
||||
`post-collection`.`uri-id` AS `uri-id`,
|
||||
`post-collection`.`type` AS `type`,
|
||||
`post`.`author-id` AS `cid`,
|
||||
`post`.`received` AS `received`,
|
||||
`post`.`created` AS `created`,
|
||||
`post-thread`.`commented` AS `commented`,
|
||||
`post`.`private` AS `private`,
|
||||
`post`.`visible` AS `visible`,
|
||||
`post`.`deleted` AS `deleted`,
|
||||
`post`.`thr-parent-id` AS `thr-parent-id`,
|
||||
`post`.`author-id` AS `author-id`,
|
||||
`post`.`gravity` AS `gravity`
|
||||
FROM `post-collection`
|
||||
INNER JOIN `post` ON `post-collection`.`uri-id` = `post`.`uri-id`
|
||||
INNER JOIN `post-thread` ON `post-thread`.`uri-id` = `post`.`parent-uri-id`;
|
||||
|
||||
--
|
||||
-- VIEW tag-view
|
||||
--
|
||||
|
@ -2155,7 +2357,8 @@ CREATE VIEW `tag-view` AS SELECT
|
|||
`post-tag`.`tid` AS `tid`,
|
||||
`post-tag`.`cid` AS `cid`,
|
||||
CASE `cid` WHEN 0 THEN `tag`.`name` ELSE `contact`.`name` END AS `name`,
|
||||
CASE `cid` WHEN 0 THEN `tag`.`url` ELSE `contact`.`url` END AS `url`
|
||||
CASE `cid` WHEN 0 THEN `tag`.`url` ELSE `contact`.`url` END AS `url`,
|
||||
CASE `cid` WHEN 0 THEN `tag`.`type` ELSE 1 END AS `tag-type`
|
||||
FROM `post-tag`
|
||||
LEFT JOIN `tag` ON `post-tag`.`tid` = `tag`.`id`
|
||||
LEFT JOIN `contact` ON `post-tag`.`cid` = `contact`.`id`;
|
||||
|
@ -2406,10 +2609,8 @@ CREATE VIEW `account-view` AS SELECT
|
|||
`contact`.`archive` AS `archive`,
|
||||
`contact`.`deleted` AS `deleted`,
|
||||
`contact`.`blocked` AS `blocked`,
|
||||
`contact`.`request` AS `dfrn-request`,
|
||||
`contact`.`notify` AS `dfrn-notify`,
|
||||
`contact`.`poll` AS `dfrn-poll`,
|
||||
`contact`.`confirm` AS `dfrn-confirm`,
|
||||
`fcontact`.`guid` AS `diaspora-guid`,
|
||||
`fcontact`.`batch` AS `diaspora-batch`,
|
||||
`fcontact`.`notify` AS `diaspora-notify`,
|
||||
|
@ -2425,11 +2626,15 @@ CREATE VIEW `account-view` AS SELECT
|
|||
`apcontact`.`generator` AS `ap-generator`,
|
||||
`apcontact`.`following_count` AS `ap-following_count`,
|
||||
`apcontact`.`followers_count` AS `ap-followers_count`,
|
||||
`apcontact`.`statuses_count` AS `ap-statuses_count`
|
||||
`apcontact`.`statuses_count` AS `ap-statuses_count`,
|
||||
`gserver`.`site_name` AS `site_name`,
|
||||
`gserver`.`platform` AS `platform`,
|
||||
`gserver`.`version` AS `version`
|
||||
FROM `contact`
|
||||
LEFT JOIN `item-uri` ON `item-uri`.`id` = `contact`.`uri-id`
|
||||
LEFT JOIN `apcontact` ON `apcontact`.`uri-id` = `contact`.`uri-id`
|
||||
LEFT JOIN `fcontact` ON `fcontact`.`uri-id` = contact.`uri-id`
|
||||
LEFT JOIN `gserver` ON `gserver`.`id` = contact.`gsid`
|
||||
WHERE `contact`.`uid` = 0;
|
||||
|
||||
--
|
||||
|
@ -2505,15 +2710,16 @@ CREATE VIEW `account-user-view` AS SELECT
|
|||
`ucontact`.`subhub` AS `subhub`,
|
||||
`ucontact`.`hub-verify` AS `hub-verify`,
|
||||
`ucontact`.`reason` AS `reason`,
|
||||
`contact`.`request` AS `dfrn-request`,
|
||||
`contact`.`notify` AS `dfrn-notify`,
|
||||
`contact`.`poll` AS `dfrn-poll`,
|
||||
`contact`.`confirm` AS `dfrn-confirm`,
|
||||
`fcontact`.`guid` AS `diaspora-guid`,
|
||||
`fcontact`.`batch` AS `diaspora-batch`,
|
||||
`fcontact`.`notify` AS `diaspora-notify`,
|
||||
`fcontact`.`poll` AS `diaspora-poll`,
|
||||
`fcontact`.`alias` AS `diaspora-alias`,
|
||||
`fcontact`.`interacting_count` AS `diaspora-interacting_count`,
|
||||
`fcontact`.`interacted_count` AS `diaspora-interacted_count`,
|
||||
`fcontact`.`post_count` AS `diaspora-post_count`,
|
||||
`apcontact`.`uuid` AS `ap-uuid`,
|
||||
`apcontact`.`type` AS `ap-type`,
|
||||
`apcontact`.`following` AS `ap-following`,
|
||||
|
@ -2524,12 +2730,16 @@ CREATE VIEW `account-user-view` AS SELECT
|
|||
`apcontact`.`generator` AS `ap-generator`,
|
||||
`apcontact`.`following_count` AS `ap-following_count`,
|
||||
`apcontact`.`followers_count` AS `ap-followers_count`,
|
||||
`apcontact`.`statuses_count` AS `ap-statuses_count`
|
||||
`apcontact`.`statuses_count` AS `ap-statuses_count`,
|
||||
`gserver`.`site_name` AS `site_name`,
|
||||
`gserver`.`platform` AS `platform`,
|
||||
`gserver`.`version` AS `version`
|
||||
FROM `contact` AS `ucontact`
|
||||
INNER JOIN `contact` ON `contact`.`uri-id` = `ucontact`.`uri-id` AND `contact`.`uid` = 0
|
||||
LEFT JOIN `item-uri` ON `item-uri`.`id` = `ucontact`.`uri-id`
|
||||
LEFT JOIN `apcontact` ON `apcontact`.`uri-id` = `ucontact`.`uri-id`
|
||||
LEFT JOIN `fcontact` ON `fcontact`.`uri-id` = `ucontact`.`uri-id` AND `fcontact`.`network` = 'dspr';
|
||||
LEFT JOIN `fcontact` ON `fcontact`.`uri-id` = `ucontact`.`uri-id` AND `fcontact`.`network` = 'dspr'
|
||||
LEFT JOIN `gserver` ON `gserver`.`id` = contact.`gsid`;
|
||||
|
||||
--
|
||||
-- VIEW pending-view
|
||||
|
|
|
@ -74,7 +74,7 @@ These endpoints use the [Mastodon API entities](https://docs.joinmastodon.org/en
|
|||
|
||||
|
||||
- [`GET /api/v1/instance`](https://docs.joinmastodon.org/methods/instance#fetch-instance)
|
||||
- GET /api/v1/instance/rules Undocumented, returns Terms of Service
|
||||
- `GET /api/v1/instance/rules` Undocumented, returns Terms of Service
|
||||
- [`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/)
|
||||
|
@ -84,6 +84,8 @@ These endpoints use the [Mastodon API entities](https://docs.joinmastodon.org/en
|
|||
- [`GET /api/v1/lists/:id/accounts`](https://docs.joinmastodon.org/methods/timelines/lists/)
|
||||
- [`POST /api/v1/lists/:id/accounts`](https://docs.joinmastodon.org/methods/timelines/lists/)
|
||||
- [`DELETE /api/v1/lists/:id/accounts`](https://docs.joinmastodon.org/methods/timelines/lists/)
|
||||
- [`POST /api/v1/markers`](https://docs.joinmastodon.org/methods/timelines/markers/)
|
||||
- [`GET /api/v1/markers`](https://docs.joinmastodon.org/methods/timelines/markers/)
|
||||
- [`POST /api/v1/media`](https://docs.joinmastodon.org/methods/statuses/media/)
|
||||
- [`GET /api/v1/media/:id`](https://docs.joinmastodon.org/methods/statuses/media/)
|
||||
- [`PUT /api/v1/media/:id`](https://docs.joinmastodon.org/methods/statuses/media/)
|
||||
|
@ -92,6 +94,7 @@ These endpoints use the [Mastodon API entities](https://docs.joinmastodon.org/en
|
|||
- [`GET /api/v1/notifications/:id`](https://docs.joinmastodon.org/methods/notifications/)
|
||||
- [`POST /api/v1/notifications/clear`](https://docs.joinmastodon.org/methods/notifications/)
|
||||
- [`POST /api/v1/notifications/:id/dismiss`](https://docs.joinmastodon.org/methods/notifications/)
|
||||
- [`GET /api/v1/polls/:id`](https://docs.joinmastodon.org/methods/statuses/polls/)
|
||||
- [`GET /api/v1/preferences`](https://docs.joinmastodon.org/methods/accounts/preferences/)
|
||||
- [`DELETE /api/v1/push/subscription`](https://docs.joinmastodon.org/methods/notifications/push/)
|
||||
- [`GET /api/v1/push/subscription`](https://docs.joinmastodon.org/methods/notifications/push/)
|
||||
|
@ -102,6 +105,7 @@ These endpoints use the [Mastodon API entities](https://docs.joinmastodon.org/en
|
|||
- [`GET /api/v1/scheduled_statuses/:id`](https://docs.joinmastodon.org/methods/statuses/scheduled_statuses/)
|
||||
- [`GET /api/v1/search`](https://docs.joinmastodon.org/methods/search/)
|
||||
- [`POST /api/v1/statuses`](https://docs.joinmastodon.org/methods/statuses/)
|
||||
- Additionally to the static values `public`, `unlisted` and `private`, the `visibility` parameter can contain a numeric value with a group id.
|
||||
- [`GET /api/v1/statuses/:id`](https://docs.joinmastodon.org/methods/statuses/)
|
||||
- [`DELETE /api/v1/statuses/:id`](https://docs.joinmastodon.org/methods/statuses/)
|
||||
- [`GET /api/v1/statuses/:id/card`](https://docs.joinmastodon.org/methods/statuses/)
|
||||
|
@ -133,6 +137,17 @@ These endpoints use the [Mastodon API entities](https://docs.joinmastodon.org/en
|
|||
These emdpoints are planned to be implemented somewhere in the future.
|
||||
|
||||
- [`PATCH /api/v1/accounts/update_credentials`](https://docs.joinmastodon.org/methods/accounts/)
|
||||
- [`POST /api/v1/accounts/:id/remove_from_followers`](https://github.com/mastodon/mastodon/pull/16864)
|
||||
- [`GET /api/v1/accounts/familiar_followers`](https://github.com/mastodon/mastodon/pull/17700)
|
||||
- [`GET /api/v1/accounts/lookup`](https://github.com/mastodon/mastodon/pull/15740)
|
||||
- [`GET /api/v1/trends/links`](https://github.com/mastodon/mastodon/pull/16917)
|
||||
- [`GET /api/v1/trends/statuses`](https://github.com/mastodon/mastodon/pull/17431)
|
||||
- [`GET /api/v1/trends/tags`](https://github.com/mastodon/mastodon/pull/16917)
|
||||
- [`POST /api/v1/polls/:id/votes`](https://docs.joinmastodon.org/methods/statuses/polls/)
|
||||
- [`GET /api/v1/statuses/{id:\d+}/source`](https://github.com/mastodon/mastodon/pull/16697)
|
||||
- [`GET /api/v1/featured_tags`](https://docs.joinmastodon.org/methods/accounts/featured_tags/)
|
||||
- [`POST /api/v1/featured_tags`](https://docs.joinmastodon.org/methods/accounts/featured_tags/)
|
||||
- [`DELETE /api/v1/featured_tags/:id`](https://docs.joinmastodon.org/methods/accounts/featured_tags/)
|
||||
|
||||
## Dummy endpoints
|
||||
|
||||
|
@ -143,14 +158,13 @@ They refer to features that don't exist in Friendica yet.
|
|||
- [`GET /api/v1/announcements`](https://docs.joinmastodon.org/methods/announcements/)
|
||||
- [`GET /api/v1/endorsements`](https://docs.joinmastodon.org/methods/accounts/endorsements/)
|
||||
- [`GET /api/v1/filters`](https://docs.joinmastodon.org/methods/accounts/filters/)
|
||||
- [`GET /api/v1/markers`](https://docs.joinmastodon.org/methods/timelines/markers/)
|
||||
|
||||
## Non supportable endpoints
|
||||
|
||||
These endpoints won't be implemented at the moment.
|
||||
They refer to features or data that don't exist in Friendica yet.
|
||||
|
||||
- POST /api/meta Misskey API endpoint.
|
||||
- `POST /api/meta` Misskey API endpoint.
|
||||
- [`POST /api/v1/accounts`](https://docs.joinmastodon.org/methods/accounts/)
|
||||
- [`GET /api/v1/accounts/:id/featured_tags`](https://docs.joinmastodon.org/methods/accounts/)
|
||||
- [`POST /api/v1/accounts/:id/pin`](https://docs.joinmastodon.org/methods/accounts/)
|
||||
|
@ -167,9 +181,7 @@ They refer to features or data that don't exist in Friendica yet.
|
|||
- [`GET /api/v1/domain_blocks`](https://docs.joinmastodon.org/methods/accounts/domain_blocks/)
|
||||
- [`POST /api/v1/domain_blocks`](https://docs.joinmastodon.org/methods/accounts/domain_blocks/)
|
||||
- [`DELETE /api/v1/domain_blocks`](https://docs.joinmastodon.org/methods/accounts/domain_blocks/)
|
||||
- [`GET /api/v1/featured_tags`](https://docs.joinmastodon.org/methods/accounts/featured_tags/)
|
||||
- [`POST /api/v1/featured_tags`](https://docs.joinmastodon.org/methods/accounts/featured_tags/)
|
||||
- [`DELETE /api/v1/featured_tags/:id`](https://docs.joinmastodon.org/methods/accounts/featured_tags/)
|
||||
- [`DELETE /api/v1/emails/confirmations`](https://github.com/mastodon/mastodon/pull/15816)
|
||||
- [`GET /api/v1/featured_tags/suggestions`](https://docs.joinmastodon.org/methods/accounts/featured_tags/)
|
||||
- [`GET /api/v1/filters/:id`](https://docs.joinmastodon.org/methods/accounts/filters/)
|
||||
- [`POST /api/v1/filters/:id`](https://docs.joinmastodon.org/methods/accounts/filters/)
|
||||
|
@ -177,9 +189,8 @@ They refer to features or data that don't exist in Friendica yet.
|
|||
- [`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/)
|
||||
- [`GET /api/v1/polls/:id`](https://docs.joinmastodon.org/methods/statuses/polls/)
|
||||
- [`POST /api/v1/polls/:id/votes`](https://docs.joinmastodon.org/methods/statuses/polls/)
|
||||
- [`POST /api/v1/reports`](https://docs.joinmastodon.org/methods/accounts/reports/)
|
||||
- [`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/)
|
||||
- [`DELETE /api/v1/suggestions/:id`](https://docs.joinmastodon.org/methods/accounts/suggestions/)
|
||||
|
|
|
@ -65,7 +65,8 @@ General
|
|||
../network
|
||||
--------
|
||||
* e - Sort by Comment Date
|
||||
* t - Sort by Post Date
|
||||
* t - Sort by Receipt Date
|
||||
* q - Sort by Creation Date
|
||||
* r - Conversation (Posts that mention or involve you)
|
||||
* w - New posts
|
||||
* m - Favourite Posts
|
||||
|
@ -81,6 +82,7 @@ General
|
|||
../settings
|
||||
---------
|
||||
* o - Account
|
||||
* 2 - Two-factor authentication
|
||||
* p - Profiles
|
||||
* t - Additional features
|
||||
* w - Social Networks
|
||||
|
|
|
@ -232,14 +232,6 @@ Please note: body contents are bbcode - not HTML
|
|||
Called when receiving a post from another source. This may also be used to post local activity or system generated messages.
|
||||
`$b` is the item array of information to be stored in the database and the item body is bbcode.
|
||||
|
||||
### settings_form
|
||||
Called when generating the HTML for the user Settings page.
|
||||
`$b` is the HTML string of the settings page before the final `</form>` tag.
|
||||
|
||||
### settings_post
|
||||
Called when the Settings pages are submitted.
|
||||
`$b` is the $_POST array.
|
||||
|
||||
### addon_settings
|
||||
Called when generating the HTML for the addon settings page.
|
||||
`$data` is an array containing:
|
||||
|
@ -626,7 +618,8 @@ Hook data:
|
|||
Called when unfollowing a remote contact on a non-native network (like Twitter)
|
||||
|
||||
Hook data:
|
||||
- **contact** (input): the remote contact (uid = local unfollowing user id) array.
|
||||
- **contact** (input): the target public contact (uid = 0) array.
|
||||
- **uid** (input): the id of the source local user.
|
||||
- **result** (output): wether the unfollowing is successful or not.
|
||||
|
||||
### revoke_follow
|
||||
|
@ -634,7 +627,8 @@ Hook data:
|
|||
Called when making a remote contact on a non-native network (like Twitter) unfollow you.
|
||||
|
||||
Hook data:
|
||||
- **contact** (input): the remote contact (uid = local revoking user id) array.
|
||||
- **contact** (input): the target public contact (uid = 0) array.
|
||||
- **uid** (input): the id of the source local user.
|
||||
- **result** (output): a boolean value indicating wether the operation was successful or not.
|
||||
|
||||
### block
|
||||
|
@ -717,10 +711,6 @@ Here is a complete list of all hook callbacks with file locations (as of 24-Sep-
|
|||
|
||||
Hook::callAll('personal_xrd', $arr);
|
||||
|
||||
### mod/ping.php
|
||||
|
||||
Hook::callAll('network_ping', $arr);
|
||||
|
||||
### mod/parse_url.php
|
||||
|
||||
Hook::callAll("parse_link", $arr);
|
||||
|
@ -752,11 +742,9 @@ Here is a complete list of all hook callbacks with file locations (as of 24-Sep-
|
|||
Hook::callAll('addon_settings_post', $_POST);
|
||||
Hook::callAll('connector_settings_post', $_POST);
|
||||
Hook::callAll('display_settings_post', $_POST);
|
||||
Hook::callAll('settings_post', $_POST);
|
||||
Hook::callAll('addon_settings', $settings_addons);
|
||||
Hook::callAll('connector_settings', $settings_connectors);
|
||||
Hook::callAll('display_settings', $o);
|
||||
Hook::callAll('settings_form', $o);
|
||||
|
||||
### mod/photos.php
|
||||
|
||||
|
@ -863,6 +851,10 @@ 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);
|
||||
|
|
|
@ -65,17 +65,17 @@ table.bbcodes > * > tr > th {
|
|||
<td><a href="http://friendi.ca" target="external-link">Friendica</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>[img]https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.jpg[/img]</td>
|
||||
<td><img src="https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.jpg" alt="Immagine/foto"></td>
|
||||
<td>[img]https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.png[/img]</td>
|
||||
<td><img src="https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.png"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>[img=https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.jpg]The Friendica Logo[/img]</td>
|
||||
<td><img src="https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.jpg" alt="The Friendica Logo"></td>
|
||||
<td>[img=https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.png]The Friendica Logo[/img]</td>
|
||||
<td><img src="https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.png" alt="The Friendica Logo"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>[img=64x32]https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.jpg[/img]<br>
|
||||
<td>[img=64x32]https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica.svg[/img]<br>
|
||||
<br>Note: provided height is simply discarded.</td>
|
||||
<td><img src="https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.jpg" style="width: 64px;"></td>
|
||||
<td><img src="https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica.svg" style="width: 64px;"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>[size=xx-small]small text[/size]</td>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* [Home](help)
|
||||
|
||||
In addition to [move your account](help/Move-Account) you can export and import the list of accounts you follow.
|
||||
The exported list is stored as CSV file that is compatible to the format used by other platforms as e.g. Mastodon or Pleroma.
|
||||
The exported list is stored as CSV file that is compatible to the format used by other platforms as e.g. Mastodon, Misskey or Pleroma.
|
||||
|
||||
## Export of followed Contacts
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ There you will always find the current stable version of friendica.
|
|||
|
||||
Addons are listed at [this page](https://github.com/friendica/friendica-addons).
|
||||
|
||||
If you are searching for new themes, you can find them at [Friendica-Themes.com](http://friendica-themes.com/)
|
||||
If you are searching for new themes, you can find them at [github.com/bkil/friendica-themes](https://github.com/bkil/friendica-themes)
|
||||
|
||||
<a name="adminaccount1"></a>
|
||||
### I've changed my email address now the admin panel is gone?
|
||||
|
|
27
doc/FAQ.md
|
@ -179,19 +179,17 @@ The available features are client specific and may differ.
|
|||
|
||||
* [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))
|
||||
* [B4X for Pleroma & Mastodon](https://github.com/AnywhereSoftware/B4X-Pleroma)
|
||||
* DiCa ([Google Play](https://play.google.com/store/apps/details?id=cool.mixi.dica), last updated 2019)
|
||||
* [Fedi](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://husky.fwgs.ru)
|
||||
* [Roma](https://play.google.com/store/apps/details?id=tech.bigfig.roma)
|
||||
* [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))
|
||||
* [Mastodon for Android](https://github.com/mastodon/mastodon-android) (F-Droid: Pending, [Google-Play](https://play.google.com/store/apps/details?id=org.joinmastodon.android))
|
||||
* [Subway Tooter](https://github.com/tateisu/SubwayTooter)
|
||||
* [Tooot](https://tooot.app/)
|
||||
* [Tusky](https://tusky.app)
|
||||
* [Twidere](https://dimension.im/) ([F-Droid](https://f-droid.org/repository/browse/?fdid=org.mariotaku.twidere), [Google Play](https://play.google.com/store/apps/details?id=com.twidere.twiderex), [GitHub](https://github.com/TwidereProject/Twidere-Android))
|
||||
* [TwidereX](https://github.com/TwidereProject/TwidereX-Android)
|
||||
* [twitlatte](https://github.com/moko256/twitlatte)
|
||||
* [Yuito](https://github.com/accelforce/Yuito)
|
||||
* [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))
|
||||
* [Twidere](https://github.com/TwidereProject/Twidere-Android) ([F-Droid](https://f-droid.org/repository/browse/?fdid=org.mariotaku.twidere), [Google Play](https://play.google.com/store/apps/details?id=com.twidere.twiderex))
|
||||
* [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))
|
||||
* [Yuito](https://github.com/accelforce/Yuito) ([Google Play](https://play.google.com/store/apps/details?id=net.accelf.yuito))
|
||||
|
||||
#### SailfishOS
|
||||
|
||||
|
@ -199,12 +197,11 @@ The available features are client specific and may differ.
|
|||
|
||||
#### iOS
|
||||
|
||||
* [B4X for Pleroma & Mastodon](https://www.b4x.com/) ([AppStore](https://apps.apple.com/app/b4x-pleroma/id1538396871), [GitHub](https://github.com/AnywhereSoftware/B4X-Pleroma))
|
||||
* [B4X for Pleroma & Mastodon](https://github.com/AnywhereSoftware/B4X-Pleroma) ([AppStore](https://apps.apple.com/app/b4x-pleroma/id1538396871))
|
||||
* [Fedi](https://fediapp.com) ([AppStore](https://apps.apple.com/de/app/fedi-for-pleroma-and-mastodon/id1478806281))
|
||||
* [Mastodon](https://joinmastodon.org/apps)([AppStore](https://apps.apple.com/us/app/mastodon-for-iphone/id1571998974))
|
||||
* [Roma](https://www.roma.rocks/)([AppStore](https://apps.apple.com/de/app/roma-for-pleroma-and-mastodon/id1445328699))
|
||||
* [Mastodon for iPhone and iPad](https://joinmastodon.org/apps) ([AppStore](https://apps.apple.com/us/app/mastodon-for-iphone/id1571998974))
|
||||
* [Stella*](https://www.stella-app.net/) ([AppStore](https://apps.apple.com/us/app/stella-for-mastodon-twitter/id921372048))
|
||||
* [Tooot](https://tooot.app/) ([AppStore](https://apps.apple.com/app/id1549772269), [GitHub](https://github.com/tooot-app)), Data collection (not linked to identity)
|
||||
* [Tooot](https://github.com/tooot-app) ([AppStore](https://apps.apple.com/app/id1549772269), Data collection (not linked to identity)
|
||||
* [Tootle](https://mastodon.cloud/@tootleapp) ([AppStore](https://apps.apple.com/de/app/tootle-for-mastodon/id1236013466)), last update: 2020
|
||||
|
||||
#### Linux
|
||||
|
@ -217,9 +214,13 @@ The available features are client specific and may differ.
|
|||
|
||||
#### macOS
|
||||
|
||||
* [Mastonaut](https://mastonaut.app/) ([AppStore](https://apps.apple.com/us/app/mastonaut/id1450757574)), costs ~8€
|
||||
* [Mastonaut](https://mastonaut.app/) ([AppStore](https://apps.apple.com/us/app/mastonaut/id1450757574)), closed source
|
||||
* [Whalebird](https://whalebird.social/en/desktop/contents) ([AppStore](https://apps.apple.com/de/app/whalebird/id1378283354), [GitHub](https://github.com/h3poteto/whalebird-desktop))
|
||||
|
||||
#### Windows
|
||||
|
||||
* [Whalebird](https://whalebird.social/en/desktop/contents) ([Website Download](https://whalebird.social/en/desktop/contents/downloads#windows), [GitHub](https://github.com/h3poteto/whalebird-desktop))
|
||||
|
||||
#### Web Frontend
|
||||
|
||||
* [Halcyon](https://www.halcyon.social/)
|
||||
|
|
|
@ -102,7 +102,18 @@ If you encounter a bug, please let us know.
|
|||
|
||||
### Create a database
|
||||
|
||||
Create an empty database and note the access details (hostname, username, password, database name).
|
||||
Create an empty database and note the access details (hostname, username, password, database name).
|
||||
Generate a strong password, then enter mysql with:
|
||||
|
||||
mysql
|
||||
|
||||
Then use the following script using the password you just generated:
|
||||
|
||||
CREATE DATABASE friendicadb;
|
||||
CREATE USER 'friendica'@'localhost' IDENTIFIED BY '<<your mysql password here>>';
|
||||
GRANT ALL ON friendicadb.* TO 'friendica'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
EXIT;
|
||||
|
||||
Friendica needs the permission to create and delete fields and tables in its own database.
|
||||
|
||||
|
@ -449,3 +460,58 @@ section:
|
|||
sql_mode = '';
|
||||
|
||||
After that, restart mysql and try again.
|
||||
|
||||
### Your worker never or rarely runs
|
||||
|
||||
Friendica is coded to always play nice. It checks whether the host machine is idle enough and if it _seems_ to be overloaded, it intermittently refuses to process the worker queue.
|
||||
|
||||
Such checks originate from the days of single-user single-core machines and involves thresholds that you should adjust based on the number of exclusive CPU cores you have. See this issue for more information:
|
||||
|
||||
* https://github.com/friendica/friendica/issues/10131
|
||||
|
||||
If you want to be neighborly and are using a shared web hosting PaaS provider, especially within the free tier, you need to set `maxloadavg` to say twice the maximum value of `/proc/loadavg` during peak hours.
|
||||
|
||||
If you have the whole (virtual) machine for yourself such as in case of an IaaS VPS, you can set it to orders of magnitude higher than its commonly observed value, such as 1000.
|
||||
|
||||
You should instead enact limits in your web server configuration based on the number of entry processes to cap the concurrent memory usage of your PHP processes.
|
||||
See `RLimitMEM`, `RLimitCPU`, `RLimitNPROC`, `StartServers`, `ServerLimit`, `MaxRequestsPerChild`, `pm.max_children`, `pm.start_servers` and related options in your server.
|
||||
|
||||
### Error uploading even small image files
|
||||
|
||||
You tried to upload an image up to 100kB and it failed.
|
||||
|
||||
You may not have the ownership or file mode set correctly if you are using the file system storage backend.
|
||||
|
||||
Change the backend to database. If this solves it, that is what needs to be fixed.
|
||||
|
||||
### Error uploading large files
|
||||
|
||||
You may find `413 Request Entity Too Large` or `500 Internal Error` in the network inspector of the browser if the file is too large, for example if it is a video.
|
||||
|
||||
First try to upload a very small file, up to 100kB. If that succeeds, you will need to increase limits at multiple places, including on any web proxy that you are using.
|
||||
|
||||
In your PHP ini:
|
||||
|
||||
* `upload_max_filesize`: defaults to 2MB
|
||||
* `post_max_size`: defaults to 8MB, must be greater than `upload_max_filesize`
|
||||
* `memory_limit`: defaults to 128MB, must be greater than `post_max_size`
|
||||
|
||||
You should verify whether you changed them in the _right file_ by checking the web interface at the end of the overview on the `Admin` panel.
|
||||
|
||||
For Apache2:
|
||||
|
||||
* `LimitRequestBody`: defaults to unlimited
|
||||
* `SSLRenegBufferSize`: defaults to 128kB, only if your site uses TLS and perhaps only when using `SSLVerifyClient` or `SSLVerifyDepth`
|
||||
|
||||
For nginx:
|
||||
|
||||
* `client_max_body_size`: defaults to 1MB
|
||||
|
||||
If you are using the database backend for storage, increase this in your SQL configuration:
|
||||
|
||||
* `max_allowed_packet`: defaults to 32MB
|
||||
|
||||
If you use the ModSecurity WAF:
|
||||
|
||||
* `SecRequestBodyLimit`: defaults to 12MB
|
||||
* `SecRequestBodyNoFilesLimit`: defaults to 128kB, should not apply to Friendica
|
||||
|
|
|
@ -11,6 +11,7 @@ Database Tables
|
|||
| [addon](help/database/db_addon) | registered addons |
|
||||
| [apcontact](help/database/db_apcontact) | ActivityPub compatible contacts - used in the ActivityPub implementation |
|
||||
| [application](help/database/db_application) | OAuth application |
|
||||
| [application-marker](help/database/db_application-marker) | Timeline marker |
|
||||
| [application-token](help/database/db_application-token) | OAuth user token |
|
||||
| [attach](help/database/db_attach) | file attachments |
|
||||
| [cache](help/database/db_cache) | Stores temporary data |
|
||||
|
@ -21,6 +22,7 @@ Database Tables
|
|||
| [conversation](help/database/db_conversation) | Raw data and structure information for messages |
|
||||
| [delayed-post](help/database/db_delayed-post) | Posts that are about to be distributed at a later time |
|
||||
| [diaspora-interaction](help/database/db_diaspora-interaction) | Signed Diaspora Interaction |
|
||||
| [endpoint](help/database/db_endpoint) | ActivityPub endpoints - used in the ActivityPub implementation |
|
||||
| [event](help/database/db_event) | Events |
|
||||
| [fcontact](help/database/db_fcontact) | Diaspora compatible contacts - used in the Diaspora implementation |
|
||||
| [fsuggest](help/database/db_fsuggest) | friend suggestion stuff |
|
||||
|
@ -37,7 +39,7 @@ Database Tables
|
|||
| [mailacct](help/database/db_mailacct) | Mail account data for fetching mails |
|
||||
| [manage](help/database/db_manage) | table of accounts that can manage each other |
|
||||
| [notification](help/database/db_notification) | notifications |
|
||||
| [notify](help/database/db_notify) | notifications |
|
||||
| [notify](help/database/db_notify) | [Deprecated] User notifications |
|
||||
| [notify-threads](help/database/db_notify-threads) | |
|
||||
| [oembed](help/database/db_oembed) | cache for OEmbed queries |
|
||||
| [openwebauth-token](help/database/db_openwebauth-token) | Store OpenWebAuth token to verify contacts |
|
||||
|
@ -47,10 +49,15 @@ Database Tables
|
|||
| [photo](help/database/db_photo) | photo storage |
|
||||
| [post](help/database/db_post) | Structure for all posts |
|
||||
| [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-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-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-question](help/database/db_post-question) | Question |
|
||||
| [post-question-option](help/database/db_post-question-option) | Question option |
|
||||
| [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 |
|
||||
|
|
|
@ -17,6 +17,8 @@ Fields
|
|||
| inbox | | varchar(255) | NO | | NULL | |
|
||||
| outbox | | varchar(255) | YES | | NULL | |
|
||||
| sharedinbox | | varchar(255) | YES | | NULL | |
|
||||
| featured | Address for the collection of featured posts | varchar(255) | YES | | NULL | |
|
||||
| featured-tags | Address for the collection of featured tags | varchar(255) | YES | | NULL | |
|
||||
| manually-approve | | boolean | YES | | NULL | |
|
||||
| discoverable | Mastodon extension: true if profile is published in their directory | boolean | YES | | NULL | |
|
||||
| nick | | varchar(255) | NO | | | |
|
||||
|
|
34
doc/database/db_application-marker.md
Normal file
|
@ -0,0 +1,34 @@
|
|||
Table application-marker
|
||||
===========
|
||||
|
||||
Timeline marker
|
||||
|
||||
Fields
|
||||
------
|
||||
|
||||
| Field | Description | Type | Null | Key | Default | Extra |
|
||||
| -------------- | ---------------------------- | ------------------ | ---- | --- | ------- | ----- |
|
||||
| application-id | | int unsigned | NO | PRI | NULL | |
|
||||
| uid | Owner User id | mediumint unsigned | NO | PRI | NULL | |
|
||||
| timeline | Marker (home, notifications) | varchar(64) | NO | PRI | NULL | |
|
||||
| last_read_id | Marker id for the timeline | varchar(255) | YES | | NULL | |
|
||||
| version | Version number | smallint unsigned | YES | | NULL | |
|
||||
| updated_at | creation time | datetime | YES | | NULL | |
|
||||
|
||||
Indexes
|
||||
------------
|
||||
|
||||
| Name | Fields |
|
||||
| ------- | ----------------------------- |
|
||||
| PRIMARY | application-id, uid, timeline |
|
||||
| uid_id | uid |
|
||||
|
||||
Foreign Keys
|
||||
------------
|
||||
|
||||
| Field | Target Table | Target Field |
|
||||
|-------|--------------|--------------|
|
||||
| application-id | [application](help/database/db_application) | id |
|
||||
| uid | [user](help/database/db_user) | uid |
|
||||
|
||||
Return to [database documentation](help/database)
|
30
doc/database/db_endpoint.md
Normal file
|
@ -0,0 +1,30 @@
|
|||
Table endpoint
|
||||
===========
|
||||
|
||||
ActivityPub endpoints - used in the ActivityPub implementation
|
||||
|
||||
Fields
|
||||
------
|
||||
|
||||
| Field | Description | Type | Null | Key | Default | Extra |
|
||||
| ------------ | -------------------------------------------------------------- | -------------- | ---- | --- | ------- | ----- |
|
||||
| url | URL of the contact | varbinary(255) | NO | PRI | NULL | |
|
||||
| type | | varchar(20) | NO | | NULL | |
|
||||
| owner-uri-id | Id of the item-uri table entry that contains the apcontact url | int unsigned | YES | | NULL | |
|
||||
|
||||
Indexes
|
||||
------------
|
||||
|
||||
| Name | Fields |
|
||||
| ----------------- | -------------------------- |
|
||||
| PRIMARY | url |
|
||||
| owner-uri-id_type | UNIQUE, owner-uri-id, type |
|
||||
|
||||
Foreign Keys
|
||||
------------
|
||||
|
||||
| Field | Target Table | Target Field |
|
||||
|-------|--------------|--------------|
|
||||
| owner-uri-id | [item-uri](help/database/db_item-uri) | id |
|
||||
|
||||
Return to [database documentation](help/database)
|
|
@ -6,13 +6,14 @@ privacy groups, group info
|
|||
Fields
|
||||
------
|
||||
|
||||
| Field | Description | Type | Null | Key | Default | Extra |
|
||||
| ------- | ------------------------------------------ | ------------------ | ---- | --- | ------- | -------------- |
|
||||
| id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment |
|
||||
| uid | Owner User id | mediumint unsigned | NO | | 0 | |
|
||||
| visible | 1 indicates the member list is not private | boolean | NO | | 0 | |
|
||||
| deleted | 1 indicates the group has been deleted | boolean | NO | | 0 | |
|
||||
| name | human readable name of group | varchar(255) | NO | | | |
|
||||
| Field | Description | Type | Null | Key | Default | Extra |
|
||||
| ------- | ----------------------------------------------------------------------------------------- | ------------------ | ---- | --- | ------- | -------------- |
|
||||
| id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment |
|
||||
| uid | Owner User id | mediumint unsigned | NO | | 0 | |
|
||||
| visible | 1 indicates the member list is not private | boolean | NO | | 0 | |
|
||||
| deleted | 1 indicates the group has been deleted | boolean | NO | | 0 | |
|
||||
| cid | Contact id of forum. When this field is filled then the members are synced automatically. | int unsigned | YES | | NULL | |
|
||||
| name | human readable name of group | varchar(255) | NO | | | |
|
||||
|
||||
Indexes
|
||||
------------
|
||||
|
@ -21,6 +22,7 @@ Indexes
|
|||
| ------- | ------ |
|
||||
| PRIMARY | id |
|
||||
| uid | uid |
|
||||
| cid | cid |
|
||||
|
||||
Foreign Keys
|
||||
------------
|
||||
|
@ -28,5 +30,6 @@ Foreign Keys
|
|||
| Field | Target Table | Target Field |
|
||||
|-------|--------------|--------------|
|
||||
| uid | [user](help/database/db_user) | uid |
|
||||
| cid | [contact](help/database/db_contact) | id |
|
||||
|
||||
Return to [database documentation](help/database)
|
||||
|
|
|
@ -6,31 +6,36 @@ Global servers
|
|||
Fields
|
||||
------
|
||||
|
||||
| Field | Description | Type | Null | Key | Default | Extra |
|
||||
| ---------------- | -------------------------------------------------- | ---------------- | ---- | --- | ------------------- | -------------- |
|
||||
| id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment |
|
||||
| url | | varchar(255) | NO | | | |
|
||||
| nurl | | varchar(255) | NO | | | |
|
||||
| version | | varchar(255) | NO | | | |
|
||||
| site_name | | varchar(255) | NO | | | |
|
||||
| info | | text | YES | | NULL | |
|
||||
| register_policy | | tinyint | NO | | 0 | |
|
||||
| registered-users | Number of registered users | int unsigned | NO | | 0 | |
|
||||
| directory-type | Type of directory service (Poco, Mastodon) | tinyint | YES | | 0 | |
|
||||
| poco | | varchar(255) | NO | | | |
|
||||
| noscrape | | varchar(255) | NO | | | |
|
||||
| network | | char(4) | NO | | | |
|
||||
| protocol | The protocol of the server | tinyint unsigned | YES | | NULL | |
|
||||
| platform | | varchar(255) | NO | | | |
|
||||
| relay-subscribe | Has the server subscribed to the relay system | boolean | NO | | 0 | |
|
||||
| relay-scope | The scope of messages that the server wants to get | varchar(10) | NO | | | |
|
||||
| detection-method | Method that had been used to detect that server | tinyint unsigned | YES | | NULL | |
|
||||
| created | | datetime | NO | | 0001-01-01 00:00:00 | |
|
||||
| last_poco_query | | datetime | YES | | 0001-01-01 00:00:00 | |
|
||||
| last_contact | Last successful connection request | datetime | YES | | 0001-01-01 00:00:00 | |
|
||||
| last_failure | Last failed connection request | datetime | YES | | 0001-01-01 00:00:00 | |
|
||||
| failed | Connection failed | boolean | YES | | NULL | |
|
||||
| next_contact | Next connection request | datetime | YES | | 0001-01-01 00:00:00 | |
|
||||
| Field | Description | Type | Null | Key | Default | Extra |
|
||||
| --------------------- | -------------------------------------------------- | ---------------- | ---- | --- | ------------------- | -------------- |
|
||||
| id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment |
|
||||
| url | | varchar(255) | NO | | | |
|
||||
| nurl | | varchar(255) | NO | | | |
|
||||
| version | | varchar(255) | NO | | | |
|
||||
| site_name | | varchar(255) | NO | | | |
|
||||
| info | | text | YES | | NULL | |
|
||||
| register_policy | | tinyint | NO | | 0 | |
|
||||
| registered-users | Number of registered users | int unsigned | NO | | 0 | |
|
||||
| active-week-users | Number of active users in the last week | int unsigned | YES | | NULL | |
|
||||
| active-month-users | Number of active users in the last month | int unsigned | YES | | NULL | |
|
||||
| active-halfyear-users | Number of active users in the last six month | int unsigned | YES | | NULL | |
|
||||
| local-posts | Number of local posts | int unsigned | YES | | NULL | |
|
||||
| local-comments | Number of local comments | int unsigned | YES | | NULL | |
|
||||
| directory-type | Type of directory service (Poco, Mastodon) | tinyint | YES | | 0 | |
|
||||
| poco | | varchar(255) | NO | | | |
|
||||
| noscrape | | varchar(255) | NO | | | |
|
||||
| network | | char(4) | NO | | | |
|
||||
| protocol | The protocol of the server | tinyint unsigned | YES | | NULL | |
|
||||
| platform | | varchar(255) | NO | | | |
|
||||
| relay-subscribe | Has the server subscribed to the relay system | boolean | NO | | 0 | |
|
||||
| relay-scope | The scope of messages that the server wants to get | varchar(10) | NO | | | |
|
||||
| detection-method | Method that had been used to detect that server | tinyint unsigned | YES | | NULL | |
|
||||
| created | | datetime | NO | | 0001-01-01 00:00:00 | |
|
||||
| last_poco_query | | datetime | YES | | 0001-01-01 00:00:00 | |
|
||||
| last_contact | Last successful connection request | datetime | YES | | 0001-01-01 00:00:00 | |
|
||||
| last_failure | Last failed connection request | datetime | YES | | 0001-01-01 00:00:00 | |
|
||||
| failed | Connection failed | boolean | YES | | NULL | |
|
||||
| next_contact | Next connection request | datetime | YES | | 0001-01-01 00:00:00 | |
|
||||
|
||||
Indexes
|
||||
------------
|
||||
|
|
|
@ -9,6 +9,7 @@ Fields
|
|||
| Field | Description | Type | Null | Key | Default | Extra |
|
||||
| -------- | ------------------------------------ | -------------- | ---- | --- | ------------------- | ----- |
|
||||
| url | URL of the inbox | varbinary(255) | NO | PRI | NULL | |
|
||||
| uri-id | Item-uri id of inbox url | int unsigned | YES | | NULL | |
|
||||
| created | Creation date of this entry | datetime | NO | | 0001-01-01 00:00:00 | |
|
||||
| success | Date of the last successful delivery | datetime | NO | | 0001-01-01 00:00:00 | |
|
||||
| failure | Date of the last failed delivery | datetime | NO | | 0001-01-01 00:00:00 | |
|
||||
|
@ -22,6 +23,13 @@ Indexes
|
|||
| Name | Fields |
|
||||
| ------- | ------ |
|
||||
| PRIMARY | url |
|
||||
| uri-id | uri-id |
|
||||
|
||||
Foreign Keys
|
||||
------------
|
||||
|
||||
| Field | Target Table | Target Field |
|
||||
|-------|--------------|--------------|
|
||||
| uri-id | [item-uri](help/database/db_item-uri) | id |
|
||||
|
||||
Return to [database documentation](help/database)
|
||||
|
|
|
@ -11,7 +11,7 @@ Fields
|
|||
| id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment |
|
||||
| uid | Owner User id | mediumint unsigned | YES | | NULL | |
|
||||
| vid | Id of the verb table entry that contains the activity verbs | smallint unsigned | YES | | NULL | |
|
||||
| type | | tinyint unsigned | YES | | NULL | |
|
||||
| type | | smallint unsigned | YES | | NULL | |
|
||||
| actor-id | Link to the contact table with uid=0 of the actor that caused the notification | int unsigned | YES | | NULL | |
|
||||
| target-uri-id | Item-uri id of the related post | int unsigned | YES | | NULL | |
|
||||
| parent-uri-id | Item-uri id of the parent of the related post | int unsigned | YES | | NULL | |
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
Table notify
|
||||
===========
|
||||
|
||||
notifications
|
||||
[Deprecated] User notifications
|
||||
|
||||
Fields
|
||||
------
|
||||
|
|
|
@ -16,11 +16,11 @@ Fields
|
|||
Indexes
|
||||
------------
|
||||
|
||||
| Name | Fields |
|
||||
| ------- | ---------------------- |
|
||||
| PRIMARY | uri-id, uid, type, tid |
|
||||
| uri-id | tid |
|
||||
| uid | uid |
|
||||
| Name | Fields |
|
||||
| ---------- | ---------------------- |
|
||||
| PRIMARY | uri-id, uid, type, tid |
|
||||
| tid | tid |
|
||||
| uid_uri-id | uid, uri-id |
|
||||
|
||||
Foreign Keys
|
||||
------------
|
||||
|
|
29
doc/database/db_post-collection.md
Normal file
|
@ -0,0 +1,29 @@
|
|||
Table post-collection
|
||||
===========
|
||||
|
||||
Collection of 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 | |
|
||||
| type | 0 - Featured | tinyint unsigned | NO | PRI | 0 | |
|
||||
|
||||
Indexes
|
||||
------------
|
||||
|
||||
| Name | Fields |
|
||||
| ------- | ------------ |
|
||||
| PRIMARY | uri-id, type |
|
||||
| type | type |
|
||||
|
||||
Foreign Keys
|
||||
------------
|
||||
|
||||
| Field | Target Table | Target Field |
|
||||
|-------|--------------|--------------|
|
||||
| uri-id | [item-uri](help/database/db_item-uri) | id |
|
||||
|
||||
Return to [database documentation](help/database)
|
37
doc/database/db_post-delivery.md
Normal file
|
@ -0,0 +1,37 @@
|
|||
Table post-delivery
|
||||
===========
|
||||
|
||||
Delivery data for posts for the batch processing
|
||||
|
||||
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 | |
|
||||
| inbox-id | Item-uri id of inbox url | int unsigned | NO | PRI | NULL | |
|
||||
| uid | Delivering user | mediumint unsigned | YES | | NULL | |
|
||||
| created | | datetime | YES | | 0001-01-01 00:00:00 | |
|
||||
| command | | varbinary(32) | YES | | NULL | |
|
||||
| failed | Number of times the delivery has failed | tinyint | YES | | 0 | |
|
||||
| receivers | JSON encoded array with the receiving contacts | mediumtext | YES | | NULL | |
|
||||
|
||||
Indexes
|
||||
------------
|
||||
|
||||
| Name | Fields |
|
||||
| ---------------- | ----------------- |
|
||||
| PRIMARY | uri-id, inbox-id |
|
||||
| inbox-id_created | inbox-id, created |
|
||||
| uid | uid |
|
||||
|
||||
Foreign Keys
|
||||
------------
|
||||
|
||||
| Field | Target Table | Target Field |
|
||||
|-------|--------------|--------------|
|
||||
| uri-id | [item-uri](help/database/db_item-uri) | id |
|
||||
| inbox-id | [item-uri](help/database/db_item-uri) | id |
|
||||
| uid | [user](help/database/db_user) | uid |
|
||||
|
||||
Return to [database documentation](help/database)
|
44
doc/database/db_post-history.md
Normal file
|
@ -0,0 +1,44 @@
|
|||
Table post-history
|
||||
===========
|
||||
|
||||
Post history
|
||||
|
||||
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 | |
|
||||
| edited | Date of edit | datetime | NO | PRI | 0001-01-01 00:00:00 | |
|
||||
| title | item title | varchar(255) | NO | | | |
|
||||
| content-warning | | varchar(255) | NO | | | |
|
||||
| body | item body content | mediumtext | YES | | NULL | |
|
||||
| raw-body | Body without embedded media links | mediumtext | YES | | NULL | |
|
||||
| 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 | |
|
||||
| app | application which generated this item | varchar(255) | NO | | | |
|
||||
| rendered-hash | | varchar(32) | NO | | | |
|
||||
| rendered-html | item.body converted to html | mediumtext | YES | | NULL | |
|
||||
| object-type | ActivityStreams object type | varchar(100) | NO | | | |
|
||||
| object | JSON encoded object structure unless it is an implied object (normal post) | text | YES | | NULL | |
|
||||
| target-type | ActivityStreams target type if applicable (URI) | varchar(100) | NO | | | |
|
||||
| target | JSON encoded target structure if used | text | YES | | NULL | |
|
||||
| resource-id | Used to link other tables to items, it identifies the linked resource (e.g. photo) and if set must also set resource_type | varchar(32) | NO | | | |
|
||||
| plink | permalink or URL to a displayable copy of the message at its source | varchar(255) | NO | | | |
|
||||
|
||||
Indexes
|
||||
------------
|
||||
|
||||
| Name | Fields |
|
||||
| ------- | -------------- |
|
||||
| PRIMARY | uri-id, edited |
|
||||
|
||||
Foreign Keys
|
||||
------------
|
||||
|
||||
| Field | Target Table | Target Field |
|
||||
|-------|--------------|--------------|
|
||||
| uri-id | [item-uri](help/database/db_item-uri) | id |
|
||||
|
||||
Return to [database documentation](help/database)
|
|
@ -10,13 +10,13 @@ Fields
|
|||
| --------------- | --------------------------------------------------------- | ----------------- | ---- | --- | ------- | -------------- |
|
||||
| id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment |
|
||||
| uri-id | Id of the item-uri table entry that contains the item uri | int unsigned | NO | | NULL | |
|
||||
| url | Media URL | varbinary(511) | NO | | NULL | |
|
||||
| url | Media URL | varbinary(1024) | NO | | NULL | |
|
||||
| type | Media type | tinyint unsigned | NO | | 0 | |
|
||||
| mimetype | | varchar(60) | YES | | NULL | |
|
||||
| height | Height of the media | smallint unsigned | YES | | NULL | |
|
||||
| width | Width of the media | smallint unsigned | YES | | NULL | |
|
||||
| size | Media size | int unsigned | YES | | NULL | |
|
||||
| preview | Preview URL | varbinary(255) | YES | | NULL | |
|
||||
| size | Media size | bigint unsigned | YES | | NULL | |
|
||||
| preview | Preview URL | varbinary(512) | YES | | NULL | |
|
||||
| preview-height | Height of the preview picture | smallint unsigned | YES | | NULL | |
|
||||
| preview-width | Width of the preview picture | smallint unsigned | YES | | NULL | |
|
||||
| description | | text | YES | | NULL | |
|
||||
|
@ -31,10 +31,11 @@ Fields
|
|||
Indexes
|
||||
------------
|
||||
|
||||
| Name | Fields |
|
||||
| ---------- | ------------------- |
|
||||
| PRIMARY | id |
|
||||
| uri-id-url | UNIQUE, uri-id, url |
|
||||
| Name | Fields |
|
||||
| ---------- | ------------------------ |
|
||||
| PRIMARY | id |
|
||||
| uri-id-url | UNIQUE, uri-id, url(512) |
|
||||
| uri-id-id | uri-id, id |
|
||||
|
||||
Foreign Keys
|
||||
------------
|
||||
|
|
30
doc/database/db_post-question-option.md
Normal file
|
@ -0,0 +1,30 @@
|
|||
Table post-question-option
|
||||
===========
|
||||
|
||||
Question option
|
||||
|
||||
Fields
|
||||
------
|
||||
|
||||
| Field | Description | Type | Null | Key | Default | Extra |
|
||||
| ------- | --------------------------------------------------------- | ------------ | ---- | --- | ------- | ----- |
|
||||
| id | Id of the question | int unsigned | NO | PRI | NULL | |
|
||||
| uri-id | Id of the item-uri table entry that contains the item uri | int unsigned | NO | PRI | NULL | |
|
||||
| name | Name of the option | varchar(255) | YES | | NULL | |
|
||||
| replies | Number of replies for this question option | int unsigned | YES | | NULL | |
|
||||
|
||||
Indexes
|
||||
------------
|
||||
|
||||
| Name | Fields |
|
||||
| ------- | ---------- |
|
||||
| PRIMARY | uri-id, id |
|
||||
|
||||
Foreign Keys
|
||||
------------
|
||||
|
||||
| Field | Target Table | Target Field |
|
||||
|-------|--------------|--------------|
|
||||
| uri-id | [item-uri](help/database/db_item-uri) | id |
|
||||
|
||||
Return to [database documentation](help/database)
|
32
doc/database/db_post-question.md
Normal file
|
@ -0,0 +1,32 @@
|
|||
Table post-question
|
||||
===========
|
||||
|
||||
Question
|
||||
|
||||
Fields
|
||||
------
|
||||
|
||||
| Field | Description | Type | Null | Key | Default | Extra |
|
||||
| -------- | --------------------------------------------------------- | ------------ | ---- | --- | ------------------- | -------------- |
|
||||
| id | sequential ID | int unsigned | NO | PRI | NULL | auto_increment |
|
||||
| uri-id | Id of the item-uri table entry that contains the item uri | int unsigned | NO | | NULL | |
|
||||
| multiple | Multiple choice | boolean | NO | | 0 | |
|
||||
| voters | Number of voters for this question | int unsigned | YES | | NULL | |
|
||||
| end-time | Question end time | datetime | YES | | 0001-01-01 00:00:00 | |
|
||||
|
||||
Indexes
|
||||
------------
|
||||
|
||||
| Name | Fields |
|
||||
| ------- | -------------- |
|
||||
| PRIMARY | id |
|
||||
| uri-id | UNIQUE, uri-id |
|
||||
|
||||
Foreign Keys
|
||||
------------
|
||||
|
||||
| Field | Target Table | Target Field |
|
||||
|-------|--------------|--------------|
|
||||
| uri-id | [item-uri](help/database/db_item-uri) | id |
|
||||
|
||||
Return to [database documentation](help/database)
|
|
@ -18,13 +18,13 @@ Fields
|
|||
| changed | Date that something in the conversation changed, indicating clients should fetch the conversation again | datetime | NO | | 0001-01-01 00:00:00 | |
|
||||
| commented | | datetime | NO | | 0001-01-01 00:00:00 | |
|
||||
| uid | Owner id which owns this copy of the item | mediumint unsigned | NO | PRI | 0 | |
|
||||
| pinned | The thread is pinned on the profile page | boolean | NO | | 0 | |
|
||||
| pinned | deprecated | boolean | NO | | 0 | |
|
||||
| starred | | boolean | NO | | 0 | |
|
||||
| ignored | Ignore updates for this thread | boolean | NO | | 0 | |
|
||||
| wall | This item was posted to the wall of uid | boolean | NO | | 0 | |
|
||||
| mention | | boolean | NO | | 0 | |
|
||||
| pubmail | | boolean | NO | | 0 | |
|
||||
| forum_mode | | tinyint unsigned | NO | | 0 | |
|
||||
| forum_mode | Deprecated | tinyint unsigned | NO | | 0 | |
|
||||
| contact-id | contact.id | int unsigned | NO | | 0 | |
|
||||
| unseen | post has not been seen | boolean | NO | | 1 | |
|
||||
| hidden | Marker to hide the post from the user | boolean | NO | | 0 | |
|
||||
|
@ -49,7 +49,6 @@ Indexes
|
|||
| commented | commented |
|
||||
| uid_received | uid, received |
|
||||
| uid_wall_received | uid, wall, received |
|
||||
| uid_pinned | uid, pinned |
|
||||
| uid_commented | uid, commented |
|
||||
| uid_starred | uid, starred |
|
||||
| uid_mention | uid, mention |
|
||||
|
|
|
@ -10,7 +10,7 @@ Fields
|
|||
| ----------------- | --------------------------------------------------------- | ------------------ | ---- | --- | ------- | ----- |
|
||||
| uri-id | Id of the item-uri table entry that contains the item uri | int unsigned | NO | PRI | NULL | |
|
||||
| uid | Owner id which owns this copy of the item | mediumint unsigned | NO | PRI | NULL | |
|
||||
| notification-type | | tinyint unsigned | NO | | 0 | |
|
||||
| notification-type | | smallint unsigned | NO | | 0 | |
|
||||
|
||||
Indexes
|
||||
------------
|
||||
|
|
|
@ -6,11 +6,12 @@ tags and mentions
|
|||
Fields
|
||||
------
|
||||
|
||||
| Field | Description | Type | Null | Key | Default | Extra |
|
||||
| ----- | ----------- | -------------- | ---- | --- | ------- | -------------- |
|
||||
| id | | int unsigned | NO | PRI | NULL | auto_increment |
|
||||
| name | | varchar(96) | NO | | | |
|
||||
| url | | varbinary(255) | NO | | | |
|
||||
| Field | Description | Type | Null | Key | Default | Extra |
|
||||
| ----- | ----------------------------------------------------------------------------- | ---------------- | ---- | --- | ------- | -------------- |
|
||||
| id | | int unsigned | NO | PRI | NULL | auto_increment |
|
||||
| name | | varchar(96) | NO | | | |
|
||||
| url | | varbinary(255) | NO | | | |
|
||||
| type | Type of the tag (Unknown, General Collection, Follower Collection or Account) | tinyint unsigned | YES | | NULL | |
|
||||
|
||||
Indexes
|
||||
------------
|
||||
|
|
|
@ -15,6 +15,7 @@ Fields
|
|||
| 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 | |
|
||||
| pending | | boolean | YES | | NULL | |
|
||||
| rel | The kind of the relation between the user and the contact | tinyint unsigned | YES | | NULL | |
|
||||
| info | | mediumtext | YES | | NULL | |
|
||||
|
|
|
@ -106,12 +106,6 @@ Derzeitige Hooks
|
|||
$b ist das Item-Array einer Information, die in der Datenbank und im Item gespeichert ist.
|
||||
{Bitte beachte: der Seiteninhalt ist bbcode - nicht HTML)
|
||||
|
||||
**'settings_form'** - wird aufgerufen, wenn die HTML-Ausgabe für die Einstellungsseite generiert wird.
|
||||
$b ist die HTML-Ausgabe (String) der Einstellungsseite vor dem finalen "</form>"-Tag.
|
||||
|
||||
**'settings_post'** - wird aufgerufen, wenn die Einstellungsseiten geladen werden.
|
||||
$b ist der $_POST-Array
|
||||
|
||||
**'addon_settings'** - wird aufgerufen, wenn die HTML-Ausgabe der Addon-Einstellungsseite generiert wird.
|
||||
$b ist die HTML-Ausgabe (String) der Addon-Einstellungsseite vor dem finalen "</form>"-Tag.
|
||||
|
||||
|
@ -236,10 +230,6 @@ Eine komplette Liste aller Hook-Callbacks mit den zugehörigen Dateien (am 01-Ap
|
|||
|
||||
Hook::callAll('personal_xrd', $arr);
|
||||
|
||||
### mod/ping.php
|
||||
|
||||
Hook::callAll('network_ping', $arr);
|
||||
|
||||
### mod/parse_url.php
|
||||
|
||||
Hook::callAll("parse_link", $arr);
|
||||
|
@ -271,11 +261,9 @@ Eine komplette Liste aller Hook-Callbacks mit den zugehörigen Dateien (am 01-Ap
|
|||
Hook::callAll('addon_settings_post', $_POST);
|
||||
Hook::callAll('connector_settings_post', $_POST);
|
||||
Hook::callAll('display_settings_post', $_POST);
|
||||
Hook::callAll('settings_post', $_POST);
|
||||
Hook::callAll('addon_settings', $settings_addons);
|
||||
Hook::callAll('connector_settings', $settings_connectors);
|
||||
Hook::callAll('display_settings', $o);
|
||||
Hook::callAll('settings_form', $o);
|
||||
|
||||
### mod/photos.php
|
||||
|
||||
|
@ -426,6 +414,10 @@ 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);
|
||||
|
|
|
@ -65,17 +65,17 @@ table.bbcodes > * > tr > th {
|
|||
<td><a href="http://friendi.ca" target="external-link">Friendica</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>[img]https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.jpg[/img]</td>
|
||||
<td><img src="https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.jpg" alt="Immagine/foto"></td>
|
||||
<td>[img]https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.png[/img]</td>
|
||||
<td><img src="https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.png"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>[img=https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.jpg]Das Friendica Logo[/img]</td>
|
||||
<td><img src="https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.jpg" alt="Das Friendica Logo"></td>
|
||||
<td>[img=https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.png]Das Friendica Logo[/img]</td>
|
||||
<td><img src="https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.png" alt="Das Friendica Logo"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>[img=64x32]https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.jpg[/img]<br>
|
||||
<td>[img=64x32]https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica.svg[/img]<br>
|
||||
<br>Note: provided height is simply discarded.</td>
|
||||
<td><img src="https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica-32.jpg" style="width: 64px;"></td>
|
||||
<td><img src="https://raw.githubusercontent.com/friendica/friendica/stable/images/friendica.svg" style="width: 64px;"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>[size=xx-small]kleiner Text[/size]</td>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* [Home](help)
|
||||
|
||||
Zusätzlich zum [Umziehen des Accounts](help/Move-Account) kannst du die Liste der von dir gefolgten Kontakte exportieren und importieren.
|
||||
Die exportierte Liste wird als CSV Datei in einem zu anderen Plattformen, z.B. Mastodon oder Pleroma, kompatiblen Format gespeichert.
|
||||
Die exportierte Liste wird als CSV Datei in einem zu anderen Plattformen, z.B. Mastodon, Misskey oder Pleroma, kompatiblen Format gespeichert.
|
||||
|
||||
## Export der gefolgten Kontakte
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
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 [friendica-themes.com](http://friendica-themes.com) for an overview of the existing themes.
|
||||
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.
|
||||
|
||||
So, how to work on the UI of friendica.
|
||||
|
|
BIN
images/default/corgidon.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
images/default/diaspora.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
160
images/default/gotosocial.svg
Normal file
|
@ -0,0 +1,160 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="1000px"
|
||||
height="1000px"
|
||||
viewBox="0 0 1000 1000"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
||||
sodipodi:docname="GoToSocial_icon1.svg"
|
||||
inkscape:export-xdpi="95.999992"
|
||||
inkscape:export-ydpi="95.999992">
|
||||
<defs
|
||||
id="defs5117">
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect5760"
|
||||
is_visible="true" />
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect5756"
|
||||
is_visible="true" />
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect5752"
|
||||
is_visible="true" />
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect5748"
|
||||
is_visible="true" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.70710678"
|
||||
inkscape:cx="460.72691"
|
||||
inkscape:cy="522.20279"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer3"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1057"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5120">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="background"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
style="display:inline">
|
||||
<rect
|
||||
style="fill:#d0d0d0;fill-opacity:1;stroke:none;stroke-width:1.51092136;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
|
||||
id="rect5876"
|
||||
width="1000.0042"
|
||||
height="1000"
|
||||
x="0"
|
||||
y="0" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer3"
|
||||
inkscape:label="sloth"
|
||||
style="display:inline">
|
||||
<g
|
||||
id="g5890"
|
||||
transform="translate(-10)">
|
||||
<path
|
||||
sodipodi:nodetypes="ssscccs"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5762"
|
||||
d="M 861.29285,497.07031 C 861.65556,665.3247 774.21642,807.40548 511.60027,807.86794 270.63622,808.29226 154.54309,691.2756 155.19024,504.19228 155.7289,348.47535 251.17288,227.4551 422.3176,205.3802 c -35.32036,-75.85452 52.24232,-96.94648 73.77615,-32.00508 13.73451,-37.63439 108.24345,-49.1716 62.21106,24.77055 147.95052,3.75658 302.58353,111.28061 302.98804,298.92464 z"
|
||||
style="display:inline;fill:#767676;fill-opacity:1;stroke:none;stroke-width:2.57058167;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
|
||||
<path
|
||||
sodipodi:nodetypes="sssssss"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5780"
|
||||
d="m 809.15213,517.31679 c -4.83374,150.52526 -109.85544,235.22815 -297.81171,235.31839 -179.6675,0.0863 -290.56109,-70.98245 -298.50223,-235.31839 -4.6366,-95.95095 54.62861,-181.84442 144.83016,-194.18834 80.92123,-11.07393 99.7402,21.01802 153.67207,21.01802 59.21658,0 83.64871,-35.09608 162.84221,-21.85479 87.78391,14.67763 137.90533,103.6017 134.9695,195.02511 z"
|
||||
style="display:inline;fill:#e8e8e8;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
|
||||
<path
|
||||
sodipodi:nodetypes="scssscs"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5780-9"
|
||||
d="m 809.15213,517.31679 c -1.32872,41.37724 -10.22787,77.78081 -26.33906,108.8204 -46.60931,-39.48031 -99.53509,-10.7281 -171.50115,-39.43334 -44.77145,-17.85808 -51.41659,-56.56453 -51.21999,-81.3542 0.54836,-69.14384 48.17003,-93.45758 95.53601,-97.60875 55.74677,-4.88566 124.5246,36.1482 151.01547,66.79433 2.11531,14.01083 2.97167,28.36512 2.50872,42.78156 z"
|
||||
style="display:inline;fill:#a1a1a1;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
|
||||
<ellipse
|
||||
ry="50.575684"
|
||||
rx="37.800804"
|
||||
cy="502.64291"
|
||||
cx="646.85773"
|
||||
id="path5816"
|
||||
style="fill:#767676;fill-opacity:1;stroke:none;stroke-width:1.51185882;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
|
||||
<path
|
||||
sodipodi:nodetypes="scssscs"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5780-9-1"
|
||||
d="m 212.51463,517.3246 c 1.32872,41.37724 10.22787,77.78081 26.33906,108.8204 46.60931,-39.48031 99.57415,-10.73591 171.54021,-39.44115 44.77145,-17.85808 51.41659,-56.56453 51.21999,-81.3542 -0.54836,-69.14384 -48.20909,-93.44977 -95.57507,-97.60094 -55.74677,-4.88566 -124.5246,36.1482 -151.01547,66.79433 -2.11531,14.01083 -2.97167,28.36512 -2.50872,42.78156 z"
|
||||
style="display:inline;fill:#a1a1a1;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
|
||||
<ellipse
|
||||
transform="scale(-1,1)"
|
||||
ry="50.575684"
|
||||
rx="37.800804"
|
||||
cy="502.64294"
|
||||
cx="-374.84808"
|
||||
id="path5816-0"
|
||||
style="display:inline;fill:#767676;fill-opacity:1;stroke:none;stroke-width:1.51185882;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
|
||||
<path
|
||||
sodipodi:nodetypes="sssss"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5862"
|
||||
d="m 543.96613,556.96185 c 0,11.0622 -14.51648,20.02988 -32.42347,20.02988 -17.90698,0 -32.42347,-8.96769 -32.42347,-20.02988 0,-11.0622 14.14619,-15.58638 32.05318,-15.58638 17.90698,0 32.79376,4.52417 32.79376,15.58638 z"
|
||||
style="display:inline;fill:#767676;fill-opacity:1;stroke:none;stroke-width:1.60515046;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
|
||||
<path
|
||||
sodipodi:nodetypes="sssss"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path5865"
|
||||
d="m 552.00195,620.36132 c 7.06643,13.89391 -19.38375,21.24024 -40.2832,21.24024 -20.89945,0 -47.71708,-7.02219 -41.50391,-21.24024 5.71775,-13.08435 20.11619,0.73243 41.01563,0.73243 20.89944,0 34.43888,-13.1835 40.77148,-0.73243 z"
|
||||
style="display:inline;fill:#767676;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
|
||||
<ellipse
|
||||
transform="rotate(-6.669407)"
|
||||
ry="24.882849"
|
||||
rx="19.511755"
|
||||
cy="560.95673"
|
||||
cx="600.24731"
|
||||
id="path5818"
|
||||
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.53898752;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
|
||||
<ellipse
|
||||
transform="rotate(-6.6694071)"
|
||||
ry="24.882849"
|
||||
rx="19.511755"
|
||||
cy="529.32086"
|
||||
cx="329.69714"
|
||||
id="path5818-8"
|
||||
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.53898752;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 7.9 KiB |
BIN
images/default/hometown.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
images/default/koyuspace.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
images/default/mastodon.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
images/default/peertube-account.png
Normal file
After Width: | Height: | Size: 4.8 KiB |
BIN
images/default/peertube-channel.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
images/default/pleroma.png
Normal file
After Width: | Height: | Size: 1 KiB |
BIN
images/default/plume.png
Normal file
After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 756 B After Width: | Height: | Size: 270 B |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 267 B |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 7 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 608 B |
BIN
images/friendica-maskable-192.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
images/friendica-maskable-512.png
Normal file
After Width: | Height: | Size: 5.2 KiB |
4
images/friendica-maskable.svg
Normal file
|
@ -0,0 +1,4 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="192" height="192" viewBox="0 0 1920 1920">
|
||||
<rect fill="#1872a2" width="1920" height="1920"/>
|
||||
<path fill="#febf19" d="M390 595q0-84 61-145 60-60 144-60h730q85 0 145 60 60 61 60 145v730q0 84-60 145-60 60-145 60H595q-84 0-144-60-60-61-61-145zm935-160h-183v274H778v231l363-2 1 273H778v274h547q67 0 114-47 46-46 45-113V595q0-67-45-113-46-46-114-47z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 403 B |
|
@ -1 +1,4 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="svg2" width="96" height="96" version="1.1"><defs id="defs4"><linearGradient id="highlightgradient"><stop id="stop3833" offset="0" style="stop-color:#fff;stop-opacity:.74374998"/><stop style="stop-color:#fff;stop-opacity:0" id="stop3829" offset="1"/></linearGradient><linearGradient id="shadowgradient"><stop id="stop3833-5" offset="0" style="stop-color:#000;stop-opacity:.5"/><stop style="stop-color:#818080;stop-opacity:0" id="stop3829-9" offset="1"/></linearGradient><linearGradient id="linearGradient4011" x1="44.948" x2="54.103" y1="0" y2="46.797" gradientTransform="scale(1,0.54545455)" gradientUnits="userSpaceOnUse" xlink:href="#highlightgradient"/><linearGradient id="linearGradient4021" x1="52.017" x2="42.868" y1="96" y2="41.838" gradientTransform="matrix(1,0,0,0.5,0,48)" gradientUnits="userSpaceOnUse" xlink:href="#shadowgradient"/><filter id="filter4055" width="1.06" height="1.24" x="-.03" y="-.12"><feGaussianBlur id="feGaussianBlur4057" stdDeviation="1.2"/></filter><filter id="filter4059" width="1.06" height="1.244" x="-.03" y="-.122"><feGaussianBlur id="feGaussianBlur4061" stdDeviation="1.22"/></filter></defs><metadata id="metadata7"/><g id="layer1" transform="translate(0,-956.3622)" style="display:inline"><path style="fill:#ffc019;fill-opacity:1;stroke:none" id="rect2993" d="M 16,0 C 7.0091019,0.04308252 0,7.0521845 0,16 0,16 0,57.499123 0,80 0,89.120146 7.0091019,96 16,96 L 32,96 32,70 64,70 63.916016,46.068359 32,46.236328 32,26 64,26 64,0 C 64,0 24,0 16,0 z" transform="translate(0,956.3622)"/><path style="fill:#1872a2;fill-opacity:1;stroke:none" id="rect2993-6" d="m 80,1052.3622 c 8.990898,0 16.086165,-6.966 16,-16 0,0 0,-41.4991 0,-64 0.07767,-9.01639 -7.067354,-16 -16,-16 l -16,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26 c 0,0 32,0 48,0 z"/></g><g style="display:inline" id="g3997"><path id="path3999" d="m 64,0 0,26 -32,0 0,22 m 32,0 0,22 -32,0 0,26" style="fill:none;stroke:#000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/><rect id="rect4001" width="96" height="96" x="0" y="0" rx="16" ry="16" style="fill:none;stroke:#000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/></g><g id="layer3" style="display:none"><path style="fill:none;stroke:#000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" id="path3926" d="m 64,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26"/><rect style="fill:none;stroke:#000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" id="rect3928" width="96" height="96" x="0" y="0" rx="16" ry="16"/></g><g id="layer2" style="display:inline"><rect style="fill:url(#linearGradient3930);fill-opacity:1;stroke:none" id="rect3823" width="96" height="48.044" x="0" y="0" rx="15.215" ry="15.216"/><rect style="fill:url(#linearGradient3904);fill-opacity:1;stroke:none" id="rect3823-8" width="96" height="47.867" x="0" y="-96" rx="15.215" ry="15.16" transform="scale(1,-1)"/><rect style="fill:url(#linearGradient4011);fill-opacity:1;stroke:none;filter:url(#filter4059)" id="rect4003" width="98" height="24" x="0" y="0" rx="15.215" ry="8.299" transform="matrix(1.0296115,0,0,1.1963836,-2.901924,-4.7132067)"/><rect style="opacity:.56746030000000003;fill:url(#linearGradient4021);fill-opacity:1;stroke:none;filter:url(#filter4055)" id="rect4013" width="96" height="24" x="0" y="72" rx="14.008" ry="12" transform="matrix(0.9768331,0,0,0.91974646,1.1649641,8.098115)"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="192" height="192" viewBox="0 0 1920 1920">
|
||||
<rect fill="#1872a2" x="60" y="60" width="1800" height="1800" 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: 3.6 KiB After Width: | Height: | Size: 434 B |
12
mod/cal.php
|
@ -28,12 +28,14 @@ use Friendica\Content\Nav;
|
|||
use Friendica\Content\Widget;
|
||||
use Friendica\Core\Renderer;
|
||||
use Friendica\Core\Session;
|
||||
use Friendica\Core\System;
|
||||
use Friendica\Database\DBA;
|
||||
use Friendica\DI;
|
||||
use Friendica\Model\Event;
|
||||
use Friendica\Model\Item;
|
||||
use Friendica\Model\User;
|
||||
use Friendica\Module\BaseProfile;
|
||||
use Friendica\Module\Response;
|
||||
use Friendica\Network\HTTPException;
|
||||
use Friendica\Util\DateTimeFormat;
|
||||
use Friendica\Util\Temporal;
|
||||
|
@ -216,8 +218,7 @@ function cal_content(App $a)
|
|||
$events = Event::prepareListForTemplate($r);
|
||||
|
||||
if (!empty(DI::args()->getArgv()[2]) && (DI::args()->getArgv()[2] === 'json')) {
|
||||
echo json_encode($events);
|
||||
exit();
|
||||
System::jsonExit($events);
|
||||
}
|
||||
|
||||
// links: array('href', 'text', 'extra css classes', 'title')
|
||||
|
@ -253,8 +254,7 @@ function cal_content(App $a)
|
|||
]);
|
||||
|
||||
if (!empty($_GET['id'])) {
|
||||
echo $o;
|
||||
exit();
|
||||
System::httpExit($o);
|
||||
}
|
||||
|
||||
return $o;
|
||||
|
@ -289,10 +289,8 @@ function cal_content(App $a)
|
|||
|
||||
// If nothing went wrong we can echo the export content
|
||||
if ($evexport["success"]) {
|
||||
header('Content-type: text/calendar');
|
||||
header('content-disposition: attachment; filename="' . DI::l10n()->t('calendar') . '-' . $nick . '.' . $evexport["extension"] . '"');
|
||||
echo $evexport["content"];
|
||||
exit();
|
||||
System::httpExit($evexport["content"], Response::TYPE_BLANK, 'text/calendar');
|
||||
}
|
||||
|
||||
return;
|
||||
|
|
|
@ -23,9 +23,9 @@ use Friendica\App;
|
|||
use Friendica\Content\Text\BBCode;
|
||||
use Friendica\Content\Widget;
|
||||
use Friendica\Core\Logger;
|
||||
use Friendica\Core\Protocol;
|
||||
use Friendica\Core\Renderer;
|
||||
use Friendica\Core\Session;
|
||||
use Friendica\Core\System;
|
||||
use Friendica\Database\DBA;
|
||||
use Friendica\DI;
|
||||
use Friendica\Model\Contact;
|
||||
|
@ -33,9 +33,12 @@ use Friendica\Model\Item;
|
|||
use Friendica\Model\Post;
|
||||
use Friendica\Model\User;
|
||||
use Friendica\Module\ActivityPub\Objects;
|
||||
use Friendica\Module\Response;
|
||||
use Friendica\Network\HTTPException;
|
||||
use Friendica\Protocol\ActivityPub;
|
||||
use Friendica\Protocol\DFRN;
|
||||
use Friendica\Protocol\Diaspora;
|
||||
use Friendica\Util\DateTimeFormat;
|
||||
|
||||
function display_init(App $a)
|
||||
{
|
||||
|
@ -104,59 +107,34 @@ function display_init(App $a)
|
|||
}
|
||||
|
||||
if ($item['gravity'] != GRAVITY_PARENT) {
|
||||
$parent = Post::selectFirstForUser($item_user, $fields, ['uid' => $item['uid'], 'uri-id' => $item['parent-uri-id']]);
|
||||
$parent = Post::selectFirstForUser($item_user, $fields, ['uid' => [0, $item_user], 'uri-id' => $item['parent-uri-id']], ['order' => ['uid' => true]]);
|
||||
$item = $parent ?: $item;
|
||||
}
|
||||
|
||||
$profiledata = display_fetchauthor($item);
|
||||
$author = display_fetchauthor($item);
|
||||
|
||||
DI::page()['aside'] = Widget\VCard::getHTML($profiledata);
|
||||
if (\Friendica\Util\Network::isLocalLink($author['url'])) {
|
||||
\Friendica\Model\Profile::load(DI::app(), $author['nick'], false);
|
||||
} else {
|
||||
DI::page()['aside'] = Widget\VCard::getHTML($author);
|
||||
}
|
||||
$a->setProfileOwner($item['uid']);
|
||||
}
|
||||
|
||||
function display_fetchauthor($item)
|
||||
{
|
||||
$profiledata = Contact::getByURLForUser($item['author-link'], local_user());
|
||||
|
||||
// Check for a repeated message
|
||||
$shared = Item::getShareArray($item);
|
||||
if (!empty($shared) && empty($shared['comment'])) {
|
||||
$profiledata = [
|
||||
'uid' => 0,
|
||||
'id' => -1,
|
||||
'nickname' => '',
|
||||
'name' => '',
|
||||
'picdate' => '',
|
||||
'photo' => '',
|
||||
'url' => '',
|
||||
'network' => '',
|
||||
];
|
||||
|
||||
if (!empty($shared['author'])) {
|
||||
$profiledata['name'] = $shared['author'];
|
||||
}
|
||||
|
||||
if (Diaspora::isReshare($item['body'], true)) {
|
||||
$shared = Item::getShareArray($item);
|
||||
if (!empty($shared['profile'])) {
|
||||
$profiledata['url'] = $shared['profile'];
|
||||
$contact = Contact::getByURLForUser($shared['profile'], local_user());
|
||||
}
|
||||
|
||||
if (!empty($shared['avatar'])) {
|
||||
$profiledata['photo'] = $shared['avatar'];
|
||||
}
|
||||
|
||||
$profiledata['nickname'] = $profiledata['name'];
|
||||
$profiledata['network'] = Protocol::PHANTOM;
|
||||
|
||||
$profiledata['address'] = '';
|
||||
$profiledata['about'] = '';
|
||||
|
||||
$profiledata = Contact::getByURLForUser($profiledata['url'], local_user()) ?: $profiledata;
|
||||
}
|
||||
|
||||
if (!empty($profiledata['photo'])) {
|
||||
$profiledata['photo'] = DI::baseUrl()->remove($profiledata['photo']);
|
||||
if (empty($contact)) {
|
||||
$contact = Contact::getById($item['author-id']);
|
||||
}
|
||||
|
||||
return $profiledata;
|
||||
return $contact;
|
||||
}
|
||||
|
||||
function display_content(App $a, $update = false, $update_uid = 0)
|
||||
|
@ -182,6 +160,20 @@ function display_content(App $a, $update = false, $update_uid = 0)
|
|||
}
|
||||
$parent_uri_id = $item['parent-uri-id'];
|
||||
}
|
||||
if (empty($_REQUEST['force'])) {
|
||||
$browser_update = intval(DI::pConfig()->get($update_uid, 'system', 'update_interval'));
|
||||
if (!empty($browser_update)) {
|
||||
$update_date = date(DateTimeFormat::MYSQL, time() - ($browser_update / 500));
|
||||
if (!Post::exists(["`parent-uri-id` = ? AND `uid` IN (?, ?) AND `received` > ?", $parent_uri_id, 0, $update_uid, $update_date])) {
|
||||
Logger::debug('No updated content', ['uri-id' => $uri_id, 'uid' => $update_uid, 'updated' => $update_date]);
|
||||
return '';
|
||||
} else {
|
||||
Logger::debug('Updated content found', ['uri-id' => $uri_id, 'uid' => $update_uid, 'updated' => $update_date]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Logger::debug('Forced content update', ['uri-id' => $uri_id, 'uid' => $update_uid]);
|
||||
}
|
||||
} else {
|
||||
$uri_id = ((DI::args()->getArgc() > 2) ? DI::args()->getArgv()[2] : 0);
|
||||
$parent_uri_id = $uri_id;
|
||||
|
@ -374,7 +366,6 @@ function displayShowFeed(int $uri_id, int $uid, bool $conversation)
|
|||
if ($xml == '') {
|
||||
throw new HTTPException\InternalServerErrorException(DI::l10n()->t('The feed for this item is unavailable.'));
|
||||
}
|
||||
header("Content-type: application/atom+xml");
|
||||
echo $xml;
|
||||
exit();
|
||||
|
||||
System::httpExit($xml, Response::TYPE_ATOM);
|
||||
}
|
||||
|
|
|
@ -27,6 +27,7 @@ use Friendica\Core\ACL;
|
|||
use Friendica\Core\Logger;
|
||||
use Friendica\Core\Protocol;
|
||||
use Friendica\Core\Renderer;
|
||||
use Friendica\Core\System;
|
||||
use Friendica\Core\Theme;
|
||||
use Friendica\Core\Worker;
|
||||
use Friendica\Database\DBA;
|
||||
|
@ -122,8 +123,7 @@ function events_post(App $a)
|
|||
if (strcmp($finish, $start) < 0 && !$nofinish) {
|
||||
notice(DI::l10n()->t('Event can not end before it has started.'));
|
||||
if (intval($_REQUEST['preview'])) {
|
||||
echo DI::l10n()->t('Event can not end before it has started.');
|
||||
exit();
|
||||
System::httpExit(DI::l10n()->t('Event can not end before it has started.'));
|
||||
}
|
||||
DI::baseUrl()->redirect($onerror_path);
|
||||
}
|
||||
|
@ -131,8 +131,7 @@ function events_post(App $a)
|
|||
if (!$summary || ($start === DBA::NULL_DATETIME)) {
|
||||
notice(DI::l10n()->t('Event title and start time are required.'));
|
||||
if (intval($_REQUEST['preview'])) {
|
||||
echo DI::l10n()->t('Event title and start time are required.');
|
||||
exit();
|
||||
System::httpExit(DI::l10n()->t('Event title and start time are required.'));
|
||||
}
|
||||
DI::baseUrl()->redirect($onerror_path);
|
||||
}
|
||||
|
@ -192,9 +191,7 @@ function events_post(App $a)
|
|||
$datarray['id'] = $event_id;
|
||||
|
||||
if (intval($_REQUEST['preview'])) {
|
||||
$html = Event::getHTML($datarray);
|
||||
echo $html;
|
||||
exit();
|
||||
System::httpExit(Event::getHTML($datarray));
|
||||
}
|
||||
|
||||
$event_id = Event::store($datarray);
|
||||
|
@ -391,8 +388,7 @@ function events_content(App $a)
|
|||
]);
|
||||
|
||||
if (!empty($_GET['id'])) {
|
||||
echo $o;
|
||||
exit();
|
||||
System::httpExit($o);
|
||||
}
|
||||
|
||||
return $o;
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
use Friendica\App;
|
||||
use Friendica\Core\Renderer;
|
||||
use Friendica\Core\System;
|
||||
use Friendica\Database\DBA;
|
||||
use Friendica\DI;
|
||||
use Friendica\Model\Photo;
|
||||
|
@ -38,15 +39,15 @@ use Friendica\Util\Strings;
|
|||
function fbrowser_content(App $a)
|
||||
{
|
||||
if (!local_user()) {
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
|
||||
if (DI::args()->getArgc() == 1) {
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
|
||||
// Needed to match the correct template in a module that uses a different theme than the user/site/default
|
||||
$theme = Strings::sanitizeFilePathItem($_GET['theme'] ?? null);
|
||||
$theme = Strings::sanitizeFilePathItem($_GET['theme'] ?? '');
|
||||
if ($theme && is_file("view/theme/$theme/config.php")) {
|
||||
$a->setCurrentTheme($theme);
|
||||
}
|
||||
|
@ -153,7 +154,6 @@ function fbrowser_content(App $a)
|
|||
if (!empty($_GET['mode'])) {
|
||||
return $o;
|
||||
} else {
|
||||
echo $o;
|
||||
exit();
|
||||
System::httpExit($o);
|
||||
}
|
||||
}
|
||||
|
|
131
mod/item.php
|
@ -29,7 +29,6 @@
|
|||
*/
|
||||
|
||||
use Friendica\App;
|
||||
use Friendica\Content\Item as ItemHelper;
|
||||
use Friendica\Content\PageInfo;
|
||||
use Friendica\Content\Text\BBCode;
|
||||
use Friendica\Core\Hook;
|
||||
|
@ -37,10 +36,8 @@ use Friendica\Core\Logger;
|
|||
use Friendica\Core\Protocol;
|
||||
use Friendica\Core\Session;
|
||||
use Friendica\Core\System;
|
||||
use Friendica\Core\Worker;
|
||||
use Friendica\Database\DBA;
|
||||
use Friendica\DI;
|
||||
use Friendica\Model\APContact;
|
||||
use Friendica\Model\Attach;
|
||||
use Friendica\Model\Contact;
|
||||
use Friendica\Model\Conversation;
|
||||
|
@ -58,7 +55,6 @@ use Friendica\Protocol\Activity;
|
|||
use Friendica\Security\Security;
|
||||
use Friendica\Util\DateTimeFormat;
|
||||
use Friendica\Util\ParseUrl;
|
||||
use Friendica\Worker\Delivery;
|
||||
|
||||
function item_post(App $a) {
|
||||
if (!Session::isAuthenticated()) {
|
||||
|
@ -384,80 +380,34 @@ function item_post(App $a) {
|
|||
$contact_record = DBA::selectFirst('contact', [], ['uid' => $profile_uid, 'self' => true]) ?: [];
|
||||
}
|
||||
|
||||
// Look for any tags and linkify them
|
||||
$inform = '';
|
||||
$private_forum = false;
|
||||
$private_id = null;
|
||||
$only_to_forum = false;
|
||||
$forum_contact = [];
|
||||
|
||||
// Personal notes must never be altered to a forum post.
|
||||
if ($posttype != Item::PT_PERSONAL_NOTE) {
|
||||
// Convert mentions in the body to a unified format
|
||||
$body = BBCode::setMentions($body, local_user() ? local_user() : $profile_uid, $network);
|
||||
// Look for any tags and linkify them
|
||||
$item = [
|
||||
'uid' => local_user() ? local_user() : $profile_uid,
|
||||
'gravity' => $toplevel_item_id ? GRAVITY_COMMENT : GRAVITY_PARENT,
|
||||
'network' => $network,
|
||||
'body' => $body,
|
||||
'postopts' => $postopts,
|
||||
'private' => $private,
|
||||
'allow_cid' => $str_contact_allow,
|
||||
'allow_gid' => $str_group_allow,
|
||||
'deny_cid' => $str_contact_deny,
|
||||
'deny_gid' => $str_group_deny,
|
||||
];
|
||||
|
||||
// Search for forum mentions
|
||||
foreach (Tag::getFromBody($body, Tag::TAG_CHARACTER[Tag::MENTION] . Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION]) as $tag) {
|
||||
$contact = Contact::getByURLForUser($tag[2], $profile_uid);
|
||||
if (!empty($inform)) {
|
||||
$inform .= ',';
|
||||
}
|
||||
$inform .= 'cid:' . $contact['id'];
|
||||
$item = DI::contentItem()->expandTags($item);
|
||||
|
||||
if (!$toplevel_item_id || empty($contact['cid']) || ($contact['contact-type'] != Contact::TYPE_COMMUNITY)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!empty($contact['prv']) || ($tag[1] == Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION])) {
|
||||
$private_forum = $contact['prv'];
|
||||
$only_to_forum = ($tag[1] == Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION]);
|
||||
$private_id = $contact['id'];
|
||||
$forum_contact = $contact;
|
||||
Logger::info('Private forum or exclusive mention', ['url' => $tag[2], 'mention' => $tag[1]]);
|
||||
} elseif ($str_contact_allow == '<' . $contact['id'] . '>') {
|
||||
$private_forum = false;
|
||||
$only_to_forum = true;
|
||||
$private_id = $contact['id'];
|
||||
$forum_contact = $contact;
|
||||
Logger::info('Public forum', ['url' => $tag[2], 'mention' => $tag[1]]);
|
||||
} else {
|
||||
Logger::info('Post with forum mention will not be converted to a forum post', ['url' => $tag[2], 'mention' => $tag[1]]);
|
||||
}
|
||||
}
|
||||
Logger::info('Got inform', ['inform' => $inform]);
|
||||
}
|
||||
|
||||
$original_contact_id = $contact_id;
|
||||
|
||||
if (!$toplevel_item_id && !empty($forum_contact) && ($private_forum || $only_to_forum)) {
|
||||
// we tagged a forum in a top level post. Now we change the post
|
||||
$private = $private_forum ? Item::PRIVATE : Item::UNLISTED;
|
||||
|
||||
if ($only_to_forum) {
|
||||
$postopts = '';
|
||||
}
|
||||
|
||||
if (!$private_forum) {
|
||||
$str_contact_allow = '';
|
||||
$str_group_allow = '';
|
||||
$str_contact_deny = '';
|
||||
$str_group_deny = '';
|
||||
}
|
||||
|
||||
if ($private_forum || !APContact::getByURL($forum_contact['url'])) {
|
||||
$str_group_allow = '';
|
||||
$str_contact_deny = '';
|
||||
$str_group_deny = '';
|
||||
if ($private_forum) {
|
||||
$str_contact_allow = '<' . $private_id . '>';
|
||||
} else {
|
||||
$str_contact_allow = '';
|
||||
}
|
||||
$contact_id = $private_id;
|
||||
$contact_record = $forum_contact;
|
||||
$_REQUEST['origin'] = false;
|
||||
$wall = 0;
|
||||
}
|
||||
$body = $item['body'];
|
||||
$inform = $item['inform'];
|
||||
$postopts = $item['postopts'];
|
||||
$private = $item['private'];
|
||||
$str_contact_allow = $item['allow_cid'];
|
||||
$str_group_allow = $item['allow_gid'];
|
||||
$str_contact_deny = $item['deny_cid'];
|
||||
$str_group_deny = $item['deny_gid'];
|
||||
} else {
|
||||
$inform = '';
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -472,7 +422,7 @@ function item_post(App $a) {
|
|||
|
||||
$match = null;
|
||||
|
||||
if (!$preview && Photo::setPermissionFromBody($body, $uid, $original_contact_id, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny)) {
|
||||
if (!$preview && Photo::setPermissionFromBody($body, $uid, $contact_id, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny)) {
|
||||
$objecttype = Activity\ObjectType::IMAGE;
|
||||
}
|
||||
|
||||
|
@ -487,7 +437,7 @@ function item_post(App $a) {
|
|||
if (count($attaches)) {
|
||||
foreach ($attaches as $attach) {
|
||||
// Ensure to only modify attachments that you own
|
||||
$srch = '<' . intval($original_contact_id) . '>';
|
||||
$srch = '<' . intval($contact_id) . '>';
|
||||
|
||||
$condition = ['allow_cid' => $srch, 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '',
|
||||
'id' => $attach];
|
||||
|
@ -591,11 +541,11 @@ function item_post(App $a) {
|
|||
$datarray['author-link'] = $author['url'];
|
||||
$datarray['author-avatar'] = $author['thumb'];
|
||||
$datarray['author-id'] = Contact::getIdForURL($datarray['author-link']);
|
||||
$datarray['created'] = DateTimeFormat::utcNow();
|
||||
$datarray['edited'] = DateTimeFormat::utcNow();
|
||||
$datarray['commented'] = DateTimeFormat::utcNow();
|
||||
$datarray['created'] = empty($_REQUEST['created_at']) ? DateTimeFormat::utcNow() : $_REQUEST['created_at'];
|
||||
$datarray['edited'] = $datarray['created'];
|
||||
$datarray['commented'] = $datarray['created'];
|
||||
$datarray['changed'] = $datarray['created'];
|
||||
$datarray['received'] = DateTimeFormat::utcNow();
|
||||
$datarray['changed'] = DateTimeFormat::utcNow();
|
||||
$datarray['extid'] = $extid;
|
||||
$datarray['guid'] = $guid;
|
||||
$datarray['uri'] = $uri;
|
||||
|
@ -671,6 +621,11 @@ function item_post(App $a) {
|
|||
$datarray["id"] = -1;
|
||||
$datarray["uri-id"] = -1;
|
||||
$datarray["author-network"] = Protocol::DFRN;
|
||||
$datarray["author-updated"] = '';
|
||||
$datarray["author-gsid"] = 0;
|
||||
$datarray["author-uri-id"] = ItemURI::getIdByURI($datarray["author-link"]);
|
||||
$datarray["owner-updated"] = '';
|
||||
$datarray["has-media"] = false;
|
||||
|
||||
$o = DI::conversation()->create([array_merge($contact_record, $datarray)], 'search', false, true);
|
||||
|
||||
|
@ -713,21 +668,17 @@ function item_post(App $a) {
|
|||
$datarray['uri-id'] = ItemURI::getIdByURI($datarray['uri']);
|
||||
|
||||
if ($orig_post) {
|
||||
// Fill the cache field
|
||||
// This could be done in Item::update as well - but we have to check for the existance of some fields.
|
||||
Item::putInCache($datarray);
|
||||
|
||||
$fields = [
|
||||
'title' => $datarray['title'],
|
||||
'body' => $datarray['body'],
|
||||
'attach' => $datarray['attach'],
|
||||
'file' => $datarray['file'],
|
||||
'rendered-html' => $datarray['rendered-html'],
|
||||
'rendered-hash' => $datarray['rendered-hash'],
|
||||
'edited' => DateTimeFormat::utcNow(),
|
||||
'changed' => DateTimeFormat::utcNow()];
|
||||
'changed' => DateTimeFormat::utcNow()
|
||||
];
|
||||
|
||||
Item::update($fields, ['id' => $post_id]);
|
||||
Item::updateDisplayCache($datarray['uri-id']);
|
||||
|
||||
if ($return_path) {
|
||||
DI::baseUrl()->redirect($return_path);
|
||||
|
@ -809,12 +760,6 @@ function item_post(App $a) {
|
|||
}
|
||||
}
|
||||
|
||||
// When we are doing some forum posting via ! we have to start the notifier manually.
|
||||
// These kind of posts don't initiate the notifier call in the item class.
|
||||
if ($only_to_forum) {
|
||||
Worker::add(['priority' => PRIORITY_HIGH, 'dont_fork' => false], "Notifier", Delivery::POST, (int)$datarray['uri-id'], (int)$datarray['uid']);
|
||||
}
|
||||
|
||||
Logger::info('post_complete');
|
||||
|
||||
if ($api_source) {
|
||||
|
|
|
@ -308,7 +308,7 @@ function message_content(App $a)
|
|||
$body_e = BBCode::convertForUriId($message['uri-id'], $message['body']);
|
||||
$to_name_e = $message['name'];
|
||||
|
||||
$contact = Contact::getByURL($message['from-url'], false, ['thumb', 'addr', 'id', 'avatar']);
|
||||
$contact = Contact::getByURL($message['from-url'], false, ['thumb', 'addr', 'id', 'avatar', 'url']);
|
||||
$from_photo = Contact::getThumb($contact);
|
||||
|
||||
$mails[] = [
|
||||
|
@ -440,7 +440,7 @@ function render_messages(array $msg, $t)
|
|||
continue;
|
||||
}
|
||||
|
||||
$contact = Contact::getByURL($rr['url'], false, ['thumb', 'addr', 'id', 'avatar']);
|
||||
$contact = Contact::getByURL($rr['url'], false, ['thumb', 'addr', 'id', 'avatar', 'url']);
|
||||
$from_photo = Contact::getThumb($contact);
|
||||
|
||||
$rslt .= Renderer::replaceMacros($tpl, [
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
*/
|
||||
|
||||
use Friendica\App;
|
||||
use Friendica\Core\System;
|
||||
use Friendica\Database\DBA;
|
||||
use Friendica\DI;
|
||||
use Friendica\Model\User;
|
||||
|
@ -37,8 +38,7 @@ function msearch_post(App $a)
|
|||
|
||||
if (!strlen($search)) {
|
||||
$output = ['total' => 0, 'items_page' => $perpage, 'page' => $page, 'results' => $results];
|
||||
echo json_encode($output);
|
||||
exit();
|
||||
System::jsonExit($output);
|
||||
}
|
||||
|
||||
$total = 0;
|
||||
|
@ -60,7 +60,5 @@ function msearch_post(App $a)
|
|||
|
||||
$output = ['total' => $total, 'items_page' => $perpage, 'page' => $page, 'results' => $results];
|
||||
|
||||
echo json_encode($output);
|
||||
|
||||
exit();
|
||||
System::jsonExit($output);
|
||||
}
|
||||
|
|
|
@ -21,7 +21,9 @@
|
|||
|
||||
use Friendica\App;
|
||||
use Friendica\Core\Renderer;
|
||||
use Friendica\Core\System;
|
||||
use Friendica\DI;
|
||||
use Friendica\Module\Response;
|
||||
use Friendica\Module\Security\Login;
|
||||
|
||||
function oexchange_init(App $a) {
|
||||
|
@ -30,8 +32,7 @@ function oexchange_init(App $a) {
|
|||
$tpl = Renderer::getMarkupTemplate('oexchange_xrd.tpl');
|
||||
|
||||
$o = Renderer::replaceMacros($tpl, ['$base' => DI::baseUrl()]);
|
||||
echo $o;
|
||||
exit();
|
||||
System::httpExit($o, Response::TYPE_XML, 'application/xrd+xml');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ use Friendica\Core\Protocol;
|
|||
use Friendica\DI;
|
||||
use Friendica\Model\APContact;
|
||||
use Friendica\Model\Contact;
|
||||
use Friendica\Network\HTTPClient\Client\HttpClientAccept;
|
||||
use Friendica\Protocol\ActivityPub;
|
||||
|
||||
function ostatus_subscribe_content(App $a)
|
||||
|
@ -57,7 +58,7 @@ function ostatus_subscribe_content(App $a)
|
|||
$api = $contact['baseurl'] . '/api/';
|
||||
|
||||
// Fetching friends
|
||||
$curlResult = DI::httpClient()->get($api . 'statuses/friends.json?screen_name=' . $contact['nick']);
|
||||
$curlResult = DI::httpClient()->get($api . 'statuses/friends.json?screen_name=' . $contact['nick'], HttpClientAccept::JSON);
|
||||
|
||||
if (!$curlResult->isSuccess()) {
|
||||
DI::pConfig()->delete($uid, 'ostatus', 'legacy_contact');
|
||||
|
|
|
@ -65,7 +65,7 @@ function photos_init(App $a) {
|
|||
|
||||
if (DI::args()->getArgc() > 1) {
|
||||
$owner = User::getOwnerDataByNick(DI::args()->getArgv()[1]);
|
||||
if (!$owner) {
|
||||
if (empty($owner) || $owner['account_removed']) {
|
||||
throw new HTTPException\NotFoundException(DI::l10n()->t('User not found.'));
|
||||
}
|
||||
|
||||
|
@ -158,7 +158,7 @@ function photos_post(App $a)
|
|||
|
||||
if (!$can_post) {
|
||||
notice(DI::l10n()->t('Permission denied.'));
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
|
||||
$owner_record = User::getOwnerDataById($page_owner_uid);
|
||||
|
@ -166,7 +166,7 @@ function photos_post(App $a)
|
|||
if (!$owner_record) {
|
||||
notice(DI::l10n()->t('Contact information unavailable'));
|
||||
DI::logger()->info('photos_post: unable to locate contact record for page owner. uid=' . $page_owner_uid);
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
|
||||
$aclFormatter = DI::aclFormatter();
|
||||
|
@ -187,7 +187,7 @@ function photos_post(App $a)
|
|||
}
|
||||
|
||||
if (DI::args()->getArgc() > 3 && DI::args()->getArgv()[2] === 'album') {
|
||||
if (!Strings::isHex(DI::args()->getArgv()[3])) {
|
||||
if (!Strings::isHex(DI::args()->getArgv()[3] ?? '')) {
|
||||
DI::baseUrl()->redirect('photos/' . $user['nickname'] . '/album');
|
||||
}
|
||||
$album = hex2bin(DI::args()->getArgv()[3]);
|
||||
|
@ -355,12 +355,6 @@ function photos_post(App $a)
|
|||
if ($albname !== $origaname) {
|
||||
Photo::clearAlbumCache($page_owner_uid);
|
||||
}
|
||||
/* Don't make the item visible if the only change was the album name */
|
||||
|
||||
$visibility = 0;
|
||||
if ($photo['desc'] !== $desc || strlen($rawtags)) {
|
||||
$visibility = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (DBA::isResult($photos) && !$item_id) {
|
||||
|
@ -387,7 +381,7 @@ function photos_post(App $a)
|
|||
$arr['allow_gid'] = $photo['allow_gid'];
|
||||
$arr['deny_cid'] = $photo['deny_cid'];
|
||||
$arr['deny_gid'] = $photo['deny_gid'];
|
||||
$arr['visible'] = $visibility;
|
||||
$arr['visible'] = 0;
|
||||
$arr['origin'] = 1;
|
||||
|
||||
$arr['body'] = '[url=' . DI::baseUrl() . '/photos/' . $user['nickname'] . '/image/' . $photo['resource-id'] . ']'
|
||||
|
@ -549,7 +543,7 @@ function photos_post(App $a)
|
|||
$arr['allow_gid'] = $photo['allow_gid'];
|
||||
$arr['deny_cid'] = $photo['deny_cid'];
|
||||
$arr['deny_gid'] = $photo['deny_gid'];
|
||||
$arr['visible'] = 1;
|
||||
$arr['visible'] = 0;
|
||||
$arr['verb'] = Activity::TAG;
|
||||
$arr['gravity'] = GRAVITY_PARENT;
|
||||
$arr['object-type'] = Activity\ObjectType::PERSON;
|
||||
|
@ -898,7 +892,7 @@ function photos_content(App $a)
|
|||
return;
|
||||
}
|
||||
|
||||
$selname = Strings::isHex($datum) ? hex2bin($datum) : '';
|
||||
$selname = (!is_null($datum) && Strings::isHex($datum)) ? hex2bin($datum) : '';
|
||||
|
||||
$albumselect = '';
|
||||
|
||||
|
@ -960,7 +954,7 @@ function photos_content(App $a)
|
|||
// Display a single photo album
|
||||
if ($datatype === 'album') {
|
||||
// if $datum is not a valid hex, redirect to the default page
|
||||
if (!Strings::isHex($datum)) {
|
||||
if (is_null($datum) || !Strings::isHex($datum)) {
|
||||
DI::baseUrl()->redirect('photos/' . $user['nickname']. '/album');
|
||||
}
|
||||
$album = hex2bin($datum);
|
||||
|
@ -1090,7 +1084,7 @@ function photos_content(App $a)
|
|||
// Display one photo
|
||||
if ($datatype === 'image') {
|
||||
// fetch image, item containing image, then comments
|
||||
$ph = Photo::selectToArray([], ["`uid` = ? AND `resource-id` = ? " . $sql_extra, $owner_uid, $datum], ['order' => ['scale' => true]]);
|
||||
$ph = Photo::selectToArray([], ["`uid` = ? AND `resource-id` = ? " . $sql_extra, $owner_uid, $datum], ['order' => ['scale']]);
|
||||
|
||||
if (!DBA::isResult($ph)) {
|
||||
if (DBA::exists('photo', ['resource-id' => $datum, 'uid' => $owner_uid])) {
|
||||
|
@ -1129,12 +1123,14 @@ function photos_content(App $a)
|
|||
$order_field = $_GET['order'] ?? '';
|
||||
|
||||
if ($order_field === 'posted') {
|
||||
$order = 'ASC';
|
||||
$params = ['order' => [$order_field]];
|
||||
} elseif (!empty($order_field)) {
|
||||
$params = ['order' => [$order_field => true]];
|
||||
} else {
|
||||
$order = 'DESC';
|
||||
$params = [];
|
||||
}
|
||||
|
||||
$prvnxt = Photo::selectToArray(['resource-id'], ["`album` = ? AND `uid` = ? AND `scale` = ?" . $sql_extra, $ph[0]['album'], $owner_uid, 0]);
|
||||
$prvnxt = Photo::selectToArray(['resource-id'], ["`album` = ? AND `uid` = ? AND `scale` = ?" . $sql_extra, $ph[0]['album'], $owner_uid, 0], $params);
|
||||
|
||||
if (DBA::isResult($prvnxt)) {
|
||||
$prv = null;
|
||||
|
@ -1257,14 +1253,12 @@ function photos_content(App $a)
|
|||
$tags = null;
|
||||
|
||||
if (!empty($link_item['id'])) {
|
||||
$tag_text = Tag::getCSVByURIId($link_item['uri-id']);
|
||||
$arr = explode(',', $tag_text);
|
||||
// parse tags and add links
|
||||
$tag_arr = [];
|
||||
foreach ($arr as $tag) {
|
||||
foreach (Tag::getByURIId($link_item['uri-id']) as $tag) {
|
||||
$tag_arr[] = [
|
||||
'name' => BBCode::convert($tag),
|
||||
'removeurl' => '/tagrm/' . $link_item['id'] . '/' . bin2hex($tag)
|
||||
'name' => $tag['name'],
|
||||
'removeurl' => '/tagrm/' . $link_item['id'] . '/' . bin2hex($tag['name'])
|
||||
];
|
||||
}
|
||||
$tags = ['title' => DI::l10n()->t('Tags: '), 'tags' => $tag_arr];
|
||||
|
|
531
mod/ping.php
|
@ -1,531 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2022, 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/>.
|
||||
*
|
||||
*/
|
||||
|
||||
use Friendica\App;
|
||||
use Friendica\Content\ForumManager;
|
||||
use Friendica\Content\Text\BBCode;
|
||||
use Friendica\Core\Cache\Enum\Duration;
|
||||
use Friendica\Core\Hook;
|
||||
use Friendica\Database\DBA;
|
||||
use Friendica\DI;
|
||||
use Friendica\Model\Contact;
|
||||
use Friendica\Model\Group;
|
||||
use Friendica\Model\Notification;
|
||||
use Friendica\Model\Post;
|
||||
use Friendica\Model\Verb;
|
||||
use Friendica\Protocol\Activity;
|
||||
use Friendica\Util\DateTimeFormat;
|
||||
use Friendica\Util\Proxy;
|
||||
use Friendica\Util\Temporal;
|
||||
use Friendica\Util\XML;
|
||||
|
||||
/**
|
||||
* Outputs the counts and the lists of various notifications
|
||||
*
|
||||
* The output format can be controlled via the GET parameter 'format'. It can be
|
||||
* - xml (deprecated legacy default)
|
||||
* - json (outputs JSONP with the 'callback' GET parameter)
|
||||
*
|
||||
* Expected JSON structure:
|
||||
* {
|
||||
* "result": {
|
||||
* "intro": 0,
|
||||
* "mail": 0,
|
||||
* "net": 0,
|
||||
* "home": 0,
|
||||
* "register": 0,
|
||||
* "all-events": 0,
|
||||
* "all-events-today": 0,
|
||||
* "events": 0,
|
||||
* "events-today": 0,
|
||||
* "birthdays": 0,
|
||||
* "birthdays-today": 0,
|
||||
* "groups": [ ],
|
||||
* "forums": [ ],
|
||||
* "notification": 0,
|
||||
* "notifications": [ ],
|
||||
* "sysmsgs": {
|
||||
* "notice": [ ],
|
||||
* "info": [ ]
|
||||
* }
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* @param App $a The Friendica App instance
|
||||
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
|
||||
*/
|
||||
function ping_init(App $a)
|
||||
{
|
||||
$format = 'xml';
|
||||
|
||||
if (isset($_GET['format']) && $_GET['format'] == 'json') {
|
||||
$format = 'json';
|
||||
}
|
||||
|
||||
$regs = [];
|
||||
$notifications = [];
|
||||
|
||||
$intro_count = 0;
|
||||
$mail_count = 0;
|
||||
$home_count = 0;
|
||||
$network_count = 0;
|
||||
$register_count = 0;
|
||||
$sysnotify_count = 0;
|
||||
$groups_unseen = [];
|
||||
$forums_unseen = [];
|
||||
|
||||
$all_events = 0;
|
||||
$all_events_today = 0;
|
||||
$events = 0;
|
||||
$events_today = 0;
|
||||
$birthdays = 0;
|
||||
$birthdays_today = 0;
|
||||
|
||||
$data = [];
|
||||
$data['intro'] = $intro_count;
|
||||
$data['mail'] = $mail_count;
|
||||
$data['net'] = $network_count;
|
||||
$data['home'] = $home_count;
|
||||
$data['register'] = $register_count;
|
||||
|
||||
$data['all-events'] = $all_events;
|
||||
$data['all-events-today'] = $all_events_today;
|
||||
$data['events'] = $events;
|
||||
$data['events-today'] = $events_today;
|
||||
$data['birthdays'] = $birthdays;
|
||||
$data['birthdays-today'] = $birthdays_today;
|
||||
|
||||
if (local_user()) {
|
||||
// Different login session than the page that is calling us.
|
||||
if (!empty($_GET['uid']) && intval($_GET['uid']) != local_user()) {
|
||||
$data = ['result' => ['invalid' => 1]];
|
||||
|
||||
if ($format == 'json') {
|
||||
if (isset($_GET['callback'])) {
|
||||
// JSONP support
|
||||
header("Content-type: application/javascript");
|
||||
echo $_GET['callback'] . '(' . json_encode($data) . ')';
|
||||
} else {
|
||||
header("Content-type: application/json");
|
||||
echo json_encode($data);
|
||||
}
|
||||
} else {
|
||||
header("Content-type: text/xml");
|
||||
echo XML::fromArray($data, $xml);
|
||||
}
|
||||
exit();
|
||||
}
|
||||
|
||||
$notifications = ping_get_notifications(local_user());
|
||||
|
||||
$condition = ["`unseen` AND `uid` = ? AND NOT `origin` AND (`vid` != ? OR `vid` IS NULL)",
|
||||
local_user(), Verb::getID(Activity::FOLLOW)];
|
||||
$items = Post::selectForUser(local_user(), ['wall', 'uid', 'uri-id'], $condition, ['limit' => 1000]);
|
||||
if (DBA::isResult($items)) {
|
||||
$items_unseen = Post::toArray($items, false);
|
||||
$arr = ['items' => $items_unseen];
|
||||
Hook::callAll('network_ping', $arr);
|
||||
|
||||
foreach ($items_unseen as $item) {
|
||||
if ($item['wall']) {
|
||||
$home_count++;
|
||||
} else {
|
||||
$network_count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
DBA::close($items);
|
||||
|
||||
if ($network_count) {
|
||||
// Find out how unseen network posts are spread across groups
|
||||
$group_counts = Group::countUnseen();
|
||||
if (DBA::isResult($group_counts)) {
|
||||
foreach ($group_counts as $group_count) {
|
||||
if ($group_count['count'] > 0) {
|
||||
$groups_unseen[] = $group_count;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$forum_counts = ForumManager::countUnseenItems();
|
||||
if (DBA::isResult($forum_counts)) {
|
||||
foreach ($forum_counts as $forum_count) {
|
||||
if ($forum_count['count'] > 0) {
|
||||
$forums_unseen[] = $forum_count;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$intros1 = DBA::toArray(DBA::p(
|
||||
"SELECT `intro`.`id`, `intro`.`datetime`,
|
||||
`contact`.`name`, `contact`.`url`, `contact`.`photo`
|
||||
FROM `intro` INNER JOIN `contact` ON `intro`.`suggest-cid` = `contact`.`id`
|
||||
WHERE `intro`.`uid` = ? AND NOT `intro`.`blocked` AND NOT `intro`.`ignore` AND `intro`.`suggest-cid` != 0",
|
||||
local_user()
|
||||
));
|
||||
$intros2 = DBA::toArray(DBA::p(
|
||||
"SELECT `intro`.`id`, `intro`.`datetime`,
|
||||
`contact`.`name`, `contact`.`url`, `contact`.`photo`
|
||||
FROM `intro` INNER JOIN `contact` ON `intro`.`contact-id` = `contact`.`id`
|
||||
WHERE `intro`.`uid` = ? AND NOT `intro`.`blocked` AND NOT `intro`.`ignore` AND `intro`.`contact-id` != 0 AND (`intro`.`suggest-cid` = 0 OR `intro`.`suggest-cid` IS NULL)",
|
||||
local_user()
|
||||
));
|
||||
|
||||
$intro_count = count($intros1) + count($intros2);
|
||||
$intros = $intros1 + $intros2;
|
||||
|
||||
$myurl = DI::baseUrl() . '/profile/' . $a->getLoggedInUserNickname();
|
||||
$mail_count = DBA::count('mail', ["`uid` = ? AND NOT `seen` AND `from-url` != ?", local_user(), $myurl]);
|
||||
|
||||
if (intval(DI::config()->get('config', 'register_policy')) === \Friendica\Module\Register::APPROVE && $a->isSiteAdmin()) {
|
||||
$regs = Friendica\Model\Register::getPending();
|
||||
|
||||
if (DBA::isResult($regs)) {
|
||||
$register_count = count($regs);
|
||||
}
|
||||
}
|
||||
|
||||
$cachekey = "ping_init:".local_user();
|
||||
$ev = DI::cache()->get($cachekey);
|
||||
if (is_null($ev)) {
|
||||
$ev = DBA::selectToArray('event', ['type', 'start'],
|
||||
["`uid` = ? AND `start` < ? AND `finish` > ? AND NOT `ignore`",
|
||||
local_user(), DateTimeFormat::utc('now + 7 days'), DateTimeFormat::utcNow()]);
|
||||
if (DBA::isResult($ev)) {
|
||||
DI::cache()->set($cachekey, $ev, Duration::HOUR);
|
||||
}
|
||||
}
|
||||
|
||||
if (DBA::isResult($ev)) {
|
||||
$all_events = count($ev);
|
||||
|
||||
if ($all_events) {
|
||||
$str_now = DateTimeFormat::localNow('Y-m-d');
|
||||
foreach ($ev as $x) {
|
||||
$bd = false;
|
||||
if ($x['type'] === 'birthday') {
|
||||
$birthdays ++;
|
||||
$bd = true;
|
||||
} else {
|
||||
$events ++;
|
||||
}
|
||||
if (DateTimeFormat::local($x['start'], 'Y-m-d') === $str_now) {
|
||||
$all_events_today ++;
|
||||
if ($bd) {
|
||||
$birthdays_today ++;
|
||||
} else {
|
||||
$events_today ++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$data['intro'] = $intro_count;
|
||||
$data['mail'] = $mail_count;
|
||||
$data['net'] = ($network_count < 1000) ? $network_count : '999+';
|
||||
$data['home'] = ($home_count < 1000) ? $home_count : '999+';
|
||||
$data['register'] = $register_count;
|
||||
|
||||
$data['all-events'] = $all_events;
|
||||
$data['all-events-today'] = $all_events_today;
|
||||
$data['events'] = $events;
|
||||
$data['events-today'] = $events_today;
|
||||
$data['birthdays'] = $birthdays;
|
||||
$data['birthdays-today'] = $birthdays_today;
|
||||
|
||||
if (DBA::isResult($notifications)) {
|
||||
foreach ($notifications as $notif) {
|
||||
if ($notif['seen'] == 0) {
|
||||
$sysnotify_count ++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// merge all notification types in one array
|
||||
if (DBA::isResult($intros)) {
|
||||
foreach ($intros as $intro) {
|
||||
$notif = [
|
||||
'id' => 0,
|
||||
'href' => DI::baseUrl() . '/notifications/intros/' . $intro['id'],
|
||||
'name' => BBCode::convert($intro['name']),
|
||||
'url' => $intro['url'],
|
||||
'photo' => $intro['photo'],
|
||||
'date' => $intro['datetime'],
|
||||
'seen' => false,
|
||||
'message' => DI::l10n()->t('{0} wants to be your friend'),
|
||||
];
|
||||
$notifications[] = $notif;
|
||||
}
|
||||
}
|
||||
|
||||
if (DBA::isResult($regs)) {
|
||||
if (count($regs) <= 1 || DI::pConfig()->get(local_user(), 'system', 'detailed_notif')) {
|
||||
foreach ($regs as $reg) {
|
||||
$notif = [
|
||||
'id' => 0,
|
||||
'href' => DI::baseUrl() . '/admin/users/pending',
|
||||
'name' => $reg['name'],
|
||||
'url' => $reg['url'],
|
||||
'photo' => $reg['micro'],
|
||||
'date' => $reg['created'],
|
||||
'seen' => false,
|
||||
'message' => DI::l10n()->t('{0} requested registration'),
|
||||
];
|
||||
$notifications[] = $notif;
|
||||
}
|
||||
} else {
|
||||
$notif = [
|
||||
'id' => 0,
|
||||
'href' => DI::baseUrl() . '/admin/users/pending',
|
||||
'name' => $regs[0]['name'],
|
||||
'url' => $regs[0]['url'],
|
||||
'photo' => $regs[0]['micro'],
|
||||
'date' => $regs[0]['created'],
|
||||
'seen' => false,
|
||||
'message' => DI::l10n()->t('{0} and %d others requested registration', count($regs) - 1),
|
||||
];
|
||||
$notifications[] = $notif;
|
||||
}
|
||||
}
|
||||
|
||||
// sort notifications by $[]['date']
|
||||
$sort_function = function ($a, $b) {
|
||||
$adate = strtotime($a['date']);
|
||||
$bdate = strtotime($b['date']);
|
||||
|
||||
// Unseen messages are kept at the top
|
||||
// The value 31536000 means one year. This should be enough :-)
|
||||
if (!$a['seen']) {
|
||||
$adate += 31536000;
|
||||
}
|
||||
if (!$b['seen']) {
|
||||
$bdate += 31536000;
|
||||
}
|
||||
|
||||
if ($adate == $bdate) {
|
||||
return 0;
|
||||
}
|
||||
return ($adate < $bdate) ? 1 : -1;
|
||||
};
|
||||
usort($notifications, $sort_function);
|
||||
|
||||
array_walk($notifications, function (&$notification) {
|
||||
$notification['photo'] = Contact::getAvatarUrlForUrl($notification['url'], local_user(), Proxy::SIZE_MICRO);
|
||||
$notification['timestamp'] = DateTimeFormat::local($notification['date']);
|
||||
$notification['date'] = Temporal::getRelativeDate($notification['date']);
|
||||
});
|
||||
}
|
||||
|
||||
$sysmsgs = [];
|
||||
$sysmsgs_info = [];
|
||||
|
||||
if (!empty($_SESSION['sysmsg'])) {
|
||||
$sysmsgs = $_SESSION['sysmsg'];
|
||||
unset($_SESSION['sysmsg']);
|
||||
}
|
||||
|
||||
if (!empty($_SESSION['sysmsg_info'])) {
|
||||
$sysmsgs_info = $_SESSION['sysmsg_info'];
|
||||
unset($_SESSION['sysmsg_info']);
|
||||
}
|
||||
|
||||
if ($format == 'json') {
|
||||
$notification_count = $sysnotify_count + $intro_count + $register_count;
|
||||
|
||||
$data['groups'] = $groups_unseen;
|
||||
$data['forums'] = $forums_unseen;
|
||||
$data['notification'] = ($notification_count < 50) ? $notification_count : '49+';
|
||||
$data['notifications'] = $notifications;
|
||||
$data['sysmsgs'] = [
|
||||
'notice' => $sysmsgs,
|
||||
'info' => $sysmsgs_info
|
||||
];
|
||||
|
||||
$json_payload = json_encode(["result" => $data]);
|
||||
|
||||
if (isset($_GET['callback'])) {
|
||||
// JSONP support
|
||||
header("Content-type: application/javascript");
|
||||
echo $_GET['callback'] . '(' . $json_payload . ')';
|
||||
} else {
|
||||
header("Content-type: application/json");
|
||||
echo $json_payload;
|
||||
}
|
||||
} else {
|
||||
// Legacy slower XML format output
|
||||
$data = ping_format_xml_data($data, $sysnotify_count, $notifications, $sysmsgs, $sysmsgs_info, $groups_unseen, $forums_unseen);
|
||||
|
||||
header("Content-type: text/xml");
|
||||
echo XML::fromArray(["result" => $data], $xml);
|
||||
}
|
||||
|
||||
exit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the notifications array for the given user ID
|
||||
*
|
||||
* @param int $uid User id
|
||||
* @return array Associative array of notifications
|
||||
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
|
||||
*/
|
||||
function ping_get_notifications($uid)
|
||||
{
|
||||
$result = [];
|
||||
$offset = 0;
|
||||
$seen = false;
|
||||
$seensql = "NOT";
|
||||
$order = "DESC";
|
||||
$quit = false;
|
||||
|
||||
do {
|
||||
$r = DBA::toArray(DBA::p(
|
||||
"SELECT `notify`.*, `post`.`visible`, `post`.`deleted`
|
||||
FROM `notify` LEFT JOIN `post` ON `post`.`uri-id` = `notify`.`uri-id`
|
||||
WHERE `notify`.`uid` = ? AND `notify`.`msg` != ''
|
||||
AND NOT (`notify`.`type` IN (?, ?))
|
||||
AND $seensql `notify`.`seen` ORDER BY `notify`.`date` $order LIMIT ?, 50",
|
||||
$uid,
|
||||
Notification\Type::INTRO,
|
||||
Notification\Type::MAIL,
|
||||
$offset
|
||||
));
|
||||
|
||||
if (!$r && !$seen) {
|
||||
$seen = true;
|
||||
$seensql = "";
|
||||
$order = "DESC";
|
||||
$offset = 0;
|
||||
} elseif (!$r) {
|
||||
$quit = true;
|
||||
} else {
|
||||
$offset += 50;
|
||||
}
|
||||
|
||||
foreach ($r as $notification) {
|
||||
if (is_null($notification["visible"])) {
|
||||
$notification["visible"] = true;
|
||||
}
|
||||
|
||||
if (is_null($notification["deleted"])) {
|
||||
$notification["deleted"] = 0;
|
||||
}
|
||||
|
||||
if ($notification["msg_cache"]) {
|
||||
$notification["name"] = $notification["name_cache"];
|
||||
$notification["message"] = $notification["msg_cache"];
|
||||
} else {
|
||||
$notification["name"] = strip_tags(BBCode::convert($notification["name"]));
|
||||
$notification["message"] = \Friendica\Navigation\Notifications\Entity\Notify::formatMessage($notification["name"], BBCode::toPlaintext($notification["msg"]));
|
||||
|
||||
// @todo Replace this with a call of the Notify model class
|
||||
DBA::update('notify', ['name_cache' => $notification["name"], 'msg_cache' => $notification["message"]], ['id' => $notification["id"]]);
|
||||
}
|
||||
|
||||
$notification["href"] = DI::baseUrl() . "/notification/" . $notification["id"];
|
||||
|
||||
if ($notification["visible"]
|
||||
&& !$notification["deleted"]
|
||||
&& empty($result['p:' . $notification['parent']])
|
||||
) {
|
||||
// Should we condense the notifications or show them all?
|
||||
if (($notification['verb'] != Activity::POST) || DI::pConfig()->get(local_user(), 'system', 'detailed_notif')) {
|
||||
$result[] = $notification;
|
||||
} else {
|
||||
$result['p:' . $notification['parent']] = $notification;
|
||||
}
|
||||
}
|
||||
}
|
||||
} while ((count($result) < 50) && !$quit);
|
||||
|
||||
return($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Backward-compatible XML formatting for ping.php output
|
||||
* @deprecated
|
||||
*
|
||||
* @param array $data The initial ping data array
|
||||
* @param int $sysnotify_count Number of unseen system notifications
|
||||
* @param array $notifs Complete list of notification
|
||||
* @param array $sysmsgs List of system notice messages
|
||||
* @param array $sysmsgs_info List of system info messages
|
||||
* @param array $groups_unseen List of unseen group items
|
||||
* @param array $forums_unseen List of unseen forum items
|
||||
*
|
||||
* @return array XML-transform ready data array
|
||||
*/
|
||||
function ping_format_xml_data($data, $sysnotify_count, $notifs, $sysmsgs, $sysmsgs_info, $groups_unseen, $forums_unseen)
|
||||
{
|
||||
$notifications = [];
|
||||
foreach ($notifs as $key => $notif) {
|
||||
$notifications[$key . ':note'] = $notif['message'];
|
||||
|
||||
$notifications[$key . ':@attributes'] = [
|
||||
'id' => $notif['id'],
|
||||
'href' => $notif['href'],
|
||||
'name' => $notif['name'],
|
||||
'url' => $notif['url'],
|
||||
'photo' => $notif['photo'],
|
||||
'date' => $notif['date'],
|
||||
'seen' => $notif['seen'],
|
||||
'timestamp' => $notif['timestamp']
|
||||
];
|
||||
}
|
||||
|
||||
$sysmsg = [];
|
||||
foreach ($sysmsgs as $key => $m) {
|
||||
$sysmsg[$key . ':notice'] = $m;
|
||||
}
|
||||
foreach ($sysmsgs_info as $key => $m) {
|
||||
$sysmsg[$key . ':info'] = $m;
|
||||
}
|
||||
|
||||
$data['notif'] = $notifications;
|
||||
$data['@attributes'] = ['count' => $sysnotify_count + $data['intro'] + $data['mail'] + $data['register']];
|
||||
$data['sysmsgs'] = $sysmsg;
|
||||
|
||||
if ($data['register'] == 0) {
|
||||
unset($data['register']);
|
||||
}
|
||||
|
||||
$groups = [];
|
||||
if (count($groups_unseen)) {
|
||||
foreach ($groups_unseen as $key => $item) {
|
||||
$groups[$key . ':group'] = $item['count'];
|
||||
$groups[$key . ':@attributes'] = ['id' => $item['id']];
|
||||
}
|
||||
$data['groups'] = $groups;
|
||||
}
|
||||
|
||||
$forums = [];
|
||||
if (count($forums_unseen)) {
|
||||
foreach ($forums_unseen as $key => $item) {
|
||||
$forums[$key . ':forum'] = $item['count'];
|
||||
$forums[$key . ':@attributes'] = ['id' => $item['id']];
|
||||
}
|
||||
$data['forums'] = $forums;
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
18
mod/poco.php
|
@ -25,9 +25,11 @@ use Friendica\Content\Text\BBCode;
|
|||
use Friendica\Core\Logger;
|
||||
use Friendica\Core\Protocol;
|
||||
use Friendica\Core\Renderer;
|
||||
use Friendica\Core\System;
|
||||
use Friendica\Database\DBA;
|
||||
use Friendica\DI;
|
||||
use Friendica\Util\Strings;
|
||||
use Friendica\Module\Response;
|
||||
use Friendica\Util\DateTimeFormat;
|
||||
use Friendica\Util\XML;
|
||||
|
||||
function poco_init(App $a) {
|
||||
|
@ -121,10 +123,12 @@ function poco_init(App $a) {
|
|||
if (isset($contact['account-type'])) {
|
||||
$contact['contact-type'] = $contact['account-type'];
|
||||
}
|
||||
$about = DI::cache()->get("about:" . $contact['updated'] . ":" . $contact['nurl']);
|
||||
|
||||
$cacheKey = 'about:' . $contact['nick'] . ':' . DateTimeFormat::utc($contact['updated'], DateTimeFormat::ATOM);
|
||||
$about = DI::cache()->get($cacheKey);
|
||||
if (is_null($about)) {
|
||||
$about = BBCode::convertForUriId($contact['uri-id'], $contact['about']);
|
||||
DI::cache()->set("about:" . $contact['updated'] . ":" . $contact['nurl'], $about);
|
||||
DI::cache()->set($cacheKey, $about);
|
||||
}
|
||||
|
||||
// Non connected persons can only see the keywords of a Diaspora account
|
||||
|
@ -226,14 +230,10 @@ function poco_init(App $a) {
|
|||
Logger::info("End of poco");
|
||||
|
||||
if ($format === 'xml') {
|
||||
header('Content-type: text/xml');
|
||||
echo Renderer::replaceMacros(Renderer::getMarkupTemplate('poco_xml.tpl'), XML::arrayEscape(['$response' => $ret]));
|
||||
exit();
|
||||
System::httpExit(Renderer::replaceMacros(Renderer::getMarkupTemplate('poco_xml.tpl'), XML::arrayEscape(['$response' => $ret])), Response::TYPE_XML);
|
||||
}
|
||||
if ($format === 'json') {
|
||||
header('Content-type: application/json');
|
||||
echo json_encode($ret);
|
||||
exit();
|
||||
System::jsonExit($ret);
|
||||
} else {
|
||||
throw new \Friendica\Network\HTTPException\InternalServerErrorException();
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
use Friendica\App;
|
||||
use Friendica\Core\Logger;
|
||||
use Friendica\Core\Protocol;
|
||||
use Friendica\Core\System;
|
||||
use Friendica\Database\DBA;
|
||||
use Friendica\DI;
|
||||
use Friendica\Model\Contact;
|
||||
|
@ -38,7 +39,7 @@ function hub_return($valid, $body)
|
|||
} else {
|
||||
throw new \Friendica\Network\HTTPException\NotFoundException();
|
||||
}
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
|
||||
// when receiving an XML feed, always return OK
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
use Friendica\App;
|
||||
use Friendica\Core\Logger;
|
||||
use Friendica\Core\System;
|
||||
use Friendica\Database\DBA;
|
||||
use Friendica\DI;
|
||||
use Friendica\Model\PushSubscriber;
|
||||
|
@ -142,5 +143,5 @@ function pubsubhubbub_init(App $a) {
|
|||
|
||||
throw new \Friendica\Network\HTTPException\AcceptedException();
|
||||
}
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
|
|
|
@ -27,6 +27,8 @@ use Friendica\Database\DBA;
|
|||
use Friendica\DI;
|
||||
use Friendica\Model\Contact;
|
||||
use Friendica\Model\Profile;
|
||||
use Friendica\Network\HTTPClient\Client\HttpClientAccept;
|
||||
use Friendica\Network\HTTPClient\Client\HttpClientOptions;
|
||||
use Friendica\Util\Strings;
|
||||
|
||||
function redir_init(App $a) {
|
||||
|
@ -142,7 +144,7 @@ function redir_magic($a, $cid, $url)
|
|||
}
|
||||
|
||||
// Test for magic auth on the target system
|
||||
$serverret = DI::httpClient()->get($basepath . '/magic');
|
||||
$serverret = DI::httpClient()->head($basepath . '/magic', [HttpClientOptions::ACCEPT_CONTENT => HttpClientAccept::HTML]);
|
||||
if ($serverret->isSuccess()) {
|
||||
$separator = strpos($target_url, '?') ? '&' : '?';
|
||||
$target_url .= $separator . 'zrl=' . urlencode($visitor) . '&addr=' . urlencode($contact_url);
|
||||
|
|
|
@ -57,12 +57,14 @@ function removeme_post(App $a)
|
|||
continue;
|
||||
}
|
||||
|
||||
$l10n = DI::l10n()->withLang($admin['language']);
|
||||
|
||||
$email = DI::emailer()
|
||||
->newSystemMail()
|
||||
->withMessage(
|
||||
DI::l10n()->t('[Friendica System Notify]') . ' ' . DI::l10n()->t('User deleted their account'),
|
||||
DI::l10n()->t('On your Friendica node an user deleted their account. Please ensure that their data is removed from the backups.'),
|
||||
DI::l10n()->t('The user id is %d', local_user()))
|
||||
$l10n->t('[Friendica System Notify]') . ' ' . $l10n->t('User deleted their account'),
|
||||
$l10n->t('On your Friendica node an user deleted their account. Please ensure that their data is removed from the backups.'),
|
||||
$l10n->t('The user id is %d', local_user()))
|
||||
->forUser($admin)
|
||||
->withRecipient($admin['email'])
|
||||
->build();
|
||||
|
|
502
mod/settings.php
|
@ -23,22 +23,16 @@ use Friendica\App;
|
|||
use Friendica\BaseModule;
|
||||
use Friendica\Content\Feature;
|
||||
use Friendica\Content\Nav;
|
||||
use Friendica\Core\ACL;
|
||||
use Friendica\Core\Hook;
|
||||
use Friendica\Core\Logger;
|
||||
use Friendica\Core\Renderer;
|
||||
use Friendica\Core\Worker;
|
||||
use Friendica\Database\DBA;
|
||||
use Friendica\DI;
|
||||
use Friendica\Model\Group;
|
||||
use Friendica\Model\Notification;
|
||||
use Friendica\Model\Profile;
|
||||
use Friendica\Model\Item;
|
||||
use Friendica\Model\User;
|
||||
use Friendica\Module\BaseSettings;
|
||||
use Friendica\Module\Security\Login;
|
||||
use Friendica\Protocol\Email;
|
||||
use Friendica\Util\Temporal;
|
||||
use Friendica\Worker\Delivery;
|
||||
|
||||
function settings_init(App $a)
|
||||
{
|
||||
|
@ -107,7 +101,7 @@ function settings_post(App $a)
|
|||
'port' => $mail_port,
|
||||
'ssltype' => $mail_ssl,
|
||||
'user' => $mail_user,
|
||||
`action` => $mail_action,
|
||||
'action' => $mail_action,
|
||||
'movetofolder' => $mail_movetofolder,
|
||||
'mailbox' => 'INBOX',
|
||||
'reply_to' => $mail_replyto,
|
||||
|
@ -146,258 +140,8 @@ function settings_post(App $a)
|
|||
}
|
||||
return;
|
||||
}
|
||||
|
||||
BaseModule::checkFormSecurityTokenRedirectOnError('/settings', 'settings');
|
||||
|
||||
// Import Contacts from CSV file
|
||||
if (!empty($_POST['importcontact-submit'])) {
|
||||
if (isset($_FILES['importcontact-filename'])) {
|
||||
// was there an error
|
||||
if ($_FILES['importcontact-filename']['error'] > 0) {
|
||||
Logger::notice('Contact CSV file upload error', ['error' => $_FILES['importcontact-filename']['error']]);
|
||||
notice(DI::l10n()->t('Contact CSV file upload error'));
|
||||
} else {
|
||||
$csvArray = array_map('str_getcsv', file($_FILES['importcontact-filename']['tmp_name']));
|
||||
Logger::notice('Import started', ['lines' => count($csvArray)]);
|
||||
// import contacts
|
||||
foreach ($csvArray as $csvRow) {
|
||||
// The 1st row may, or may not contain the headers of the table
|
||||
// We expect the 1st field of the row to contain either the URL
|
||||
// or the handle of the account, therefore we check for either
|
||||
// "http" or "@" to be present in the string.
|
||||
// All other fields from the row will be ignored
|
||||
if ((strpos($csvRow[0],'@') !== false) || in_array(parse_url($csvRow[0], PHP_URL_SCHEME), ['http', 'https'])) {
|
||||
Worker::add(PRIORITY_LOW, 'AddContact', $_SESSION['uid'], $csvRow[0]);
|
||||
} else {
|
||||
Logger::notice('Invalid account', ['url' => $csvRow[0]]);
|
||||
}
|
||||
}
|
||||
Logger::notice('Import done');
|
||||
|
||||
info(DI::l10n()->t('Importing Contacts done'));
|
||||
// delete temp file
|
||||
unlink($_FILES['importcontact-filename']['tmp_name']);
|
||||
}
|
||||
} else {
|
||||
Logger::notice('Import triggered, but no import file was found.');
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (!empty($_POST['resend_relocate'])) {
|
||||
Worker::add(PRIORITY_HIGH, 'Notifier', Delivery::RELOCATION, local_user());
|
||||
info(DI::l10n()->t("Relocate message has been send to your contacts"));
|
||||
DI::baseUrl()->redirect('settings');
|
||||
}
|
||||
|
||||
Hook::callAll('settings_post', $_POST);
|
||||
|
||||
if (!empty($_POST['password']) || !empty($_POST['confirm'])) {
|
||||
$newpass = $_POST['password'];
|
||||
$confirm = $_POST['confirm'];
|
||||
|
||||
try {
|
||||
if ($newpass != $confirm) {
|
||||
throw new Exception(DI::l10n()->t('Passwords do not match.'));
|
||||
}
|
||||
|
||||
// check if the old password was supplied correctly before changing it to the new value
|
||||
User::getIdFromPasswordAuthentication(local_user(), $_POST['opassword']);
|
||||
|
||||
$result = User::updatePassword(local_user(), $newpass);
|
||||
if (!DBA::isResult($result)) {
|
||||
throw new Exception(DI::l10n()->t('Password update failed. Please try again.'));
|
||||
}
|
||||
|
||||
info(DI::l10n()->t('Password changed.'));
|
||||
} catch (Exception $e) {
|
||||
notice($e->getMessage());
|
||||
notice(DI::l10n()->t('Password unchanged.'));
|
||||
}
|
||||
}
|
||||
|
||||
$username = (!empty($_POST['username']) ? trim($_POST['username']) : '');
|
||||
$email = (!empty($_POST['email']) ? trim($_POST['email']) : '');
|
||||
$timezone = (!empty($_POST['timezone']) ? trim($_POST['timezone']) : '');
|
||||
$language = (!empty($_POST['language']) ? trim($_POST['language']) : '');
|
||||
|
||||
$defloc = (!empty($_POST['defloc']) ? trim($_POST['defloc']) : '');
|
||||
$maxreq = (!empty($_POST['maxreq']) ? intval($_POST['maxreq']) : 0);
|
||||
$expire = (!empty($_POST['expire']) ? intval($_POST['expire']) : 0);
|
||||
$def_gid = (!empty($_POST['group-selection']) ? intval($_POST['group-selection']) : 0);
|
||||
|
||||
|
||||
$expire_items = (!empty($_POST['expire_items']) ? intval($_POST['expire_items']) : 0);
|
||||
$expire_notes = (!empty($_POST['expire_notes']) ? intval($_POST['expire_notes']) : 0);
|
||||
$expire_starred = (!empty($_POST['expire_starred']) ? intval($_POST['expire_starred']) : 0);
|
||||
$expire_photos = (!empty($_POST['expire_photos'])? intval($_POST['expire_photos']) : 0);
|
||||
$expire_network_only = (!empty($_POST['expire_network_only'])? intval($_POST['expire_network_only']) : 0);
|
||||
|
||||
$delete_openid = ((!empty($_POST['delete_openid']) && (intval($_POST['delete_openid']) == 1)) ? 1: 0);
|
||||
|
||||
$allow_location = ((!empty($_POST['allow_location']) && (intval($_POST['allow_location']) == 1)) ? 1: 0);
|
||||
$publish = ((!empty($_POST['profile_in_directory']) && (intval($_POST['profile_in_directory']) == 1)) ? 1: 0);
|
||||
$net_publish = ((!empty($_POST['profile_in_netdirectory']) && (intval($_POST['profile_in_netdirectory']) == 1)) ? 1: 0);
|
||||
$old_visibility = ((!empty($_POST['visibility']) && (intval($_POST['visibility']) == 1)) ? 1 : 0);
|
||||
$account_type = ((!empty($_POST['account-type']) && (intval($_POST['account-type']))) ? intval($_POST['account-type']) : 0);
|
||||
$page_flags = ((!empty($_POST['page-flags']) && (intval($_POST['page-flags']))) ? intval($_POST['page-flags']) : 0);
|
||||
$blockwall = ((!empty($_POST['blockwall']) && (intval($_POST['blockwall']) == 1)) ? 0: 1); // this setting is inverted!
|
||||
$blocktags = ((!empty($_POST['blocktags']) && (intval($_POST['blocktags']) == 1)) ? 0: 1); // this setting is inverted!
|
||||
$unkmail = ((!empty($_POST['unkmail']) && (intval($_POST['unkmail']) == 1)) ? 1: 0);
|
||||
$cntunkmail = (!empty($_POST['cntunkmail']) ? intval($_POST['cntunkmail']) : 0);
|
||||
$hide_friends = (($_POST['hide-friends'] == 1) ? 1: 0);
|
||||
$hidewall = (($_POST['hidewall'] == 1) ? 1: 0);
|
||||
$unlisted = (($_POST['unlisted'] == 1) ? 1: 0);
|
||||
$accessiblephotos = (($_POST['accessible-photos'] == 1) ? 1: 0);
|
||||
|
||||
$notify_like = (($_POST['notify_like'] == 1) ? 1 : 0);
|
||||
$notify_announce = (($_POST['notify_announce'] == 1) ? 1 : 0);
|
||||
|
||||
$email_textonly = (($_POST['email_textonly'] == 1) ? 1 : 0);
|
||||
$detailed_notif = (($_POST['detailed_notif'] == 1) ? 1 : 0);
|
||||
|
||||
$notify_ignored = (($_POST['notify_ignored'] == 1) ? 1 : 0);
|
||||
|
||||
$notify = 0;
|
||||
|
||||
if (!empty($_POST['notify1'])) {
|
||||
$notify += intval($_POST['notify1']);
|
||||
}
|
||||
if (!empty($_POST['notify2'])) {
|
||||
$notify += intval($_POST['notify2']);
|
||||
}
|
||||
if (!empty($_POST['notify3'])) {
|
||||
$notify += intval($_POST['notify3']);
|
||||
}
|
||||
if (!empty($_POST['notify4'])) {
|
||||
$notify += intval($_POST['notify4']);
|
||||
}
|
||||
if (!empty($_POST['notify5'])) {
|
||||
$notify += intval($_POST['notify5']);
|
||||
}
|
||||
if (!empty($_POST['notify6'])) {
|
||||
$notify += intval($_POST['notify6']);
|
||||
}
|
||||
if (!empty($_POST['notify7'])) {
|
||||
$notify += intval($_POST['notify7']);
|
||||
}
|
||||
if (!empty($_POST['notify8'])) {
|
||||
$notify += intval($_POST['notify8']);
|
||||
}
|
||||
|
||||
// Adjust the page flag if the account type doesn't fit to the page flag.
|
||||
if (($account_type == User::ACCOUNT_TYPE_PERSON) && !in_array($page_flags, [User::PAGE_FLAGS_NORMAL, User::PAGE_FLAGS_SOAPBOX, User::PAGE_FLAGS_FREELOVE])) {
|
||||
$page_flags = User::PAGE_FLAGS_NORMAL;
|
||||
} elseif (($account_type == User::ACCOUNT_TYPE_ORGANISATION) && !in_array($page_flags, [User::PAGE_FLAGS_SOAPBOX])) {
|
||||
$page_flags = User::PAGE_FLAGS_SOAPBOX;
|
||||
} elseif (($account_type == User::ACCOUNT_TYPE_NEWS) && !in_array($page_flags, [User::PAGE_FLAGS_SOAPBOX])) {
|
||||
$page_flags = User::PAGE_FLAGS_SOAPBOX;
|
||||
} elseif (($account_type == User::ACCOUNT_TYPE_COMMUNITY) && !in_array($page_flags, [User::PAGE_FLAGS_COMMUNITY, User::PAGE_FLAGS_PRVGROUP])) {
|
||||
$page_flags = User::PAGE_FLAGS_COMMUNITY;
|
||||
}
|
||||
|
||||
$err = '';
|
||||
|
||||
if ($username != $user['username']) {
|
||||
if (strlen($username) > 40) {
|
||||
$err .= DI::l10n()->t('Please use a shorter name.');
|
||||
}
|
||||
if (strlen($username) < 3) {
|
||||
$err .= DI::l10n()->t('Name too short.');
|
||||
}
|
||||
}
|
||||
|
||||
if ($email != $user['email']) {
|
||||
// check for the correct password
|
||||
try {
|
||||
User::getIdFromPasswordAuthentication(local_user(), $_POST['mpassword']);
|
||||
} catch (Exception $ex) {
|
||||
$err .= DI::l10n()->t('Wrong Password.');
|
||||
$email = $user['email'];
|
||||
}
|
||||
// check the email is valid
|
||||
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||
$err .= DI::l10n()->t('Invalid email.');
|
||||
}
|
||||
// ensure new email is not the admin mail
|
||||
if (DI::config()->get('config', 'admin_email')) {
|
||||
$adminlist = explode(",", str_replace(" ", "", strtolower(DI::config()->get('config', 'admin_email'))));
|
||||
if (in_array(strtolower($email), $adminlist)) {
|
||||
$err .= DI::l10n()->t('Cannot change to that email.');
|
||||
$email = $user['email'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (strlen($err)) {
|
||||
notice($err);
|
||||
return;
|
||||
}
|
||||
|
||||
if (($timezone != $user['timezone']) && strlen($timezone)) {
|
||||
$a->setTimeZone($timezone);
|
||||
}
|
||||
|
||||
$aclFormatter = DI::aclFormatter();
|
||||
|
||||
$str_group_allow = !empty($_POST['group_allow']) ? $aclFormatter->toString($_POST['group_allow']) : '';
|
||||
$str_contact_allow = !empty($_POST['contact_allow']) ? $aclFormatter->toString($_POST['contact_allow']) : '';
|
||||
$str_group_deny = !empty($_POST['group_deny']) ? $aclFormatter->toString($_POST['group_deny']) : '';
|
||||
$str_contact_deny = !empty($_POST['contact_deny']) ? $aclFormatter->toString($_POST['contact_deny']) : '';
|
||||
|
||||
DI::pConfig()->set(local_user(), 'expire', 'items', $expire_items);
|
||||
DI::pConfig()->set(local_user(), 'expire', 'notes', $expire_notes);
|
||||
DI::pConfig()->set(local_user(), 'expire', 'starred', $expire_starred);
|
||||
DI::pConfig()->set(local_user(), 'expire', 'photos', $expire_photos);
|
||||
DI::pConfig()->set(local_user(), 'expire', 'network_only', $expire_network_only);
|
||||
|
||||
DI::pConfig()->set(local_user(), 'system', 'notify_like', $notify_like);
|
||||
DI::pConfig()->set(local_user(), 'system', 'notify_announce', $notify_announce);
|
||||
|
||||
DI::pConfig()->set(local_user(), 'system', 'email_textonly', $email_textonly);
|
||||
DI::pConfig()->set(local_user(), 'system', 'detailed_notif', $detailed_notif);
|
||||
DI::pConfig()->set(local_user(), 'system', 'notify_ignored', $notify_ignored);
|
||||
DI::pConfig()->set(local_user(), 'system', 'unlisted', $unlisted);
|
||||
DI::pConfig()->set(local_user(), 'system', 'accessible-photos', $accessiblephotos);
|
||||
|
||||
if ($page_flags == User::PAGE_FLAGS_PRVGROUP) {
|
||||
$hidewall = 1;
|
||||
if (!$str_contact_allow && !$str_group_allow && !$str_contact_deny && !$str_group_deny) {
|
||||
if ($def_gid) {
|
||||
info(DI::l10n()->t('Private forum has no privacy permissions. Using default privacy group.'));
|
||||
$str_group_allow = '<' . $def_gid . '>';
|
||||
} else {
|
||||
notice(DI::l10n()->t('Private forum has no privacy permissions and no default privacy group.'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$fields = ['username' => $username, 'email' => $email, 'timezone' => $timezone,
|
||||
'allow_cid' => $str_contact_allow, 'allow_gid' => $str_group_allow, 'deny_cid' => $str_contact_deny, 'deny_gid' => $str_group_deny,
|
||||
'notify-flags' => $notify, 'page-flags' => $page_flags, 'account-type' => $account_type, 'default-location' => $defloc,
|
||||
'allow_location' => $allow_location, 'maxreq' => $maxreq, 'expire' => $expire, 'def_gid' => $def_gid, 'blockwall' => $blockwall,
|
||||
'hidewall' => $hidewall, 'blocktags' => $blocktags, 'unkmail' => $unkmail, 'cntunkmail' => $cntunkmail, 'language' => $language];
|
||||
|
||||
if ($delete_openid) {
|
||||
$fields['openid'] = '';
|
||||
$fields['openidserver'] = '';
|
||||
}
|
||||
|
||||
$profile_fields = ['publish' => $publish, 'net-publish' => $net_publish, 'hide-friends' => $hide_friends];
|
||||
|
||||
if (!User::update($fields, local_user()) || !Profile::update($profile_fields, local_user())) {
|
||||
notice(DI::l10n()->t('Settings were not updated.'));
|
||||
}
|
||||
|
||||
// clear session language
|
||||
unset($_SESSION['language']);
|
||||
|
||||
DI::baseUrl()->redirect('settings');
|
||||
return; // NOTREACHED
|
||||
}
|
||||
|
||||
|
||||
function settings_content(App $a)
|
||||
{
|
||||
$o = '';
|
||||
|
@ -570,7 +314,17 @@ function settings_content(App $a)
|
|||
'$ostat_enabled' => $ostat_enabled,
|
||||
|
||||
'$general_settings' => DI::l10n()->t('General Social Media Settings'),
|
||||
'$accept_only_sharer' => ['accept_only_sharer', DI::l10n()->t('Accept only top level posts by contacts you follow'), $accept_only_sharer, DI::l10n()->t('The system does an auto completion of threads when a comment arrives. This has got the side effect that you can receive posts that had been started by a non-follower but had been commented by someone you follow. This setting deactivates this behaviour. When activated, you strictly only will receive posts from people you really do follow.')],
|
||||
'$accept_only_sharer' => [
|
||||
'accept_only_sharer',
|
||||
DI::l10n()->t('Followed content scope'),
|
||||
$accept_only_sharer,
|
||||
DI::l10n()->t('By default, conversations in which your follows participated but didn\'t start will be shown in your timeline. You can turn this behavior off, or expand it to the conversations in which your follows liked a post.'),
|
||||
[
|
||||
Item::COMPLETION_NONE => DI::l10n()->t('Only conversations my follows started'),
|
||||
Item::COMPLETION_COMMENT => DI::l10n()->t('Conversations my follows started or commented on (default)'),
|
||||
Item::COMPLETION_LIKE => DI::l10n()->t('Any conversation my follows interacted with, including likes'),
|
||||
]
|
||||
],
|
||||
'$enable_cw' => ['enable_cw', DI::l10n()->t('Enable Content Warning'), $enable_cw, DI::l10n()->t('Users on networks like Mastodon or Pleroma are able to set a content warning field which collapse their post by default. This enables the automatic collapsing instead of setting the content warning as the post title. Doesn\'t affect any other content filtering you eventually set up.')],
|
||||
'$enable_smart_shortening' => ['enable_smart_shortening', DI::l10n()->t('Enable intelligent shortening'), $enable_smart_shortening, DI::l10n()->t('Normally the system tries to find the best link to add to shortened posts. If disabled, every shortened post will always point to the original friendica post.')],
|
||||
'$simple_shortening' => ['simple_shortening', DI::l10n()->t('Enable simple text shortening'), $simple_shortening, DI::l10n()->t('Normally the system shortens posts at the next line feed. If this option is enabled then the system will shorten the text at the maximum character limit.')],
|
||||
|
@ -601,234 +355,4 @@ function settings_content(App $a)
|
|||
Hook::callAll('display_settings', $o);
|
||||
return $o;
|
||||
}
|
||||
|
||||
/*
|
||||
* ACCOUNT SETTINGS
|
||||
*/
|
||||
|
||||
$profile = DBA::selectFirst('profile', [], ['uid' => local_user()]);
|
||||
if (!DBA::isResult($profile)) {
|
||||
notice(DI::l10n()->t('Unable to find your profile. Please contact your admin.'));
|
||||
return '';
|
||||
}
|
||||
|
||||
$user = User::getById($a->getLoggedInUserId());
|
||||
|
||||
$username = $user['username'];
|
||||
$email = $user['email'];
|
||||
$nickname = $a->getLoggedInUserNickname();
|
||||
$timezone = $user['timezone'];
|
||||
$language = $user['language'];
|
||||
$notify = $user['notify-flags'];
|
||||
$defloc = $user['default-location'];
|
||||
$openid = $user['openid'];
|
||||
$maxreq = $user['maxreq'];
|
||||
$expire = ((intval($user['expire'])) ? $user['expire'] : '');
|
||||
$unkmail = $user['unkmail'];
|
||||
$cntunkmail = $user['cntunkmail'];
|
||||
|
||||
$expire_items = DI::pConfig()->get(local_user(), 'expire', 'items', true);
|
||||
$expire_notes = DI::pConfig()->get(local_user(), 'expire', 'notes', true);
|
||||
$expire_starred = DI::pConfig()->get(local_user(), 'expire', 'starred', true);
|
||||
$expire_photos = DI::pConfig()->get(local_user(), 'expire', 'photos', false);
|
||||
$expire_network_only = DI::pConfig()->get(local_user(), 'expire', 'network_only', false);
|
||||
|
||||
if (!strlen($user['timezone'])) {
|
||||
$timezone = $a->getTimeZone();
|
||||
}
|
||||
|
||||
// Set the account type to "Community" when the page is a community page but the account type doesn't fit
|
||||
// This is only happening on the first visit after the update
|
||||
if (in_array($user['page-flags'], [User::PAGE_FLAGS_COMMUNITY, User::PAGE_FLAGS_PRVGROUP]) &&
|
||||
($user['account-type'] != User::ACCOUNT_TYPE_COMMUNITY))
|
||||
$user['account-type'] = User::ACCOUNT_TYPE_COMMUNITY;
|
||||
|
||||
$pageset_tpl = Renderer::getMarkupTemplate('settings/pagetypes.tpl');
|
||||
|
||||
$pagetype = Renderer::replaceMacros($pageset_tpl, [
|
||||
'$account_types' => DI::l10n()->t("Account Types"),
|
||||
'$user' => DI::l10n()->t("Personal Page Subtypes"),
|
||||
'$community' => DI::l10n()->t("Community Forum Subtypes"),
|
||||
'$account_type' => $user['account-type'],
|
||||
'$type_person' => User::ACCOUNT_TYPE_PERSON,
|
||||
'$type_organisation' => User::ACCOUNT_TYPE_ORGANISATION,
|
||||
'$type_news' => User::ACCOUNT_TYPE_NEWS,
|
||||
'$type_community' => User::ACCOUNT_TYPE_COMMUNITY,
|
||||
|
||||
'$account_person' => ['account-type', DI::l10n()->t('Personal Page'), User::ACCOUNT_TYPE_PERSON,
|
||||
DI::l10n()->t('Account for a personal profile.'),
|
||||
($user['account-type'] == User::ACCOUNT_TYPE_PERSON)],
|
||||
|
||||
'$account_organisation' => ['account-type', DI::l10n()->t('Organisation Page'), User::ACCOUNT_TYPE_ORGANISATION,
|
||||
DI::l10n()->t('Account for an organisation that automatically approves contact requests as "Followers".'),
|
||||
($user['account-type'] == User::ACCOUNT_TYPE_ORGANISATION)],
|
||||
|
||||
'$account_news' => ['account-type', DI::l10n()->t('News Page'), User::ACCOUNT_TYPE_NEWS,
|
||||
DI::l10n()->t('Account for a news reflector that automatically approves contact requests as "Followers".'),
|
||||
($user['account-type'] == User::ACCOUNT_TYPE_NEWS)],
|
||||
|
||||
'$account_community' => ['account-type', DI::l10n()->t('Community Forum'), User::ACCOUNT_TYPE_COMMUNITY,
|
||||
DI::l10n()->t('Account for community discussions.'),
|
||||
($user['account-type'] == User::ACCOUNT_TYPE_COMMUNITY)],
|
||||
|
||||
'$page_normal' => ['page-flags', DI::l10n()->t('Normal Account Page'), User::PAGE_FLAGS_NORMAL,
|
||||
DI::l10n()->t('Account for a regular personal profile that requires manual approval of "Friends" and "Followers".'),
|
||||
($user['page-flags'] == User::PAGE_FLAGS_NORMAL)],
|
||||
|
||||
'$page_soapbox' => ['page-flags', DI::l10n()->t('Soapbox Page'), User::PAGE_FLAGS_SOAPBOX,
|
||||
DI::l10n()->t('Account for a public profile that automatically approves contact requests as "Followers".'),
|
||||
($user['page-flags'] == User::PAGE_FLAGS_SOAPBOX)],
|
||||
|
||||
'$page_community' => ['page-flags', DI::l10n()->t('Public Forum'), User::PAGE_FLAGS_COMMUNITY,
|
||||
DI::l10n()->t('Automatically approves all contact requests.'),
|
||||
($user['page-flags'] == User::PAGE_FLAGS_COMMUNITY)],
|
||||
|
||||
'$page_freelove' => ['page-flags', DI::l10n()->t('Automatic Friend Page'), User::PAGE_FLAGS_FREELOVE,
|
||||
DI::l10n()->t('Account for a popular profile that automatically approves contact requests as "Friends".'),
|
||||
($user['page-flags'] == User::PAGE_FLAGS_FREELOVE)],
|
||||
|
||||
'$page_prvgroup' => ['page-flags', DI::l10n()->t('Private Forum [Experimental]'), User::PAGE_FLAGS_PRVGROUP,
|
||||
DI::l10n()->t('Requires manual approval of contact requests.'),
|
||||
($user['page-flags'] == User::PAGE_FLAGS_PRVGROUP)],
|
||||
|
||||
|
||||
]);
|
||||
|
||||
$noid = DI::config()->get('system', 'no_openid');
|
||||
|
||||
if ($noid) {
|
||||
$openid_field = false;
|
||||
} else {
|
||||
$openid_field = ['openid_url', DI::l10n()->t('OpenID:'), $openid, DI::l10n()->t("\x28Optional\x29 Allow this OpenID to login to this account."), "", "readonly", "url"];
|
||||
}
|
||||
|
||||
$opt_tpl = Renderer::getMarkupTemplate("field_checkbox.tpl");
|
||||
if (DI::config()->get('system', 'publish_all')) {
|
||||
$profile_in_dir = '<input type="hidden" name="profile_in_directory" value="1" />';
|
||||
} else {
|
||||
$profile_in_dir = Renderer::replaceMacros($opt_tpl, [
|
||||
'$field' => ['profile_in_directory', DI::l10n()->t('Publish your profile in your local site directory?'), $profile['publish'], DI::l10n()->t('Your profile will be published in this node\'s <a href="%s">local directory</a>. Your profile details may be publicly visible depending on the system settings.', DI::baseUrl().'/directory')]
|
||||
]);
|
||||
}
|
||||
|
||||
$net_pub_desc = '';
|
||||
if (strlen(DI::config()->get('system', 'directory'))) {
|
||||
$net_pub_desc = ' ' . DI::l10n()->t('Your profile will also be published in the global friendica directories (e.g. <a href="%s">%s</a>).', DI::config()->get('system', 'directory'), DI::config()->get('system', 'directory'));
|
||||
}
|
||||
|
||||
$tpl_addr = Renderer::getMarkupTemplate('settings/nick_set.tpl');
|
||||
|
||||
$prof_addr = Renderer::replaceMacros($tpl_addr,[
|
||||
'$desc' => DI::l10n()->t("Your Identity Address is <strong>'%s'</strong> or '%s'.", $nickname . '@' . DI::baseUrl()->getHostname() . DI::baseUrl()->getUrlPath(), DI::baseUrl() . '/profile/' . $nickname),
|
||||
'$basepath' => DI::baseUrl()->getHostname()
|
||||
]);
|
||||
|
||||
$stpl = Renderer::getMarkupTemplate('settings/settings.tpl');
|
||||
|
||||
/* Installed langs */
|
||||
$lang_choices = DI::l10n()->getAvailableLanguages();
|
||||
|
||||
/// @TODO Fix indending (or so)
|
||||
$o .= Renderer::replaceMacros($stpl, [
|
||||
'$ptitle' => DI::l10n()->t('Account Settings'),
|
||||
|
||||
'$submit' => DI::l10n()->t('Save Settings'),
|
||||
'$baseurl' => DI::baseUrl()->get(true),
|
||||
'$uid' => local_user(),
|
||||
'$form_security_token' => BaseModule::getFormSecurityToken("settings"),
|
||||
'$nickname_block' => $prof_addr,
|
||||
|
||||
'$h_pass' => DI::l10n()->t('Password Settings'),
|
||||
'$password1'=> ['password', DI::l10n()->t('New Password:'), '', DI::l10n()->t('Allowed characters are a-z, A-Z, 0-9 and special characters except white spaces, accentuated letters and colon (:).')],
|
||||
'$password2'=> ['confirm', DI::l10n()->t('Confirm:'), '', DI::l10n()->t('Leave password fields blank unless changing')],
|
||||
'$password3'=> ['opassword', DI::l10n()->t('Current Password:'), '', DI::l10n()->t('Your current password to confirm the changes')],
|
||||
'$password4'=> ['mpassword', DI::l10n()->t('Password:'), '', DI::l10n()->t('Your current password to confirm the changes of the email address')],
|
||||
'$oid_enable' => (!DI::config()->get('system', 'no_openid')),
|
||||
'$openid' => $openid_field,
|
||||
'$delete_openid' => ['delete_openid', DI::l10n()->t('Delete OpenID URL'), false, ''],
|
||||
|
||||
'$h_basic' => DI::l10n()->t('Basic Settings'),
|
||||
'$username' => ['username', DI::l10n()->t('Full Name:'), $username, ''],
|
||||
'$email' => ['email', DI::l10n()->t('Email Address:'), $email, '', '', '', 'email'],
|
||||
'$timezone' => ['timezone_select' , DI::l10n()->t('Your Timezone:'), Temporal::getTimezoneSelect($timezone), ''],
|
||||
'$language' => ['language', DI::l10n()->t('Your Language:'), $language, DI::l10n()->t('Set the language we use to show you friendica interface and to send you emails'), $lang_choices],
|
||||
'$defloc' => ['defloc', DI::l10n()->t('Default Post Location:'), $defloc, ''],
|
||||
'$allowloc' => ['allow_location', DI::l10n()->t('Use Browser Location:'), ($user['allow_location'] == 1), ''],
|
||||
|
||||
'$h_prv' => DI::l10n()->t('Security and Privacy Settings'),
|
||||
'$visibility' => $profile['net-publish'],
|
||||
'$maxreq' => ['maxreq', DI::l10n()->t('Maximum Friend Requests/Day:'), $maxreq , DI::l10n()->t("\x28to prevent spam abuse\x29")],
|
||||
'$profile_in_dir' => $profile_in_dir,
|
||||
'$profile_in_net_dir' => ['profile_in_netdirectory', DI::l10n()->t('Allow your profile to be searchable globally?'), $profile['net-publish'], DI::l10n()->t("Activate this setting if you want others to easily find and follow you. Your profile will be searchable on remote systems. This setting also determines whether Friendica will inform search engines that your profile should be indexed or not.") . $net_pub_desc],
|
||||
'$hide_friends' => ['hide-friends', DI::l10n()->t('Hide your contact/friend list from viewers of your profile?'), $profile['hide-friends'], DI::l10n()->t('A list of your contacts is displayed on your profile page. Activate this option to disable the display of your contact list.')],
|
||||
'$hide_wall' => ['hidewall', DI::l10n()->t('Hide your profile details from anonymous viewers?'), $user['hidewall'], DI::l10n()->t('Anonymous visitors will only see your profile picture, your display name and the nickname you are using on your profile page. Your public posts and replies will still be accessible by other means.')],
|
||||
'$unlisted' => ['unlisted', DI::l10n()->t('Make public posts unlisted'), DI::pConfig()->get(local_user(), 'system', 'unlisted'), DI::l10n()->t('Your public posts will not appear on the community pages or in search results, nor be sent to relay servers. However they can still appear on public feeds on remote servers.')],
|
||||
'$accessiblephotos' => ['accessible-photos', DI::l10n()->t('Make all posted pictures accessible'), DI::pConfig()->get(local_user(), 'system', 'accessible-photos'), DI::l10n()->t("This option makes every posted picture accessible via the direct link. This is a workaround for the problem that most other networks can't handle permissions on pictures. Non public pictures still won't be visible for the public on your photo albums though.")],
|
||||
'$blockwall' => ['blockwall', DI::l10n()->t('Allow friends to post to your profile page?'), (intval($user['blockwall']) ? '0' : '1'), DI::l10n()->t('Your contacts may write posts on your profile wall. These posts will be distributed to your contacts')], // array('blockwall', DI::l10n()->t('Allow friends to post to your profile page:'), !$blockwall, ''),
|
||||
'$blocktags' => ['blocktags', DI::l10n()->t('Allow friends to tag your posts?'), (intval($user['blocktags']) ? '0' : '1'), DI::l10n()->t('Your contacts can add additional tags to your posts.')], // array('blocktags', DI::l10n()->t('Allow friends to tag your posts:'), !$blocktags, ''),
|
||||
'$unkmail' => ['unkmail', DI::l10n()->t('Permit unknown people to send you private mail?'), $unkmail, DI::l10n()->t('Friendica network users may send you private messages even if they are not in your contact list.')],
|
||||
'$cntunkmail' => ['cntunkmail', DI::l10n()->t('Maximum private messages per day from unknown people:'), $cntunkmail , DI::l10n()->t("\x28to prevent spam abuse\x29")],
|
||||
'$group_select' => Group::displayGroupSelection(local_user(), $user['def_gid']),
|
||||
'$permissions' => DI::l10n()->t('Default Post Permissions'),
|
||||
'$aclselect' => ACL::getFullSelectorHTML(DI::page(), $a->getLoggedInUserId()),
|
||||
|
||||
'$expire' => [
|
||||
'label' => DI::l10n()->t('Expiration settings'),
|
||||
'days' => ['expire', DI::l10n()->t("Automatically expire posts after this many days:"), $expire, DI::l10n()->t('If empty, posts will not expire. Expired posts will be deleted')],
|
||||
'items' => ['expire_items', DI::l10n()->t('Expire posts'), $expire_items, DI::l10n()->t('When activated, posts and comments will be expired.')],
|
||||
'notes' => ['expire_notes', DI::l10n()->t('Expire personal notes'), $expire_notes, DI::l10n()->t('When activated, the personal notes on your profile page will be expired.')],
|
||||
'starred' => ['expire_starred', DI::l10n()->t('Expire starred posts'), $expire_starred, DI::l10n()->t('Starring posts keeps them from being expired. That behaviour is overwritten by this setting.')],
|
||||
'photos' => ['expire_photos', DI::l10n()->t('Expire photos'), $expire_photos, DI::l10n()->t('When activated, photos will be expired.')],
|
||||
'network_only' => ['expire_network_only', DI::l10n()->t('Only expire posts by others'), $expire_network_only, DI::l10n()->t('When activated, your own posts never expire. Then the settings above are only valid for posts you received.')],
|
||||
],
|
||||
|
||||
'$h_not' => DI::l10n()->t('Notification Settings'),
|
||||
'$lbl_not' => DI::l10n()->t('Send a notification email when:'),
|
||||
'$notify1' => ['notify1', DI::l10n()->t('You receive an introduction'), ($notify & Notification\Type::INTRO), Notification\Type::INTRO, ''],
|
||||
'$notify2' => ['notify2', DI::l10n()->t('Your introductions are confirmed'), ($notify & Notification\Type::CONFIRM), Notification\Type::CONFIRM, ''],
|
||||
'$notify3' => ['notify3', DI::l10n()->t('Someone writes on your profile wall'), ($notify & Notification\Type::WALL), Notification\Type::WALL, ''],
|
||||
'$notify4' => ['notify4', DI::l10n()->t('Someone writes a followup comment'), ($notify & Notification\Type::COMMENT), Notification\Type::COMMENT, ''],
|
||||
'$notify5' => ['notify5', DI::l10n()->t('You receive a private message'), ($notify & Notification\Type::MAIL), Notification\Type::MAIL, ''],
|
||||
'$notify6' => ['notify6', DI::l10n()->t('You receive a friend suggestion'), ($notify & Notification\Type::SUGGEST), Notification\Type::SUGGEST, ''],
|
||||
'$notify7' => ['notify7', DI::l10n()->t('You are tagged in a post'), ($notify & Notification\Type::TAG_SELF), Notification\Type::TAG_SELF, ''],
|
||||
'$notify8' => ['notify8', DI::l10n()->t('You are poked/prodded/etc. in a post'), ($notify & Notification\Type::POKE), Notification\Type::POKE, ''],
|
||||
|
||||
'$lbl_notify' => DI::l10n()->t('Create a desktop notification when:'),
|
||||
'$notify_like' => ['notify_like', DI::l10n()->t('Someone liked your content'), DI::pConfig()->get(local_user(), 'system', 'notify_like'), ''],
|
||||
'$notify_announce' => ['notify_announce', DI::l10n()->t('Someone shared your content'), DI::pConfig()->get(local_user(), 'system', 'notify_announce'), ''],
|
||||
|
||||
'$desktop_notifications' => ['desktop_notifications', DI::l10n()->t('Activate desktop notifications') , false, DI::l10n()->t('Show desktop popup on new notifications')],
|
||||
|
||||
'$email_textonly' => ['email_textonly', DI::l10n()->t('Text-only notification emails'),
|
||||
DI::pConfig()->get(local_user(), 'system', 'email_textonly'),
|
||||
DI::l10n()->t('Send text only notification emails, without the html part')],
|
||||
|
||||
'$detailed_notif' => ['detailed_notif', DI::l10n()->t('Show detailled notifications'),
|
||||
DI::pConfig()->get(local_user(), 'system', 'detailed_notif'),
|
||||
DI::l10n()->t('Per default, notifications are condensed to a single notification per item. When enabled every notification is displayed.')],
|
||||
|
||||
'$notify_ignored' => ['notify_ignored', DI::l10n()->t('Show notifications of ignored contacts') ,
|
||||
DI::pConfig()->get(local_user(), 'system', 'notify_ignored', true),
|
||||
DI::l10n()->t("You don't see posts from ignored contacts. But you still see their comments. This setting controls if you want to still receive regular notifications that are caused by ignored contacts or not.")],
|
||||
|
||||
'$h_advn' => DI::l10n()->t('Advanced Account/Page Type Settings'),
|
||||
'$h_descadvn' => DI::l10n()->t('Change the behaviour of this account for special situations'),
|
||||
'$pagetype' => $pagetype,
|
||||
|
||||
'$importcontact' => DI::l10n()->t('Import Contacts'),
|
||||
'$importcontact_text' => DI::l10n()->t('Upload a CSV file that contains the handle of your followed accounts in the first column you exported from the old account.'),
|
||||
'$importcontact_button' => DI::l10n()->t('Upload File'),
|
||||
'$importcontact_maxsize' => DI::config()->get('system', 'max_csv_file_size', 30720),
|
||||
'$relocate' => DI::l10n()->t('Relocate'),
|
||||
'$relocate_text' => DI::l10n()->t("If you have moved this profile from another server, and some of your contacts don't receive your updates, try pushing this button."),
|
||||
'$relocate_button' => DI::l10n()->t("Resend relocate message to contacts"),
|
||||
|
||||
]);
|
||||
|
||||
Hook::callAll('settings_form', $o);
|
||||
|
||||
$o .= '</form>' . "\r\n";
|
||||
|
||||
return $o;
|
||||
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
use Friendica\App;
|
||||
use Friendica\Content\Text\BBCode;
|
||||
use Friendica\Core\System;
|
||||
use Friendica\Database\DBA;
|
||||
use Friendica\DI;
|
||||
use Friendica\Model\Item;
|
||||
|
@ -30,7 +31,7 @@ function share_init(App $a) {
|
|||
$post_id = ((DI::args()->getArgc() > 1) ? intval(DI::args()->getArgv()[1]) : 0);
|
||||
|
||||
if (!$post_id || !local_user()) {
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
|
||||
$fields = ['private', 'body', 'author-name', 'author-link', 'author-avatar',
|
||||
|
@ -38,7 +39,7 @@ function share_init(App $a) {
|
|||
$item = Post::selectFirst($fields, ['id' => $post_id]);
|
||||
|
||||
if (!DBA::isResult($item) || $item['private'] == Item::PRIVATE) {
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
|
||||
if (strpos($item['body'], "[/share]") !== false) {
|
||||
|
@ -56,5 +57,5 @@ function share_init(App $a) {
|
|||
}
|
||||
|
||||
echo $o;
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
|
|
|
@ -167,6 +167,5 @@ EOT;
|
|||
$post = Post::selectFirst(['uri-id', 'uid'], ['id' => $post_id]);
|
||||
|
||||
Worker::add(PRIORITY_HIGH, "Notifier", Delivery::POST, $post['uri-id'], $post['uid']);
|
||||
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
|
|
|
@ -122,8 +122,7 @@ function unfollow_process(string $url)
|
|||
|
||||
$owner = User::getOwnerDataById($uid);
|
||||
if (!$owner) {
|
||||
(new \Friendica\Module\Security\Logout())->init();
|
||||
// NOTREACHED
|
||||
throw new \Friendica\Network\HTTPException\NotFoundException();
|
||||
}
|
||||
|
||||
$condition = ["`uid` = ? AND (`rel` = ? OR `rel` = ?) AND (`nurl` = ? OR `alias` = ? OR `alias` = ?)",
|
||||
|
@ -140,15 +139,10 @@ function unfollow_process(string $url)
|
|||
$return_path = $base_return_path . '/' . $contact['id'];
|
||||
|
||||
try {
|
||||
$result = Contact::terminateFriendship($owner, $contact);
|
||||
|
||||
if ($result === false) {
|
||||
$notice_message = DI::l10n()->t('Unable to unfollow this contact, please retry in a few minutes or contact your administrator.');
|
||||
} else {
|
||||
$notice_message = DI::l10n()->t('Contact was successfully unfollowed');
|
||||
}
|
||||
Contact::unfollow($contact);
|
||||
$notice_message = DI::l10n()->t('Contact was successfully unfollowed');
|
||||
} catch (Exception $e) {
|
||||
DI::logger()->error($e->getMessage(), ['owner' => $owner, 'contact' => $contact]);
|
||||
DI::logger()->error($e->getMessage(), ['contact' => $contact]);
|
||||
$notice_message = DI::l10n()->t('Unable to unfollow this contact, please contact your administrator');
|
||||
}
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
use Friendica\App;
|
||||
use Friendica\Core\Session;
|
||||
use Friendica\Core\System;
|
||||
use Friendica\Database\DBA;
|
||||
use Friendica\DI;
|
||||
use Friendica\Model\Attach;
|
||||
|
@ -36,15 +37,13 @@ function wall_attach_post(App $a) {
|
|||
$owner = User::getOwnerDataByNick($nick);
|
||||
if (!DBA::isResult($owner)) {
|
||||
if ($r_json) {
|
||||
echo json_encode(['error' => DI::l10n()->t('Invalid request.')]);
|
||||
exit();
|
||||
System::jsonExit(['error' => DI::l10n()->t('Invalid request.')]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if ($r_json) {
|
||||
echo json_encode(['error' => DI::l10n()->t('Invalid request.')]);
|
||||
exit();
|
||||
System::jsonExit(['error' => DI::l10n()->t('Invalid request.')]);
|
||||
}
|
||||
|
||||
return;
|
||||
|
@ -65,18 +64,17 @@ function wall_attach_post(App $a) {
|
|||
|
||||
if (!$can_post) {
|
||||
if ($r_json) {
|
||||
echo json_encode(['error' => DI::l10n()->t('Permission denied.')]);
|
||||
exit();
|
||||
System::jsonExit(['error' => DI::l10n()->t('Permission denied.')]);
|
||||
}
|
||||
notice(DI::l10n()->t('Permission denied.') . EOL );
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
|
||||
if (empty($_FILES['userfile'])) {
|
||||
if ($r_json) {
|
||||
echo json_encode(['error' => DI::l10n()->t('Invalid request.')]);
|
||||
System::jsonExit(['error' => DI::l10n()->t('Invalid request.')]);
|
||||
}
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
|
||||
$src = $_FILES['userfile']['tmp_name'];
|
||||
|
@ -93,24 +91,24 @@ function wall_attach_post(App $a) {
|
|||
|
||||
if ($filesize <= 0) {
|
||||
$msg = DI::l10n()->t('Sorry, maybe your upload is bigger than the PHP configuration allows') . EOL .(DI::l10n()->t('Or - did you try to upload an empty file?'));
|
||||
@unlink($src);
|
||||
if ($r_json) {
|
||||
echo json_encode(['error' => $msg]);
|
||||
System::jsonExit(['error' => $msg]);
|
||||
} else {
|
||||
notice($msg);
|
||||
}
|
||||
@unlink($src);
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
|
||||
if ($maxfilesize && $filesize > $maxfilesize) {
|
||||
$msg = DI::l10n()->t('File exceeds size limit of %s', Strings::formatBytes($maxfilesize));
|
||||
@unlink($src);
|
||||
if ($r_json) {
|
||||
echo json_encode(['error' => $msg]);
|
||||
System::jsonExit(['error' => $msg]);
|
||||
} else {
|
||||
echo $msg . EOL;
|
||||
}
|
||||
@unlink($src);
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
|
||||
$newid = Attach::storeFile($src, $page_owner_uid, $filename, '<' . $page_owner_cid . '>');
|
||||
|
@ -120,22 +118,20 @@ function wall_attach_post(App $a) {
|
|||
if ($newid === false) {
|
||||
$msg = DI::l10n()->t('File upload failed.');
|
||||
if ($r_json) {
|
||||
echo json_encode(['error' => $msg]);
|
||||
System::jsonExit(['error' => $msg]);
|
||||
} else {
|
||||
echo $msg . EOL;
|
||||
}
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
|
||||
if ($r_json) {
|
||||
echo json_encode(['ok' => true, 'id' => $newid]);
|
||||
exit();
|
||||
System::jsonExit(['ok' => true, 'id' => $newid]);
|
||||
}
|
||||
|
||||
$lf = "\n";
|
||||
|
||||
echo $lf . $lf . '[attachment]' . $newid . '[/attachment]' . $lf;
|
||||
|
||||
exit();
|
||||
System::exit();
|
||||
// NOTREACHED
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
use Friendica\App;
|
||||
use Friendica\Core\Logger;
|
||||
use Friendica\Core\Session;
|
||||
use Friendica\Core\System;
|
||||
use Friendica\Database\DBA;
|
||||
use Friendica\DI;
|
||||
use Friendica\Model\Photo;
|
||||
|
@ -50,8 +51,7 @@ function wall_upload_post(App $a, $desktopmode = true)
|
|||
$user = DBA::selectFirst('owner-view', ['id', 'uid', 'nickname', 'page-flags'], ['nickname' => $nick, 'blocked' => false]);
|
||||
if (!DBA::isResult($user)) {
|
||||
if ($r_json) {
|
||||
echo json_encode(['error' => DI::l10n()->t('Invalid request.')]);
|
||||
exit();
|
||||
System::jsonExit(['error' => DI::l10n()->t('Invalid request.')]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -60,8 +60,7 @@ function wall_upload_post(App $a, $desktopmode = true)
|
|||
}
|
||||
} else {
|
||||
if ($r_json) {
|
||||
echo json_encode(['error' => DI::l10n()->t('Invalid request.')]);
|
||||
exit();
|
||||
System::jsonExit(['error' => DI::l10n()->t('Invalid request.')]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -87,18 +86,17 @@ function wall_upload_post(App $a, $desktopmode = true)
|
|||
|
||||
if (!$can_post) {
|
||||
if ($r_json) {
|
||||
echo json_encode(['error' => DI::l10n()->t('Permission denied.')]);
|
||||
exit();
|
||||
System::jsonExit(['error' => DI::l10n()->t('Permission denied.')]);
|
||||
}
|
||||
notice(DI::l10n()->t('Permission denied.'));
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
|
||||
if (empty($_FILES['userfile']) && empty($_FILES['media'])) {
|
||||
if ($r_json) {
|
||||
echo json_encode(['error' => DI::l10n()->t('Invalid request.')]);
|
||||
System::jsonExit(['error' => DI::l10n()->t('Invalid request.')]);
|
||||
}
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
|
||||
$src = '';
|
||||
|
@ -147,11 +145,10 @@ function wall_upload_post(App $a, $desktopmode = true)
|
|||
|
||||
if ($src == "") {
|
||||
if ($r_json) {
|
||||
echo json_encode(['error' => DI::l10n()->t('Invalid request.')]);
|
||||
exit();
|
||||
System::jsonExit(['error' => DI::l10n()->t('Invalid request.')]);
|
||||
}
|
||||
notice(DI::l10n()->t('Invalid request.'));
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
|
||||
$filetype = Images::getMimeTypeBySource($src, $filename, $filetype);
|
||||
|
@ -160,31 +157,31 @@ function wall_upload_post(App $a, $desktopmode = true)
|
|||
" - size: " . $filesize . " - type: " . $filetype);
|
||||
|
||||
$imagedata = @file_get_contents($src);
|
||||
$Image = new Image($imagedata, $filetype);
|
||||
$image = new Image($imagedata, $filetype);
|
||||
|
||||
if (!$Image->isValid()) {
|
||||
if (!$image->isValid()) {
|
||||
$msg = DI::l10n()->t('Unable to process image.');
|
||||
@unlink($src);
|
||||
if ($r_json) {
|
||||
echo json_encode(['error' => $msg]);
|
||||
System::jsonExit(['error' => $msg]);
|
||||
} else {
|
||||
echo $msg. EOL;
|
||||
}
|
||||
@unlink($src);
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
|
||||
$Image->orient($src);
|
||||
$image->orient($src);
|
||||
@unlink($src);
|
||||
|
||||
$max_length = DI::config()->get('system', 'max_image_length');
|
||||
if ($max_length > 0) {
|
||||
$Image->scaleDown($max_length);
|
||||
$filesize = strlen($Image->asString());
|
||||
$image->scaleDown($max_length);
|
||||
$filesize = strlen($image->asString());
|
||||
Logger::info("File upload: Scaling picture to new size " . $max_length);
|
||||
}
|
||||
|
||||
$width = $Image->getWidth();
|
||||
$height = $Image->getHeight();
|
||||
$width = $image->getWidth();
|
||||
$height = $image->getHeight();
|
||||
|
||||
$maximagesize = DI::config()->get('system', 'maximagesize');
|
||||
|
||||
|
@ -193,22 +190,22 @@ function wall_upload_post(App $a, $desktopmode = true)
|
|||
foreach ([5120, 2560, 1280, 640] as $pixels) {
|
||||
if (($filesize > $maximagesize) && (max($width, $height) > $pixels)) {
|
||||
Logger::info('Resize', ['size' => $filesize, 'width' => $width, 'height' => $height, 'max' => $maximagesize, 'pixels' => $pixels]);
|
||||
$Image->scaleDown($pixels);
|
||||
$filesize = strlen($Image->asString());
|
||||
$width = $Image->getWidth();
|
||||
$height = $Image->getHeight();
|
||||
$image->scaleDown($pixels);
|
||||
$filesize = strlen($image->asString());
|
||||
$width = $image->getWidth();
|
||||
$height = $image->getHeight();
|
||||
}
|
||||
}
|
||||
if ($filesize > $maximagesize) {
|
||||
Logger::notice('Image size is too big', ['size' => $filesize, 'max' => $maximagesize]);
|
||||
$msg = DI::l10n()->t('Image exceeds size limit of %s', Strings::formatBytes($maximagesize));
|
||||
@unlink($src);
|
||||
if ($r_json) {
|
||||
echo json_encode(['error' => $msg]);
|
||||
System::jsonExit(['error' => $msg]);
|
||||
} else {
|
||||
echo $msg. EOL;
|
||||
}
|
||||
@unlink($src);
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -223,29 +220,29 @@ function wall_upload_post(App $a, $desktopmode = true)
|
|||
|
||||
$defperm = '<' . $default_cid . '>';
|
||||
|
||||
$r = Photo::store($Image, $page_owner_uid, $visitor, $resource_id, $filename, $album, 0, Photo::DEFAULT, $defperm);
|
||||
$r = Photo::store($image, $page_owner_uid, $visitor, $resource_id, $filename, $album, 0, Photo::DEFAULT, $defperm);
|
||||
|
||||
if (!$r) {
|
||||
$msg = DI::l10n()->t('Image upload failed.');
|
||||
if ($r_json) {
|
||||
echo json_encode(['error' => $msg]);
|
||||
System::jsonExit(['error' => $msg]);
|
||||
} else {
|
||||
echo $msg. EOL;
|
||||
}
|
||||
exit();
|
||||
System::exit();
|
||||
}
|
||||
|
||||
if ($width > 640 || $height > 640) {
|
||||
$Image->scaleDown(640);
|
||||
$r = Photo::store($Image, $page_owner_uid, $visitor, $resource_id, $filename, $album, 1, Photo::DEFAULT, $defperm);
|
||||
$image->scaleDown(640);
|
||||
$r = Photo::store($image, $page_owner_uid, $visitor, $resource_id, $filename, $album, 1, Photo::DEFAULT, $defperm);
|
||||
if ($r) {
|
||||
$smallest = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if ($width > 320 || $height > 320) {
|
||||
$Image->scaleDown(320);
|
||||
$r = Photo::store($Image, $page_owner_uid, $visitor, $resource_id, $filename, $album, 2, Photo::DEFAULT, $defperm);
|
||||
$image->scaleDown(320);
|
||||
$r = Photo::store($image, $page_owner_uid, $visitor, $resource_id, $filename, $album, 2, Photo::DEFAULT, $defperm);
|
||||
if ($r && ($smallest == 0)) {
|
||||
$smallest = 2;
|
||||
}
|
||||
|
@ -255,8 +252,7 @@ function wall_upload_post(App $a, $desktopmode = true)
|
|||
$photo = Photo::selectFirst(['id', 'datasize', 'width', 'height', 'type'], ['resource-id' => $resource_id], ['order' => ['width']]);
|
||||
if (!$photo) {
|
||||
if ($r_json) {
|
||||
echo json_encode(['error' => '']);
|
||||
exit();
|
||||
System::jsonExit(['error' => '']);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -268,12 +264,11 @@ function wall_upload_post(App $a, $desktopmode = true)
|
|||
$picture["height"] = $photo["height"];
|
||||
$picture["type"] = $photo["type"];
|
||||
$picture["albumpage"] = DI::baseUrl() . '/photos/' . $page_owner_nick . '/image/' . $resource_id;
|
||||
$picture["picture"] = DI::baseUrl() . "/photo/{$resource_id}-0." . $Image->getExt();
|
||||
$picture["preview"] = DI::baseUrl() . "/photo/{$resource_id}-{$smallest}." . $Image->getExt();
|
||||
$picture["picture"] = DI::baseUrl() . "/photo/{$resource_id}-0." . $image->getExt();
|
||||
$picture["preview"] = DI::baseUrl() . "/photo/{$resource_id}-{$smallest}." . $image->getExt();
|
||||
|
||||
if ($r_json) {
|
||||
echo json_encode(['picture' => $picture]);
|
||||
exit();
|
||||
System::jsonExit(['picture' => $picture]);
|
||||
}
|
||||
Logger::info("upload done");
|
||||
return $picture;
|
||||
|
@ -282,11 +277,10 @@ function wall_upload_post(App $a, $desktopmode = true)
|
|||
Logger::info("upload done");
|
||||
|
||||
if ($r_json) {
|
||||
echo json_encode(['ok' => true]);
|
||||
exit();
|
||||
System::jsonExit(['ok' => true]);
|
||||
}
|
||||
|
||||
echo "\n\n" . '[url=' . DI::baseUrl() . '/photos/' . $page_owner_nick . '/image/' . $resource_id . '][img]' . DI::baseUrl() . "/photo/{$resource_id}-{$smallest}.".$Image->getExt()."[/img][/url]\n\n";
|
||||
exit();
|
||||
echo "\n\n" . '[url=' . DI::baseUrl() . '/photos/' . $page_owner_nick . '/image/' . $resource_id . '][img]' . DI::baseUrl() . "/photo/{$resource_id}-{$smallest}." . $image->getExt() . "[/img][/url]\n\n";
|
||||
System::exit();
|
||||
// NOTREACHED
|
||||
}
|
||||
|
|
|
@ -125,7 +125,7 @@ function showForm($error, $content) {
|
|||
|
||||
echo <<<EOF
|
||||
<div class='wrap1'>
|
||||
<h2><img class='logo' src='friendica-32.png' align='middle';/>
|
||||
<h2><img class='logo' width="32" height="32" src='friendica.svg' align='middle';/>
|
||||
Friendica Bookmarklet</h2>
|
||||
</div>
|
||||
|
||||
|
|
4
mods/fpostit/friendica.svg
Normal file
|
@ -0,0 +1,4 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="192" height="192" viewBox="0 0 1920 1920">
|
||||
<rect fill="#1872a2" x="60" y="60" width="1800" height="1800" 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>
|
After Width: | Height: | Size: 434 B |
Before Width: | Height: | Size: 1.6 KiB |
|
@ -1,6 +1,6 @@
|
|||
Contact: mailto:info@friendi.ca
|
||||
|
||||
Expires: Sun, 31 Jul 2022 23:59 +0000
|
||||
Expires: Sun, 31 Dec 2022 23:59 +0000
|
||||
|
||||
Preferred-Languages: en
|
||||
|
||||
|
|
64
src/App.php
|
@ -145,7 +145,7 @@ class App
|
|||
$this->nickname = $nickname;
|
||||
}
|
||||
|
||||
public function isLoggedIn()
|
||||
public function isLoggedIn(): bool
|
||||
{
|
||||
return local_user() && $this->user_id && ($this->user_id == local_user());
|
||||
}
|
||||
|
@ -155,7 +155,7 @@ class App
|
|||
*
|
||||
* @return bool true if user is an admin
|
||||
*/
|
||||
public function isSiteAdmin()
|
||||
public function isSiteAdmin(): bool
|
||||
{
|
||||
$admin_email = $this->config->get('config', 'admin_email');
|
||||
|
||||
|
@ -166,18 +166,18 @@ class App
|
|||
|
||||
/**
|
||||
* Fetch the user id
|
||||
* @return int
|
||||
* @return int User id
|
||||
*/
|
||||
public function getLoggedInUserId()
|
||||
public function getLoggedInUserId(): int
|
||||
{
|
||||
return $this->user_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch the user nick name
|
||||
* @return string
|
||||
* @return string User's nickname
|
||||
*/
|
||||
public function getLoggedInUserNickname()
|
||||
public function getLoggedInUserNickname(): string
|
||||
{
|
||||
return $this->nickname;
|
||||
}
|
||||
|
@ -198,7 +198,7 @@ class App
|
|||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getProfileOwner():int
|
||||
public function getProfileOwner(): int
|
||||
{
|
||||
return $this->profile_owner;
|
||||
}
|
||||
|
@ -219,7 +219,7 @@ class App
|
|||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getContactId():int
|
||||
public function getContactId(): int
|
||||
{
|
||||
return $this->contact_id;
|
||||
}
|
||||
|
@ -241,7 +241,7 @@ class App
|
|||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getTimeZone():string
|
||||
public function getTimeZone(): string
|
||||
{
|
||||
return $this->timezone;
|
||||
}
|
||||
|
@ -260,9 +260,9 @@ class App
|
|||
/**
|
||||
* Fetch workerqueue information
|
||||
*
|
||||
* @return array
|
||||
* @return array Worker queue
|
||||
*/
|
||||
public function getQueue()
|
||||
public function getQueue(): array
|
||||
{
|
||||
return $this->queue ?? [];
|
||||
}
|
||||
|
@ -270,8 +270,8 @@ class App
|
|||
/**
|
||||
* Fetch a specific workerqueue field
|
||||
*
|
||||
* @param string $index
|
||||
* @return mixed
|
||||
* @param string $index Work queue record to fetch
|
||||
* @return mixed Work queue item or NULL if not found
|
||||
*/
|
||||
public function getQueueValue(string $index)
|
||||
{
|
||||
|
@ -306,9 +306,9 @@ class App
|
|||
/**
|
||||
* The basepath of this app
|
||||
*
|
||||
* @return string
|
||||
* @return string Base path from configuration
|
||||
*/
|
||||
public function getBasePath()
|
||||
public function getBasePath(): string
|
||||
{
|
||||
// Don't use the basepath of the config table for basepath (it should always be the config-file one)
|
||||
return $this->config->getCache()->get('system', 'basepath');
|
||||
|
@ -396,10 +396,10 @@ class App
|
|||
/**
|
||||
* Returns the current theme name. May be overriden by the mobile theme name.
|
||||
*
|
||||
* @return string
|
||||
* @return string Current theme name or empty string in installation phase
|
||||
* @throws Exception
|
||||
*/
|
||||
public function getCurrentTheme()
|
||||
public function getCurrentTheme(): string
|
||||
{
|
||||
if ($this->mode->isInstall()) {
|
||||
return '';
|
||||
|
@ -425,10 +425,10 @@ class App
|
|||
/**
|
||||
* Returns the current mobile theme name.
|
||||
*
|
||||
* @return string
|
||||
* @return string Mobile theme name or empty string if installer
|
||||
* @throws Exception
|
||||
*/
|
||||
public function getCurrentMobileTheme()
|
||||
public function getCurrentMobileTheme(): string
|
||||
{
|
||||
if ($this->mode->isInstall()) {
|
||||
return '';
|
||||
|
@ -441,12 +441,22 @@ class App
|
|||
return $this->currentMobileTheme;
|
||||
}
|
||||
|
||||
public function setCurrentTheme($theme)
|
||||
/**
|
||||
* Setter for current theme name
|
||||
*
|
||||
* @param string $theme Name of current theme
|
||||
*/
|
||||
public function setCurrentTheme(string $theme)
|
||||
{
|
||||
$this->currentTheme = $theme;
|
||||
}
|
||||
|
||||
public function setCurrentMobileTheme($theme)
|
||||
/**
|
||||
* Setter for current mobile theme name
|
||||
*
|
||||
* @param string $theme Name of current mobile theme
|
||||
*/
|
||||
public function setCurrentMobileTheme(string $theme)
|
||||
{
|
||||
$this->currentMobileTheme = $theme;
|
||||
}
|
||||
|
@ -472,7 +482,7 @@ class App
|
|||
// Allow folks to override user themes and always use their own on their own site.
|
||||
// This works only if the user is on the same server
|
||||
$user = $this->database->selectFirst('user', ['theme'], ['uid' => $this->profile_owner]);
|
||||
if ($this->database->isResult($user) && !$this->pConfig->get(local_user(), 'system', 'always_my_theme')) {
|
||||
if ($this->database->isResult($user) && !local_user()) {
|
||||
$page_theme = $user['theme'];
|
||||
}
|
||||
}
|
||||
|
@ -504,7 +514,7 @@ class App
|
|||
if (!empty($this->profile_owner) && ($this->profile_owner != local_user())) {
|
||||
// Allow folks to override user themes and always use their own on their own site.
|
||||
// This works only if the user is on the same server
|
||||
if (!$this->pConfig->get(local_user(), 'system', 'always_my_theme')) {
|
||||
if (!local_user()) {
|
||||
$page_mobile_theme = $this->pConfig->get($this->profile_owner, 'system', 'mobile-theme');
|
||||
}
|
||||
}
|
||||
|
@ -525,10 +535,10 @@ class App
|
|||
/**
|
||||
* Provide a sane default if nothing is chosen or the specified theme does not exist.
|
||||
*
|
||||
* @return string
|
||||
* @return string Current theme's stylsheet path
|
||||
* @throws Exception
|
||||
*/
|
||||
public function getCurrentThemeStylesheetPath()
|
||||
public function getCurrentThemeStylesheetPath(): string
|
||||
{
|
||||
return Core\Theme::getStylesheetPath($this->getCurrentTheme());
|
||||
}
|
||||
|
@ -576,6 +586,7 @@ class App
|
|||
$this->profiler->set(microtime(true), 'classinit');
|
||||
|
||||
$moduleName = $this->args->getModuleName();
|
||||
$page->setLogging($this->args->getCommand(), $this->args->getMethod());
|
||||
|
||||
try {
|
||||
// Missing DB connection: ERROR
|
||||
|
@ -718,6 +729,7 @@ class App
|
|||
} catch (HTTPException $e) {
|
||||
(new ModuleHTTPException())->rawContent($e);
|
||||
}
|
||||
$page->logRuntime($this->config, 'runFrontend');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -728,7 +740,7 @@ class App
|
|||
*
|
||||
* @throws HTTPException\InternalServerErrorException
|
||||
*/
|
||||
public function redirect($toUrl)
|
||||
public function redirect(string $toUrl)
|
||||
{
|
||||
if (!empty(parse_url($toUrl, PHP_URL_SCHEME))) {
|
||||
Core\System::externalRedirect($toUrl);
|
||||
|
|
|
@ -78,7 +78,7 @@ class Arguments
|
|||
/**
|
||||
* @return string The whole command of this call
|
||||
*/
|
||||
public function getCommand()
|
||||
public function getCommand(): string
|
||||
{
|
||||
return $this->command;
|
||||
}
|
||||
|
@ -94,7 +94,7 @@ class Arguments
|
|||
/**
|
||||
* @return array All arguments of this call
|
||||
*/
|
||||
public function getArgv()
|
||||
public function getArgv(): array
|
||||
{
|
||||
return $this->argv;
|
||||
}
|
||||
|
@ -102,7 +102,7 @@ class Arguments
|
|||
/**
|
||||
* @return string The used HTTP method
|
||||
*/
|
||||
public function getMethod()
|
||||
public function getMethod(): string
|
||||
{
|
||||
return $this->method;
|
||||
}
|
||||
|
@ -110,7 +110,7 @@ class Arguments
|
|||
/**
|
||||
* @return int The count of arguments of this call
|
||||
*/
|
||||
public function getArgc()
|
||||
public function getArgc(): int
|
||||
{
|
||||
return $this->argc;
|
||||
}
|
||||
|
@ -145,7 +145,7 @@ class Arguments
|
|||
*
|
||||
* @return bool if the argument position exists
|
||||
*/
|
||||
public function has(int $position)
|
||||
public function has(int $position): bool
|
||||
{
|
||||
return array_key_exists($position, $this->argv);
|
||||
}
|
||||
|
@ -158,7 +158,7 @@ class Arguments
|
|||
*
|
||||
* @return Arguments The determined arguments
|
||||
*/
|
||||
public function determine(array $server, array $get)
|
||||
public function determine(array $server, array $get): Arguments
|
||||
{
|
||||
// removing leading / - maybe a nginx problem
|
||||
$server['QUERY_STRING'] = ltrim($server['QUERY_STRING'] ?? '', '/');
|
||||
|
|
|
@ -107,7 +107,7 @@ class BaseURL
|
|||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getHostname()
|
||||
public function getHostname(): string
|
||||
{
|
||||
return $this->hostname;
|
||||
}
|
||||
|
@ -117,7 +117,7 @@ class BaseURL
|
|||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getScheme()
|
||||
public function getScheme(): string
|
||||
{
|
||||
return $this->scheme;
|
||||
}
|
||||
|
@ -127,7 +127,7 @@ class BaseURL
|
|||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getSSLPolicy()
|
||||
public function getSSLPolicy(): int
|
||||
{
|
||||
return $this->sslPolicy;
|
||||
}
|
||||
|
@ -137,7 +137,7 @@ class BaseURL
|
|||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUrlPath()
|
||||
public function getUrlPath(): string
|
||||
{
|
||||
return $this->urlPath;
|
||||
}
|
||||
|
@ -151,7 +151,7 @@ class BaseURL
|
|||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get($ssl = false)
|
||||
public function get(bool $ssl = false): string
|
||||
{
|
||||
if ($this->sslPolicy === self::SSL_POLICY_SELFSIGN && $ssl) {
|
||||
return Network::switchScheme($this->url);
|
||||
|
@ -168,8 +168,9 @@ class BaseURL
|
|||
* @param string? $urlPath
|
||||
*
|
||||
* @return bool true, if successful
|
||||
* @TODO Find proper types
|
||||
*/
|
||||
public function save($hostname = null, $sslPolicy = null, $urlPath = null)
|
||||
public function save($hostname = null, $sslPolicy = null, $urlPath = null): bool
|
||||
{
|
||||
$currHostname = $this->hostname;
|
||||
$currSSLPolicy = $this->sslPolicy;
|
||||
|
@ -224,11 +225,11 @@ class BaseURL
|
|||
/**
|
||||
* Save the current url as base URL
|
||||
*
|
||||
* @param $url
|
||||
* @param string $url
|
||||
*
|
||||
* @return bool true, if the save was successful
|
||||
*/
|
||||
public function saveByURL($url)
|
||||
public function saveByURL(string $url): bool
|
||||
{
|
||||
$parsed = @parse_url($url);
|
||||
|
||||
|
@ -421,7 +422,7 @@ class BaseURL
|
|||
*
|
||||
* @return string The cleaned url
|
||||
*/
|
||||
public function remove(string $origURL)
|
||||
public function remove(string $origURL): string
|
||||
{
|
||||
// Remove the hostname from the url if it is an internal link
|
||||
$nurl = Strings::normaliseLink($origURL);
|
||||
|
@ -445,7 +446,7 @@ class BaseURL
|
|||
*
|
||||
* @throws HTTPException\InternalServerErrorException In Case the given URL is not relative to the Friendica node
|
||||
*/
|
||||
public function redirect($toUrl = '', $ssl = false)
|
||||
public function redirect(string $toUrl = '', bool $ssl = false)
|
||||
{
|
||||
if (!empty(parse_url($toUrl, PHP_URL_SCHEME))) {
|
||||
throw new HTTPException\InternalServerErrorException("'$toUrl is not a relative path, please use System::externalRedirectTo");
|
||||
|
@ -458,8 +459,8 @@ class BaseURL
|
|||
/**
|
||||
* Returns the base url as string
|
||||
*/
|
||||
public function __toString()
|
||||
public function __toString(): string
|
||||
{
|
||||
return $this->get();
|
||||
return (string) $this->get();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -130,7 +130,7 @@ class Mode
|
|||
*
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function determine(BasePath $basepath, Database $database, Cache $configCache)
|
||||
public function determine(BasePath $basepath, Database $database, Cache $configCache): Mode
|
||||
{
|
||||
$mode = 0;
|
||||
|
||||
|
@ -178,7 +178,7 @@ class Mode
|
|||
*
|
||||
* @return Mode returns the determined mode
|
||||
*/
|
||||
public function determineRunMode(bool $isBackend, array $server, Arguments $args, MobileDetect $mobileDetect)
|
||||
public function determineRunMode(bool $isBackend, array $server, Arguments $args, MobileDetect $mobileDetect): Mode
|
||||
{
|
||||
foreach (self::BACKEND_CONTENT_TYPES as $type) {
|
||||
if (strpos(strtolower($server['HTTP_ACCEPT'] ?? ''), $type) !== false) {
|
||||
|
@ -201,7 +201,7 @@ class Mode
|
|||
*
|
||||
* @return bool returns true, if the mode is set
|
||||
*/
|
||||
public function has($mode)
|
||||
public function has(int $mode): bool
|
||||
{
|
||||
return ($this->mode & $mode) > 0;
|
||||
}
|
||||
|
@ -227,7 +227,7 @@ class Mode
|
|||
*
|
||||
* @return int Execution Mode
|
||||
*/
|
||||
public function getExecutor()
|
||||
public function getExecutor(): int
|
||||
{
|
||||
return $this->executor;
|
||||
}
|
||||
|
@ -235,9 +235,9 @@ class Mode
|
|||
/**
|
||||
* Install mode is when the local config file is missing or the DB schema hasn't been installed yet.
|
||||
*
|
||||
* @return bool
|
||||
* @return bool Whether installation mode is active (local/database configuration files present or not)
|
||||
*/
|
||||
public function isInstall()
|
||||
public function isInstall(): bool
|
||||
{
|
||||
return !$this->has(Mode::LOCALCONFIGPRESENT) ||
|
||||
!$this->has(MODE::DBCONFIGAVAILABLE);
|
||||
|
@ -248,7 +248,7 @@ class Mode
|
|||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isNormal()
|
||||
public function isNormal(): bool
|
||||
{
|
||||
return $this->has(Mode::LOCALCONFIGPRESENT) &&
|
||||
$this->has(Mode::DBAVAILABLE) &&
|
||||
|
@ -261,7 +261,7 @@ class Mode
|
|||
*
|
||||
* @return bool Is it a backend call
|
||||
*/
|
||||
public function isBackend()
|
||||
public function isBackend(): bool
|
||||
{
|
||||
return $this->isBackend;
|
||||
}
|
||||
|
@ -271,7 +271,7 @@ class Mode
|
|||
*
|
||||
* @return bool true if it was an AJAX request
|
||||
*/
|
||||
public function isAjax()
|
||||
public function isAjax(): bool
|
||||
{
|
||||
return $this->isAjax;
|
||||
}
|
||||
|
@ -281,7 +281,7 @@ class Mode
|
|||
*
|
||||
* @return bool true if it was an mobile request
|
||||
*/
|
||||
public function isMobile()
|
||||
public function isMobile(): bool
|
||||
{
|
||||
return $this->isMobile;
|
||||
}
|
||||
|
@ -291,7 +291,7 @@ class Mode
|
|||
*
|
||||
* @return bool true if it was an tablet request
|
||||
*/
|
||||
public function isTablet()
|
||||
public function isTablet(): bool
|
||||
{
|
||||
return $this->isTablet;
|
||||
}
|
||||
|
|
|
@ -30,8 +30,11 @@ use Friendica\Core\Config\Capability\IManageConfigValues;
|
|||
use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues;
|
||||
use Friendica\Core\Hook;
|
||||
use Friendica\Core\L10n;
|
||||
use Friendica\Core\Logger;
|
||||
use Friendica\Core\Renderer;
|
||||
use Friendica\Core\System;
|
||||
use Friendica\Core\Theme;
|
||||
use Friendica\Module\Response;
|
||||
use Friendica\Network\HTTPException;
|
||||
use Friendica\Util\Network;
|
||||
use Friendica\Util\Strings;
|
||||
|
@ -76,14 +79,37 @@ class Page implements ArrayAccess
|
|||
*/
|
||||
private $basePath;
|
||||
|
||||
private $timestamp = 0;
|
||||
private $command = '';
|
||||
private $method = '';
|
||||
|
||||
/**
|
||||
* @param string $basepath The Page basepath
|
||||
*/
|
||||
public function __construct(string $basepath)
|
||||
{
|
||||
$this->timestamp = microtime(true);
|
||||
$this->basePath = $basepath;
|
||||
}
|
||||
|
||||
public function setLogging(string $command, string $method)
|
||||
{
|
||||
$this->command = $command;
|
||||
$this->method = $method;
|
||||
}
|
||||
|
||||
public function logRuntime(IManageConfigValues $config, string $origin = '')
|
||||
{
|
||||
if (in_array($this->command, $config->get('system', 'runtime_ignore'))) {
|
||||
return;
|
||||
}
|
||||
|
||||
$runtime = number_format(microtime(true) - $this->timestamp, 3);
|
||||
if ($runtime > $config->get('system', 'runtime_loglimit')) {
|
||||
Logger::debug('Runtime', ['method' => $this->method, 'command' => $this->command, 'runtime' => $runtime, 'origin' => $origin]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether a offset exists
|
||||
*
|
||||
|
@ -169,7 +195,7 @@ class Page implements ArrayAccess
|
|||
* @param string $media
|
||||
* @see Page::initHead()
|
||||
*/
|
||||
public function registerStylesheet($path, string $media = 'screen')
|
||||
public function registerStylesheet(string $path, string $media = 'screen')
|
||||
{
|
||||
$path = Network::appendQueryParam($path, ['v' => FRIENDICA_VERSION]);
|
||||
|
||||
|
@ -229,7 +255,7 @@ class Page implements ArrayAccess
|
|||
|
||||
$shortcut_icon = $config->get('system', 'shortcut_icon');
|
||||
if ($shortcut_icon == '') {
|
||||
$shortcut_icon = 'images/friendica-32.png';
|
||||
$shortcut_icon = 'images/friendica.svg';
|
||||
}
|
||||
|
||||
$touch_icon = $config->get('system', 'touch_icon');
|
||||
|
@ -262,7 +288,7 @@ class Page implements ArrayAccess
|
|||
*
|
||||
* Taken from http://webcheatsheet.com/php/get_current_page_url.php
|
||||
*/
|
||||
private function curPageURL()
|
||||
private function curPageURL(): string
|
||||
{
|
||||
$pageURL = 'http';
|
||||
if (!empty($_SERVER["HTTPS"]) && ($_SERVER["HTTPS"] == "on")) {
|
||||
|
@ -419,6 +445,9 @@ class Page implements ArrayAccess
|
|||
{
|
||||
$moduleName = $args->getModuleName();
|
||||
|
||||
$this->command = $moduleName;
|
||||
$this->method = $args->getMethod();
|
||||
|
||||
/* Create the page content.
|
||||
* Calls all hooks which are including content operations
|
||||
*
|
||||
|
@ -503,11 +532,7 @@ class Page implements ArrayAccess
|
|||
}
|
||||
|
||||
if ($_GET["mode"] == "raw") {
|
||||
header("Content-type: text/html; charset=utf-8");
|
||||
|
||||
echo substr($target->saveHTML(), 6, -8);
|
||||
|
||||
exit();
|
||||
System::httpExit(substr($target->saveHTML(), 6, -8), Response::TYPE_HTML);
|
||||
}
|
||||
}
|
||||
|
||||
|
|