Compare commits
1553 commits
fix-admin-
...
main
Author | SHA1 | Date | |
---|---|---|---|
|
c4a429ed47 | ||
|
fbe2c95ff1 | ||
|
a0af356df6 | ||
|
dac312a11a | ||
|
de21695162 | ||
|
628b350516 | ||
|
919747322f | ||
|
c04b762b9c | ||
|
ef09016f35 | ||
|
fcaeae7761 | ||
|
6a1d41635b | ||
|
c1de673060 | ||
|
2bad619d17 | ||
|
06b68490d1 | ||
|
2889c68610 | ||
|
3c70f0a9c9 | ||
|
f847f67410 | ||
|
d13702ac06 | ||
|
10370d316a | ||
|
2c7df002fa | ||
|
70415714f1 | ||
|
7a3c6bb888 | ||
|
c761e7a5ef | ||
|
b4fe2d1004 | ||
|
c649f4d386 | ||
|
bf1c7e2122 | ||
|
7fbc17afa2 | ||
|
99d2693071 | ||
|
2644a28cb3 | ||
|
2d12948220 | ||
|
ebf1d74e40 | ||
|
8556a649d5 | ||
|
1e49be3328 | ||
|
fb1d9789db | ||
|
8a56587d62 | ||
|
726c7dea31 | ||
|
ff414a5489 | ||
|
9f63c428e1 | ||
|
3656a6b9cc | ||
|
cedf138313 | ||
|
1b5d207131 | ||
|
d412147d02 | ||
|
8f8c0fe88c | ||
|
7972e5981c | ||
|
1e95fa3df5 | ||
|
059d64a59e | ||
|
673c54f114 | ||
|
bbc49f15e0 | ||
|
725f21662f | ||
|
38596e49d4 | ||
|
623d3d2e32 | ||
|
19f78ea8fa | ||
|
1f5740e65c | ||
|
3d3429243f | ||
|
22e36271c5 | ||
|
72a8af8088 | ||
|
08c0e43b6f | ||
|
c50e9d078a | ||
|
f0cebaee00 | ||
|
baecdf2882 | ||
|
58200132d0 | ||
|
3a59ffde8d | ||
|
903e5a3f45 | ||
|
4114a7088a | ||
|
04c611daa1 | ||
|
63b379c2d9 | ||
|
596923da4a | ||
|
a0813806d6 | ||
|
c3388f4ab1 | ||
|
52540771b0 | ||
|
441cac758f | ||
|
7b68e6409b | ||
|
e8cc63105f | ||
|
e5d15a5b56 | ||
|
bae6ef315e | ||
|
5fb1c3e934 | ||
|
fe9eab51d1 | ||
|
6cdbc345f4 | ||
|
f239d31f23 | ||
|
5917b46c05 | ||
|
1f762f4271 | ||
|
78ef635980 | ||
|
a9bd5f65bb | ||
|
1133e05e3d | ||
|
44739096ec | ||
|
062197a193 | ||
|
7e2d5e8aa7 | ||
|
364f5f1f45 | ||
|
09191dee66 | ||
|
42e16ea52d | ||
|
55b210b3e5 | ||
|
52a50c5e43 | ||
|
f70bdba926 | ||
|
736b4283b0 | ||
|
714e68db38 | ||
|
ad568924c0 | ||
|
2b0112aab1 | ||
|
4555ecf995 | ||
|
97b6e38a7d | ||
|
e8481e67a7 | ||
|
64bea71714 | ||
|
ed07f10ca8 | ||
|
c52263f6f8 | ||
|
c8a1faa86b | ||
|
b59fb28e90 | ||
|
21b208afcb | ||
|
76454cc638 | ||
|
3d40282f1b | ||
|
e538584fbe | ||
|
51098035ed | ||
|
f6492a7c4d | ||
|
c8849d6cee | ||
|
98a9347dd7 | ||
|
69137f4a90 | ||
|
f80c3d40e8 | ||
|
33f06a4ae7 | ||
|
66a70ebb6e | ||
|
05d4c50f64 | ||
|
f77ed3a6b2 | ||
|
2413e5f3f0 | ||
|
855b611879 | ||
|
3ca73302a9 | ||
|
a75c86a89e | ||
|
758b5c7217 | ||
|
43bd2ad820 | ||
|
68dc60bd54 | ||
|
0759d921aa | ||
|
a22cfbb470 | ||
|
3b6eee5437 | ||
|
41c1ff9933 | ||
|
62ccc99af7 | ||
|
7618e12333 | ||
|
beb380c9c7 | ||
|
ca4211ff47 | ||
|
f3934f2fff | ||
|
ea3d3505d0 | ||
|
7b067ad95c | ||
|
71185763bd | ||
|
d0dbc54c9e | ||
|
03ec81eedc | ||
|
ca832c8dff | ||
|
17d197787c | ||
|
b1768153b2 | ||
|
31ab9b1115 | ||
|
6119668e45 | ||
|
491ab8de89 | ||
|
68d1df8bc3 | ||
|
1122697b37 | ||
|
2d4d99f135 | ||
|
cec1e902e0 | ||
|
3ffaa966b0 | ||
|
57b893d505 | ||
|
c0dcf15d1e | ||
|
e617ee7fd9 | ||
|
f4f2b062ec | ||
|
fe421257e5 | ||
|
098ced7420 | ||
|
47f0d7021e | ||
|
625216d8e1 | ||
|
d587a268fd | ||
|
14e2354eea | ||
|
f17fc5742e | ||
|
95b24c51ec | ||
|
4ed2b3590b | ||
|
593a652090 | ||
|
00466763e2 | ||
|
7b86e3a6ce | ||
|
dc7a49ddf6 | ||
|
08a50d3a71 | ||
|
99428cba55 | ||
|
86cbee77d6 | ||
|
fefda70ee0 | ||
|
5b2ff8d32d | ||
|
3d906d8e62 | ||
|
8acf18a960 | ||
|
cddcafec31 | ||
|
75bbe3b1b8 | ||
|
8654603b3f | ||
|
e5cd79cd9c | ||
|
f83166ae74 | ||
|
b02cda69e8 | ||
|
94fe9c3075 | ||
|
f343ed42ff | ||
|
51a33ce77a | ||
|
69378eac99 | ||
|
48e136605a | ||
|
4ae97a2e4c | ||
|
231e3ec552 | ||
|
0a78631e86 | ||
|
1b5ed32085 | ||
|
585cc1a604 | ||
|
4f15fd0ba1 | ||
|
c373148b3d | ||
|
e7deea62d1 | ||
|
92734e3df1 | ||
|
daf6f3453e | ||
|
cbb0153bd0 | ||
|
7fdeed5fbc | ||
|
72618ebf03 | ||
|
00b2720ef0 | ||
|
7955d4b959 | ||
|
eb80789b0b | ||
|
e1f819fd78 | ||
|
654d348aac | ||
|
642870c82b | ||
|
0cc77263fc | ||
|
413481f953 | ||
|
a2931d19ae | ||
|
aaca78da78 | ||
|
f890fdca41 | ||
|
4d85c27d1a | ||
|
ac7a29f068 | ||
|
f7d261cac7 | ||
|
575bf3fa20 | ||
|
dde60e2634 | ||
|
f32c2de6af | ||
|
acbf4d0dfe | ||
|
dd360e653e | ||
|
ca6106603b | ||
|
dba1645bf0 | ||
|
9f95c419d2 | ||
|
3301aadba8 | ||
|
4ef4db2a5a | ||
|
fc4452104c | ||
|
c76f29ae45 | ||
|
61264e52cc | ||
|
3b82d1ef68 | ||
|
66a22ab391 | ||
|
a1738f8991 | ||
|
03b0f3ac83 | ||
|
43b0b2f3f4 | ||
|
b46b7c3d5e | ||
|
b59683c156 | ||
|
17bd9a87b9 | ||
|
8c3c6dcae9 | ||
|
4415dd6036 | ||
|
ccbca50a25 | ||
|
fb389bd73c | ||
|
21fd25a269 | ||
|
71c92d3f56 | ||
|
625e086996 | ||
|
2d54986a03 | ||
|
75299a042c | ||
|
b59ce0a60f | ||
|
457c37e47a | ||
|
1e83092e47 | ||
|
552d69ad96 | ||
|
523e106cbf | ||
|
b31afc6294 | ||
|
5c826c408d | ||
|
167d86d21d | ||
|
2e2ba39abf | ||
|
6da9df774e | ||
|
147d8bd8fc | ||
|
9d039209cc | ||
|
d0b7bd4250 | ||
|
24b2c60beb | ||
|
87fbd08f74 | ||
|
07229089a6 | ||
|
ad66bbed62 | ||
|
82c663300a | ||
|
e62b514e95 | ||
|
c2231539c7 | ||
|
bd806a3090 | ||
|
a6186da983 | ||
|
cd5e98dbdb | ||
|
3d3bd344cb | ||
|
1af482659d | ||
|
cf36ee99bb | ||
|
290d78cea4 | ||
|
cf77d938f8 | ||
|
e9e4938bc9 | ||
|
d26c1cb2fe | ||
|
e1af21cfd0 | ||
|
628b3fa449 | ||
|
28cda42af5 | ||
|
c4c1bee880 | ||
|
93a6ebc83d | ||
|
96f51e593f | ||
|
31005aad12 | ||
|
553b169d48 | ||
|
5e796dc6f8 | ||
|
9bc0a6c861 | ||
|
53028af10e | ||
|
6774c339b2 | ||
|
36bc90e8aa | ||
|
73fecc3358 | ||
|
cf4992c918 | ||
|
97f657f818 | ||
|
53d26cfc1c | ||
|
19a8563905 | ||
|
d4f973227c | ||
|
302a58c22b | ||
|
86f6631d28 | ||
|
a02a453a40 | ||
|
c6c7c6223d | ||
|
9feba112a7 | ||
|
1615c3eb6e | ||
|
894ce3726a | ||
|
397845453e | ||
|
8e1e7fe2e0 | ||
|
99734ac936 | ||
|
86232e68a8 | ||
|
6c7cdedb24 | ||
|
60c4df3d1d | ||
|
e868f41923 | ||
|
86d4b6f7c9 | ||
|
b907871604 | ||
|
f8e8e622e5 | ||
|
89a6b76f99 | ||
|
8fdbb4d00d | ||
|
7bdb2433f1 | ||
|
16122761c5 | ||
|
ef582dc4f2 | ||
|
e37e8deb0f | ||
|
9965a23b04 | ||
|
78a6b871fe | ||
|
0cd0786aef | ||
|
b280a255c4 | ||
|
45ce858fd9 | ||
|
a5394980f2 | ||
|
cd0a87f170 | ||
|
104157bd01 | ||
|
029b5cd5b1 | ||
|
5333447be0 | ||
|
e98833748e | ||
|
53817294fc | ||
|
dd7176a4b5 | ||
|
6ba52306f9 | ||
|
6f1559ed0f | ||
|
d055d75172 | ||
|
d70303bba6 | ||
|
b1a48e05b6 | ||
|
c476dfc725 | ||
|
476e74b4c4 | ||
|
f4b78028a3 | ||
|
f7613febb3 | ||
|
fd3c482104 | ||
|
d3afd7a2f1 | ||
|
9358fd295d | ||
|
c374729225 | ||
|
89e1974f30 | ||
|
455a754081 | ||
|
68d9dcd425 | ||
|
c989faaa62 | ||
|
36b0ff57b7 | ||
|
782b6835f7 | ||
|
833d9c2f1c | ||
|
9f4930ec11 | ||
|
608343c135 | ||
|
ca80beb653 | ||
|
0beb095a4b | ||
|
bbf74498f5 | ||
|
3114c826a7 | ||
|
106648b456 | ||
|
86a80acf40 | ||
|
622f603ac7 | ||
|
1e1289b024 | ||
|
e1227457f1 | ||
|
8515bc7962 | ||
|
5925a31b78 | ||
|
a70e2cd649 | ||
|
4b7f32a2a6 | ||
|
02a34252ba | ||
|
ffe735344b | ||
|
34c269310d | ||
|
4cb2323458 | ||
|
54f0f1b9ef | ||
|
8c81db5a41 | ||
|
e53fc34e9a | ||
|
bd220c32f1 | ||
|
5187e4e758 | ||
|
3151b260e2 | ||
|
58fc889c6f | ||
|
ca8d52c2a4 | ||
|
18ac5f1cc8 | ||
|
b5b1a202cc | ||
|
c8bf6192e4 | ||
|
3a41fccc43 | ||
|
d0c9ac3919 | ||
|
d54e7ee61e | ||
|
c64be9758f | ||
|
d1de7fb7fa | ||
|
a442f481f8 | ||
|
7c65f52692 | ||
|
30e786225e | ||
|
312d616371 | ||
|
0498b106c9 | ||
|
29604763d7 | ||
|
887976814a | ||
|
c95d9aab56 | ||
|
9616f5bb22 | ||
|
1e7ea50f4c | ||
|
c4b92b1aee | ||
|
bb89f83cc0 | ||
|
03b991de6c | ||
|
0165449e3a | ||
|
c2170991c7 | ||
|
e02812d5b6 | ||
|
b1a219552e | ||
|
f002878c95 | ||
|
5f9e47be34 | ||
|
b8f6f03956 | ||
|
4fb0aae636 | ||
|
20aa8881dc | ||
|
139ea4c981 | ||
|
bfafb114a2 | ||
|
1c3192df6b | ||
|
5825402ed5 | ||
|
7c8e2b9859 | ||
|
053dac2afa | ||
|
9387beb3b3 | ||
|
1dca08b76f | ||
|
cbb440bbc2 | ||
|
125322718b | ||
|
74d40c7d8f | ||
|
e0eb39d41b | ||
|
e91418436a | ||
|
cb27d89997 | ||
|
0f5e6dd02b | ||
|
ae07cfb868 | ||
|
6804228fdf | ||
|
15bae3e0e4 | ||
|
c68e6b52d9 | ||
|
55f54be23c | ||
|
d0ba77047e | ||
|
03d9618595 | ||
|
fea142fb9a | ||
|
bb1ef11c30 | ||
|
2d9a85db6e | ||
|
26478f461c | ||
|
a529d6d93e | ||
|
ac9fb0d654 | ||
|
40c7f3e830 | ||
|
276b85bc91 | ||
|
5724da0780 | ||
|
3b024c563c | ||
|
ad83e64795 | ||
|
6094a916b1 | ||
|
30ef110224 | ||
|
a449ee8654 | ||
|
f910f0dc92 | ||
|
7926cb1bc7 | ||
|
55af04b253 | ||
|
e6d415bb1f | ||
|
dc5c86add7 | ||
|
317ec06dc7 | ||
|
5fa340931e | ||
|
dae954ef11 | ||
|
223e152312 | ||
|
9bf6a8af82 | ||
|
923f06a07c | ||
|
d9d722d74b | ||
|
10922294ff | ||
|
8dfe5179ee | ||
|
07cc201acc | ||
|
8ae0936ddd | ||
|
5f733ad83a | ||
|
09f04d710d | ||
|
371d969403 | ||
|
c7bab3318e | ||
|
d7595adbf4 | ||
|
3e18e05330 | ||
|
d2eb726962 | ||
|
f6bcf86caf | ||
|
52ebfb7792 | ||
|
1546538de9 | ||
|
2277913f3f | ||
|
aafbc82d88 | ||
|
eebbc5439a | ||
|
31e23269f9 | ||
|
8ebff0efcb | ||
|
d96fac8b93 | ||
|
1f986d2e52 | ||
|
ca6e92fdb8 | ||
|
1ce17cf316 | ||
|
f8ca3bb2a1 | ||
|
dee69be60e | ||
|
3de6c9c02d | ||
|
940e80a81b | ||
|
945f44fb6e | ||
|
2015e6b331 | ||
|
1a05258cd1 | ||
|
89fbdcdf30 | ||
|
0f02e97c01 | ||
|
54189e9fc4 | ||
|
7d25f72b9f | ||
|
bf0ab3e0fa | ||
|
1ae508bf2f | ||
|
8f07381856 | ||
|
487d81fb92 | ||
|
6f01111863 | ||
|
267978d4fe | ||
|
0ca29eaa3f | ||
|
fcca781aae | ||
|
9757c917da | ||
|
30453fab80 | ||
|
8046cf34d6 | ||
|
dd76bbf8b7 | ||
|
3ad0a2ae3d | ||
|
73de39e632 | ||
|
5452af2188 | ||
|
3124f946ee | ||
|
1fd6460b02 | ||
|
c2c14331b2 | ||
|
a43a823768 | ||
|
56efa8d22f | ||
|
45d3b32488 | ||
|
74ead7d106 | ||
|
73a48318a1 | ||
|
062b3c9090 | ||
|
53e86747e4 | ||
|
1d34eff63f | ||
|
7c152acb2c | ||
|
abf6c87ee8 | ||
|
c60f9cb865 | ||
|
e623c07372 | ||
|
7777524145 | ||
|
6faa51edc7 | ||
|
6e1be17b61 | ||
|
94feb2b93f | ||
|
5e908c5a95 | ||
|
23d367f544 | ||
|
9215ad5f19 | ||
|
21af674fb2 | ||
|
74738b4993 | ||
|
839f893168 | ||
|
b0e3f0312c | ||
|
d19c7f4a4c | ||
|
4d9a3f8ab0 | ||
|
2792184907 | ||
|
7d3d29c418 | ||
|
aefa9253d6 | ||
|
1b83040bd4 | ||
|
4adb267f91 | ||
|
9c7f4ab8e8 | ||
|
dd5d99f83f | ||
|
8a1d10cb35 | ||
|
3702afec9f | ||
|
4c7b5fb6c1 | ||
|
c618d3a0a5 | ||
|
e02bdc14fd | ||
|
219c38b921 | ||
|
f01310dadb | ||
|
8a9d774a84 | ||
|
1bd00036c2 | ||
|
b04633a961 | ||
|
7afc6a630c | ||
|
5f6c0d63e3 | ||
|
de345e70d8 | ||
|
7f036be169 | ||
|
d868c1ced5 | ||
|
adf6fdf0a9 | ||
|
c70bffd89f | ||
|
d787343325 | ||
|
05148e2c77 | ||
|
3eef8a7a81 | ||
|
5f79200a5e | ||
|
32c3bd3c53 | ||
|
d3f1a010e5 | ||
|
f879c42747 | ||
|
0765324622 | ||
|
2b00ccdbd5 | ||
|
f41ec9af05 | ||
|
a5112b51fd | ||
|
e82467ca41 | ||
|
45ebdb72ca | ||
|
678fc4d292 | ||
|
d4b0aa7450 | ||
|
d84c53e769 | ||
|
9a685e2f8c | ||
|
a2ba011326 | ||
|
7fb738c837 | ||
|
99a43f0282 | ||
|
402ee73e24 | ||
|
021ccf46af | ||
|
34c8707dec | ||
|
93f340a4bf | ||
|
62782babd0 | ||
|
58d5b28cb0 | ||
|
5fd46dddd7 | ||
|
679274465b | ||
|
26f2586b62 | ||
|
0e41d360c0 | ||
|
9f65909f42 | ||
|
d2528b26b6 | ||
|
cedcece0cc | ||
|
02ba9cfa35 | ||
|
e2b561e3a5 | ||
|
6580ac7241 | ||
|
971279efa8 | ||
|
33b018648a | ||
|
3093611f09 | ||
|
f0e8e67e47 | ||
|
deb45b0a44 | ||
|
988c3a8593 | ||
|
240beed171 | ||
|
4f129dc763 | ||
|
89ca8a2d8a | ||
|
29cb5577f3 | ||
|
fc3d248df7 | ||
|
216dbaedaf | ||
|
37eaa7fc01 | ||
|
c55219efa8 | ||
|
5cf056fdb0 | ||
|
cf5d27c3b7 | ||
|
c8245e64c5 | ||
|
36f4c32a38 | ||
|
e623c302d5 | ||
|
43b5d5e38d | ||
|
1a5150e9c3 | ||
|
ce5d092a86 | ||
|
0d0f3c15d3 | ||
|
55a2e9b5be | ||
|
d86dd067ce | ||
|
2635c8dc5c | ||
|
88b3a0681c | ||
|
950900b968 | ||
|
97d34c5117 | ||
|
1d5196918a | ||
|
5c9abdeff1 | ||
|
3e0999cd11 | ||
|
911951e776 | ||
|
bec214d090 | ||
|
be05e6a37d | ||
|
7165e89362 | ||
|
85890bc80f | ||
|
0c99c6c3df | ||
|
0d6b878808 | ||
|
d2f7e30a28 | ||
|
26c51cfa07 | ||
|
8cf7006d4e | ||
|
84aff598ea | ||
|
1cc32dd50c | ||
|
303221db24 | ||
|
0b5e8ae268 | ||
|
04cd244a9a | ||
|
9ec25fd8dc | ||
|
7191db0e43 | ||
|
195087bee0 | ||
|
0f24ef4673 | ||
|
665582d93e | ||
|
8e25e6c3a8 | ||
|
50948b46aa | ||
|
882e54c786 | ||
|
7b38cb88ca | ||
|
1145dbd327 | ||
|
14c7c9e40e | ||
|
58d219621e | ||
|
2163cd333d | ||
|
6307634db5 | ||
|
526b4b3677 | ||
|
0aacf00f5b | ||
|
4793950136 | ||
|
f84adc2ccf | ||
|
802fcd06dd | ||
|
b312f35d24 | ||
|
7ceab5bc04 | ||
|
0b9167494b | ||
|
bc58833bba | ||
|
3edf32b5a5 | ||
|
aa94c3355f | ||
|
56dd2dc6b9 | ||
|
103cec2302 | ||
|
9ff24772e2 | ||
|
2750a7a0e6 | ||
|
af46584f82 | ||
|
95a149d7c1 | ||
|
6ad807f860 | ||
|
e7ed2283fa | ||
|
77e17a22f7 | ||
|
bf725837d5 | ||
|
e97cdd47bd | ||
|
5073a755d7 | ||
|
dcd81f05bc | ||
|
59b53c6869 | ||
|
06b64f2e19 | ||
|
90917b305a | ||
|
4aa3b9bd01 | ||
|
546672e292 | ||
|
c57907737a | ||
|
c99c106ef0 | ||
|
2a7766dcc9 | ||
|
c556c3a0d1 | ||
|
b399d79545 | ||
|
ff19dad5a0 | ||
|
159b4edeef | ||
|
c7147bab90 | ||
|
1fac99e842 | ||
|
1d84cbeaab | ||
|
af396fa35f | ||
|
0b3e4fd5de | ||
|
5b0e8cc92b | ||
|
d696f729f1 | ||
|
3c79ccb7e3 | ||
|
c36262c914 | ||
|
0396acf39e | ||
|
99aed9069d | ||
|
81e1cc5fec | ||
|
55bef1e34f | ||
|
2cae5f5b8d | ||
|
63adef2021 | ||
|
3efa8da2d6 | ||
|
861b35dd54 | ||
|
1165943968 | ||
|
e682975afd | ||
|
63a5514b29 | ||
|
42ff4dce41 | ||
|
5d70a16a14 | ||
|
66b8abf218 | ||
|
af9c9936dd | ||
|
8479a4b0c1 | ||
|
03241d884e | ||
|
ba745ca99a | ||
|
19f2f35b33 | ||
|
afb8bc97d0 | ||
|
50487db122 | ||
|
d156e9b823 | ||
|
115b8311c1 | ||
|
26a1d1ac5f | ||
|
37de05fdde | ||
|
ca55361671 | ||
|
b21aa82803 | ||
|
0412a4d03e | ||
|
d83faa1a89 | ||
|
5920d8fe33 | ||
|
a6dc606d52 | ||
|
1254fa122f | ||
|
99f6be3b60 | ||
|
a7c280f93a | ||
|
5935e61306 | ||
|
71d403230e | ||
|
a220c84181 | ||
|
96fdbdb0ad | ||
|
0a3c0cbff7 | ||
|
da2a5233be | ||
|
1cadebfcc7 | ||
|
86b3649204 | ||
|
d415f1116b | ||
|
656ac99ef0 | ||
|
461239db5d | ||
|
d92ce31c92 | ||
|
6aa83b13ba | ||
|
113dd90aa3 | ||
|
9f61f22a3b | ||
|
c384430ba0 | ||
|
1abf2a0584 | ||
|
b794addc4a | ||
|
2d6b41fe30 | ||
|
334acf9379 | ||
|
ac27972d9d | ||
|
aa33c7f26e | ||
|
f879cf03f0 | ||
|
fc46fa8f99 | ||
|
8d33189104 | ||
|
e6979aa6d4 | ||
|
03f19b8cd3 | ||
|
7ccf7a73f1 | ||
|
041f87471f | ||
|
0a2433948b | ||
|
4e830af31c | ||
|
e341352700 | ||
|
47066bb26a | ||
|
79ccc1575f | ||
|
2aba0a98f8 | ||
|
c23a0a3ebc | ||
|
d53152baa4 | ||
|
6897f70119 | ||
|
47bbd53eca | ||
|
4b36e47474 | ||
|
e606140bac | ||
|
6af383213a | ||
|
7bfbf1c119 | ||
|
f3bb142b8f | ||
|
742a8301e7 | ||
|
7ad86cbc96 | ||
|
07025a7f1b | ||
|
f12afa177e | ||
|
1f611d6ffb | ||
|
d52afaa6c7 | ||
|
f305bd2c76 | ||
|
3bc3a172eb | ||
|
9608e720a4 | ||
|
76ff452306 | ||
|
f5d8501138 | ||
|
726931fe4a | ||
|
f8b3e36929 | ||
|
c87534b813 | ||
|
d5ca204e89 | ||
|
a44ea8af53 | ||
|
085ce95dc2 | ||
|
21a536a16e | ||
|
f290be71e0 | ||
|
f8835387ea | ||
|
d7595ce333 | ||
|
e37a792c36 | ||
|
22755e621b | ||
|
bd9095fcfa | ||
|
e8e65c10bc | ||
|
e8207d9840 | ||
|
bcc6510f53 | ||
|
8a67e6e237 | ||
|
f248d95be2 | ||
|
ec83e2a35e | ||
|
ad489f865a | ||
|
c3f0621a59 | ||
|
ecb3bb3256 | ||
|
05e39dc619 | ||
|
bbb5f1917d | ||
|
6ca0de9494 | ||
|
e7aa2be828 | ||
|
12ed2d793b | ||
|
04cdfc0086 | ||
|
befbac3f1c | ||
|
25e076505e | ||
|
c9d6571da8 | ||
|
3eeb10d9fe | ||
|
65537ff4d9 | ||
|
0e785b1309 | ||
|
fa01b993cf | ||
|
fff0a55df2 | ||
|
9442017224 | ||
|
1b9030bff4 | ||
|
35c69f0e1f | ||
|
15ec3c357f | ||
|
d8082ed772 | ||
|
0665ba8a23 | ||
|
44b2ee3485 | ||
|
1b4054256f | ||
|
a233a9bfb5 | ||
|
3c24f19afe | ||
|
fb552dde2c | ||
|
128d611beb | ||
|
d14aa65adc | ||
|
df27953f96 | ||
|
24da5cccfe | ||
|
3f06ccbd78 | ||
|
5560f077c1 | ||
|
f804c00920 | ||
|
9820751a59 | ||
|
8cc86af76b | ||
|
47d74256c4 | ||
|
38f9b18343 | ||
|
07e2519054 | ||
|
efa65267ed | ||
|
02851848e9 | ||
|
5823ae70c4 | ||
|
5c6a2fcefe | ||
|
2936f42a14 | ||
|
602f291da9 | ||
|
829b978a89 | ||
|
35588d09e2 | ||
|
9c571a95db | ||
|
6c2d3038f4 | ||
|
65ad589848 | ||
|
47f2ff617d | ||
|
9134ed63f3 | ||
|
327eed0076 | ||
|
27f41768e8 | ||
|
0aee67fa35 | ||
|
50e261ff66 | ||
|
f7d589aa87 | ||
|
d31ecdec5a | ||
|
14dff49f92 | ||
|
0391b2a603 | ||
|
7b5100aaed | ||
|
89ac84d076 | ||
|
bb096ed888 | ||
|
81d68a458a | ||
|
9ba42984e6 | ||
|
2c5fbf68b7 | ||
|
d5a890c766 | ||
|
5d3995e51e | ||
|
943dfb854c | ||
|
9cec3f3597 | ||
|
4e26fb0ea9 | ||
|
e789b8d4c1 | ||
|
b37825f2e2 | ||
|
757fe82fd5 | ||
|
7aa2a059f8 | ||
|
6e226a8736 | ||
|
73c903e63d | ||
|
aab1a1c409 | ||
|
3f02157a94 | ||
|
cc7cebb79a | ||
|
af9d7a208a | ||
|
152a4dc681 | ||
|
6427e039b7 | ||
|
ea2640e76f | ||
|
620b70c41e | ||
|
fe2d6fe105 | ||
|
e3cebfa457 | ||
|
32c83d76a0 | ||
|
2d818d9c97 | ||
|
f88d1db904 | ||
|
f09a66b9a7 | ||
|
37cd984acf | ||
|
45aa5781ce | ||
|
a2871cd747 | ||
|
17ba5e1e61 | ||
|
0c23a2fe0b | ||
|
593228fe17 | ||
|
2c9c2d2b95 | ||
|
1485bd9b4b | ||
|
80fc165bb5 | ||
|
9d4861b498 | ||
|
ae4f068a84 | ||
|
84266f87e7 | ||
|
3f14260574 | ||
|
28329ba62f | ||
|
f5783182c3 | ||
|
129de8e4c7 | ||
|
1d696fd070 | ||
|
3abf32e64f | ||
|
628c177ebe | ||
|
28212bd2be | ||
|
14d7cf39f4 | ||
|
2f6416db53 | ||
|
3238f570db | ||
|
1497aa81c6 | ||
|
7f6e79241d | ||
|
d9ee3219ab | ||
|
0d00ecb6bc | ||
|
083bc137bc | ||
|
dc7e2985e6 | ||
|
fed7380e9f | ||
|
0ac6e5d434 | ||
|
38ff5fd6f1 | ||
|
9a4b84d7ea | ||
|
379a7a7ca7 | ||
|
d21251f8fe | ||
|
e34dd3644c | ||
|
fbcbf7898f | ||
|
0a1992430d | ||
|
52f4e834f2 | ||
|
8a9acbe604 | ||
|
c4d2c39a75 | ||
|
1ff4877945 | ||
|
976cd6413e | ||
|
9f81b9f29a | ||
|
96129c2f10 | ||
|
3e0e7a1cfb | ||
|
702b709d9a | ||
|
d8abc0018f | ||
|
088dc0ec5a | ||
|
a4fa9e23fc | ||
|
440eb71310 | ||
|
86f4dba47e | ||
|
77823333bb | ||
|
ddddd4c043 | ||
|
01db331657 | ||
|
2bc5e41b83 | ||
|
4d48d83b00 | ||
|
25dda3061e | ||
|
96f29ce91a | ||
|
e5997a1956 | ||
|
a9b64b24d6 | ||
|
54bb659ad1 | ||
|
dfb9e6dab1 | ||
|
e925b06721 | ||
|
9a0fa28993 | ||
|
679b7158e3 | ||
|
ded5a0254a | ||
|
ffc2971466 | ||
|
a918a76bfb | ||
|
6b4e2d5ce6 | ||
|
6048eeed04 | ||
|
1a880533ac | ||
|
d842f645d1 | ||
|
a4d7426f10 | ||
|
82d4a45630 | ||
|
9fcef31580 | ||
|
e0bdaeab65 | ||
|
c78a622ba4 | ||
|
d25015fc5b | ||
|
6c699b1723 | ||
|
0cdb077570 | ||
|
c3fac61f56 | ||
|
95a036c598 | ||
|
98400a6887 | ||
|
42c976fd65 | ||
|
6cf57c6765 | ||
|
12535568f7 | ||
|
bda8345e91 | ||
|
2923ca461f | ||
|
a52dc01f30 | ||
|
3261d89af6 | ||
|
95555f15b5 | ||
|
68260c0257 | ||
|
a2ef5e3212 | ||
|
3ca348fa11 | ||
|
593637145e | ||
|
19216f93b5 | ||
|
e7d0bf731e | ||
|
d3c18058d7 | ||
|
b4d373a3df | ||
|
898fe2fa8e | ||
|
662ed53c18 | ||
|
f714e24ff1 | ||
|
2b8dc58b7f | ||
|
f17e73da09 | ||
|
991353682d | ||
|
5a448d0d71 | ||
|
a53003c6f1 | ||
|
9250578e6b | ||
|
99d7684dfd | ||
|
336c23336a | ||
|
db01df2dda | ||
|
39820a940f | ||
|
8f4d7f54f8 | ||
|
132239008d | ||
|
8a6b796440 | ||
|
8c644dcbd9 | ||
|
c08bc2da61 | ||
|
f18c620d4b | ||
|
881d71e58c | ||
|
381415bd97 | ||
|
6e736f2452 | ||
|
a01580f09f | ||
|
014065913c | ||
|
340fa34513 | ||
|
e2d1d3b428 | ||
|
7e244879fe | ||
|
aed1c47cb1 | ||
|
a6508d652b | ||
|
d96000bd31 | ||
|
80da658069 | ||
|
ce2449421c | ||
|
5bfdc11fb9 | ||
|
3cc0233adc | ||
|
9723b768c5 | ||
|
5a8a6a1e8c | ||
|
51ce836edb | ||
|
b3496583e0 | ||
|
0597e5db68 | ||
|
bc19c083ce | ||
|
71d02ffcf3 | ||
|
6b7765a73b | ||
|
fe6a5b0d5a | ||
|
9a3be0ad68 | ||
|
33f3818d66 | ||
|
6e4d932da5 | ||
|
5a48bf1085 | ||
|
6da648227e | ||
|
ad084ce7db | ||
|
f6d35ed57d | ||
|
7b0fe4aef9 | ||
|
6476f7e4da | ||
|
5c691430e5 | ||
|
74e20f22cd | ||
|
6726d2933a | ||
|
e7f0c9f7da | ||
|
be0bc9acbf | ||
|
a8e27ac4d1 | ||
|
66a63d79ea | ||
|
eed5a4bf9c | ||
|
84d991988e | ||
|
8284110c55 | ||
|
3917353645 | ||
|
9bf04db23a | ||
|
9b4024a389 | ||
|
d55154819e | ||
|
bf75fba794 | ||
|
bbe97548c2 | ||
|
b5d2c91d4a | ||
|
4bd82e15fb | ||
|
7598e0cd1f | ||
|
b93e2ae0a4 | ||
|
b9197486e5 | ||
|
0360135d4d | ||
|
33cd80d69c | ||
|
f47a9ddc9f | ||
|
8ffa96b059 | ||
|
ea38327816 | ||
|
4884e0ca41 | ||
|
ea0633e131 | ||
|
2051786c9e | ||
|
36f0eac09c | ||
|
64dde6541b | ||
|
5781d1db84 | ||
|
50a088fd77 | ||
|
a294981c59 | ||
|
f1b8150db4 | ||
|
a3c8b02258 | ||
|
c2fda997d1 | ||
|
822a7fecc6 | ||
|
12be6a071f | ||
|
50c20546a4 | ||
|
82d91dfce2 | ||
|
b0fe837069 | ||
|
072f1e4898 | ||
|
9b7387d917 | ||
|
ab54d91fe3 | ||
|
daa8b9e0c1 | ||
|
07994cf4f6 | ||
|
1de748bf5e | ||
|
85b34a8d62 | ||
|
331cca4015 | ||
|
4c9949560d | ||
|
dc50347247 | ||
|
ed5491e5de | ||
|
012537452a | ||
|
82655597db | ||
|
68273a7c6d | ||
|
a39bf04fe6 | ||
|
3906dd67ed | ||
|
8e20e16cf0 | ||
|
fd9a9b07c2 | ||
|
6b72641641 | ||
|
f06a3b56a3 | ||
|
6e418bf346 | ||
|
46633f1de1 | ||
|
29264336d7 | ||
|
2afe479d01 | ||
|
cb45c04d26 | ||
|
5f0fc639da | ||
|
465ee7792f | ||
|
ebe01ea194 | ||
|
ce9dcbea32 | ||
|
8c03b45fff | ||
|
1b91359a45 | ||
|
f382192862 | ||
|
dd4c156f33 | ||
|
8f91e304a5 | ||
|
454ef42aab | ||
|
6221b36b27 | ||
|
abb11778d7 | ||
|
62c6e12fa5 | ||
|
d116cb7733 | ||
|
04b4b541f8 | ||
|
5e49cb8f0f | ||
|
76f7759ecb | ||
|
c35ef5cb49 | ||
|
bf29651fe3 | ||
|
b15b41cb2c | ||
|
95256f26f5 | ||
|
275dad9702 | ||
|
0ec695e036 | ||
|
80ded02a4b | ||
|
0a8a0fb599 | ||
|
39b489ba4c | ||
|
44b7be45f1 | ||
|
24d446adf2 | ||
|
ea0cfd8e7e | ||
|
ef196c913c | ||
|
8c7223f4ea | ||
|
bbc7afa2a2 | ||
|
5554ff2a1d | ||
|
607ce67e05 | ||
|
2cc7ba2671 | ||
|
2de5128e66 | ||
|
cc9cd25d30 | ||
|
22c19eefb1 | ||
|
5b83733d32 | ||
|
64e087e0c3 | ||
|
560f2cc9e3 | ||
|
8d7064faeb | ||
|
a2091f9daf | ||
|
c6302848b4 | ||
|
0949881355 | ||
|
1e46c29047 | ||
|
894956e20c | ||
|
22eeaf2645 | ||
|
30658924a8 | ||
|
56edc6552f | ||
|
2c45859ca9 | ||
|
e6a159a648 | ||
|
d7d049aab7 | ||
|
24e78969ae | ||
|
07f8b4d1b1 | ||
|
cefa526c6d | ||
|
2dd30804b6 | ||
|
52813830be | ||
|
6907605026 | ||
|
71f2b95106 | ||
|
e3a2203061 | ||
|
f572a68a0c | ||
|
f65eaa5aae | ||
|
b58db8f12e | ||
|
9565b17d5d | ||
|
749fe73ec4 | ||
|
8751c3c495 | ||
|
2de44d3e47 | ||
|
b475c8ab97 | ||
|
67d550830b | ||
|
410989e081 | ||
|
d5df9d4797 | ||
|
392b367835 | ||
|
4e9855e09a | ||
|
69f9dc4f4e | ||
|
890fae8b54 | ||
|
883a7918be | ||
|
737a77cef3 | ||
|
5d90b90755 | ||
|
3afd59df0f | ||
|
f29458da1d | ||
|
7eb2e791ee | ||
|
47ada1b6d1 | ||
|
a651a9678a | ||
|
584d8b977b | ||
|
cf5435bb27 | ||
|
c0e3b20c58 | ||
|
8ee4fde19b | ||
|
3349cbeb3e | ||
|
bf84654345 | ||
|
357ca69dc0 | ||
|
443d114574 | ||
|
a9bafe5df5 | ||
|
1ffda4cdd4 | ||
|
588d2b27a7 | ||
|
b07906bdb0 | ||
|
779efc7656 | ||
|
c9b3cf8510 | ||
|
e798c1c64c | ||
|
895212bb2f | ||
|
9b139d4ef9 | ||
|
82e1c6216e | ||
|
9fbe952789 | ||
|
4bdce2c513 | ||
|
703809ae98 | ||
|
a794117679 | ||
|
40a4dad4c8 | ||
|
9d0f117cb5 | ||
|
5d09e908d4 | ||
|
93ff3658b1 | ||
|
b06a8d11ea | ||
|
daf45a1677 | ||
|
c98241fd61 | ||
|
11a57f116c | ||
|
161d23c7ee | ||
|
224cb7fe03 | ||
|
e6ffbfb5e7 | ||
|
eebafe24a8 | ||
|
eb9a7e3626 | ||
|
d182470c9d | ||
|
91616004fe | ||
|
5db1f377ea | ||
|
74f406cfc9 | ||
|
71e7d38421 | ||
|
fa47c37f13 | ||
|
e38a01c41a | ||
|
e52085246f | ||
|
92a86b958e | ||
|
d3aa9cf774 | ||
|
46ad7fea9d | ||
|
ddbe906c25 | ||
|
883099f3c9 | ||
|
642528f455 | ||
|
ee8d4dd056 | ||
|
75e33fd08f | ||
|
bc320d6cec | ||
|
1745b71840 | ||
|
18e27e0488 | ||
|
64d2988d18 | ||
|
d7fab238a8 | ||
|
5ccd6cbfda | ||
|
63c9d2bc28 | ||
|
29ee3c61a3 | ||
|
07a178fd37 | ||
|
9f2791eb64 | ||
|
2a56a890da | ||
|
b2cd34474b | ||
|
803f536cdd | ||
|
72311ba460 | ||
|
59d76d03e4 | ||
|
6a07745951 | ||
|
c7f24aa21c | ||
|
4155a9ebde | ||
|
bd2cc49bc3 | ||
|
a057264fa4 | ||
|
70d4b46217 | ||
|
c65bdf25ea | ||
|
e54fd73df2 | ||
|
db04dfc8a6 | ||
|
3bc0aeed50 | ||
|
a6ed6845c9 | ||
|
d17fb70131 | ||
|
bd53dd5210 | ||
|
318d34d528 | ||
|
c0327ff31f | ||
|
8f6c67bfde | ||
|
61ae6b3535 | ||
|
dba4be1038 | ||
|
292c75aa31 | ||
|
edf09ec747 | ||
|
c439e13e12 | ||
|
b5329e0035 | ||
|
87a55e2cd6 | ||
|
2ea754b861 | ||
|
04c3ac896a | ||
|
02dbc59c91 | ||
|
6d3fa7828e | ||
|
ff43e54a49 | ||
|
631e495a79 | ||
|
085f286750 | ||
|
54d4ece743 | ||
|
c0c4b5718d | ||
|
9b58fb1ea4 | ||
|
e24b14cc74 | ||
|
02b8d63fce | ||
|
462a6f7d72 | ||
|
25d3dc4373 | ||
|
14919fe11e | ||
|
50ea54b3ed | ||
|
233f7e6174 | ||
|
57f8c9adac | ||
|
f2b8474069 | ||
|
79a07f10ba | ||
|
399cc757cb | ||
|
4ba7be5fc4 | ||
|
1392741044 | ||
|
f6a3c27e9d | ||
|
cb2e198d89 | ||
|
0883f05753 | ||
|
57814a98a9 | ||
|
0dc57ab6ed | ||
|
48caeb9d65 | ||
|
6aef76b5cd | ||
|
3d60708508 | ||
|
a5c24d5c4d | ||
|
0f75490b49 | ||
|
85f6a960f9 | ||
|
50452064b3 | ||
|
255748dff4 | ||
|
e884f7dfbd | ||
|
21e80a9792 | ||
|
2cd31b3177 | ||
|
d4592bbfcd | ||
|
27965ce5ed | ||
|
a29a982eaa | ||
|
91cc8d1e63 | ||
|
b7cf11d5a9 | ||
|
a9a43de6d1 | ||
|
1c3e5e44e2 | ||
|
0db101ede2 | ||
|
7b816eb5ae | ||
|
3e12abc1fe | ||
|
b950807fd2 | ||
|
d21bedc492 | ||
|
73f5e4a1d9 | ||
|
166f6e4b50 | ||
|
51e67f3243 | ||
|
b377022cf9 | ||
|
8338826963 | ||
|
8603a07504 | ||
|
2e89067d21 | ||
|
4dddb1a431 | ||
|
1761d9ba5d | ||
|
de448ab1b5 | ||
|
2426577a91 | ||
|
f9e7f2e409 | ||
|
1de2e3f980 | ||
|
ac99f586bb | ||
|
aa86cf9557 | ||
|
00b45b967e | ||
|
1abf0f9000 | ||
|
6ea80ba2a2 | ||
|
8f537a1168 | ||
|
73fce8d311 | ||
|
793da08995 | ||
|
2fd2666eea | ||
|
436d1243e5 | ||
|
448d62058c | ||
|
073543a19c | ||
|
5f4b9e1bce | ||
|
db94a3d94d | ||
|
b289644227 | ||
|
5939aa934b | ||
|
fee7d5cce6 | ||
|
61c2e74f07 | ||
|
f5c6ee4d54 | ||
|
564efd0651 | ||
|
5be705e1e0 | ||
|
298491a816 | ||
|
d39df35441 | ||
|
9a015e43ef | ||
|
901bbf2e5f | ||
|
bbd3474416 | ||
|
6240466866 | ||
|
f76dd51aa5 | ||
|
b87c853806 | ||
|
4a61bbe176 | ||
|
7396a254c1 | ||
|
38845592c4 | ||
|
ee40c2c5b0 | ||
|
d35bc9c3cc | ||
|
348855b6c5 | ||
|
6a99e33cbc | ||
|
79b167f01a | ||
|
e848d281d5 | ||
|
4a0b6e3e5e | ||
|
ee47e2028b | ||
|
8f03b7a2fb | ||
|
d0fcf07436 | ||
|
a27729ee48 | ||
|
a131f06e12 | ||
|
c9a52833b6 | ||
|
d4e6774a0c | ||
|
6f38765fcc | ||
|
cc7ae3932c | ||
|
c363fbe3a3 | ||
|
ccad1a3cae | ||
|
b391277057 | ||
|
f9f40069d5 | ||
|
67034ea1eb | ||
|
ccf5bcc3dc | ||
|
f23c8dee2a | ||
|
aed98fd4dd | ||
|
472bc89611 | ||
|
2af03164cb | ||
|
3dc1e3cfc3 | ||
|
009ad6f86b | ||
|
988f3dbdc4 | ||
|
4ff04e2343 | ||
|
d53ce60560 | ||
|
fbe4192c03 | ||
|
a50c752726 | ||
|
2c1e453d0c | ||
|
ae59818335 | ||
|
da91b18a8b | ||
|
63854bee6c | ||
|
1bfcb75105 | ||
|
63002cde03 | ||
|
20a3564ab2 | ||
|
2f8159baad | ||
|
5533fa28b6 | ||
|
3aebe711fd | ||
|
fd3a45e348 | ||
|
2adcad04ff | ||
|
b6d7726ecb | ||
|
85b86fe28c | ||
|
35850f8195 | ||
|
52c1b86964 | ||
|
f1f6ddd536 | ||
|
73a782391c | ||
|
0d2cf3cd4a | ||
|
92658f0fb0 | ||
|
097c4903f1 | ||
|
e03e7ac290 | ||
|
6a649e9131 | ||
|
bfe5ad5fee | ||
|
e001e116da | ||
|
e0263c7369 | ||
|
50ab3f3dcb | ||
|
3413f1c44b | ||
|
c8b1e72a4f | ||
|
948235592a | ||
|
d1ecc323e7 | ||
|
d0d15bf49c | ||
|
987d88ea56 | ||
|
4d6d4b43c6 | ||
|
54581d43e7 | ||
|
aa45404578 | ||
|
a0e06c3c3e | ||
|
c6b291afc3 | ||
|
a99adeaad3 | ||
|
ac583fce21 | ||
|
f5639e1cbe | ||
|
e38fc319dc | ||
|
03d59340da | ||
|
14c69a535b | ||
|
4942a7ce86 | ||
|
497b8eedda | ||
|
df78d83e95 | ||
|
166cc5b89d | ||
|
10188c7db7 | ||
|
6505b39e5d | ||
|
bebf9bf33f | ||
|
f0d73d82f8 | ||
|
7b2c733dfc | ||
|
cea00f593e | ||
|
69cb20bca4 | ||
|
daf2d8952d | ||
|
2dfb67f0c9 | ||
|
029d89bfea | ||
|
ee7fafe1c8 | ||
|
2033ca6b31 | ||
|
4b5629cc3d | ||
|
0d82c0359d | ||
|
d528db801f | ||
|
808e7cd906 | ||
|
244726e2e8 | ||
|
dd63923c0a | ||
|
0a120d86d2 | ||
|
a63495230a | ||
|
bddd9ba36d | ||
|
cfa583fa71 | ||
|
8a07ecd377 | ||
|
96f0b33c8b | ||
|
3a103cd317 | ||
|
1e8c885e5a | ||
|
6eea3f8f9c | ||
|
9eb775a9d1 | ||
|
d412a8d1f2 | ||
|
1060666c58 | ||
|
2d1f082bb6 | ||
|
f616897841 | ||
|
a1c14eb076 | ||
|
987299e0d1 | ||
|
db9d8c8e33 | ||
|
587dc720c3 | ||
|
8e619ab341 | ||
|
da2e05582b | ||
|
37ecfa090f | ||
|
bc563c4847 | ||
|
4cda245ed9 | ||
|
c4e748dcf2 | ||
|
b066bcf277 | ||
|
777b248bd1 | ||
|
3b825be804 | ||
|
733691322c | ||
|
95d63271be | ||
|
11a97be4b1 | ||
|
18cf973345 | ||
|
eefa287d59 | ||
|
8f8f4ab099 | ||
|
ecfed4f3e5 | ||
|
8647e19020 | ||
|
2a0fb61e31 | ||
|
c60f8ce032 | ||
|
14f436c457 | ||
|
d5c9feb7b7 | ||
|
081e4426f8 | ||
|
462bc65112 | ||
|
8e84ebf0cb | ||
|
b52fdb4c6f | ||
|
ea61d3acd6 | ||
|
bc7a8ae6d6 | ||
|
3dc0357d9e | ||
|
bc066d8936 | ||
|
e002f32336 | ||
|
5339af0efb | ||
|
0dcb8f6e37 | ||
|
de7f68d11c | ||
|
69acb8faea | ||
|
609dc96ebe | ||
|
3fa903fcf1 | ||
|
b10933e1f6 | ||
|
b1e5ba09d4 | ||
|
d5662b18af | ||
|
05d14a9956 | ||
|
7ac14a44be | ||
|
51c46c8bd6 | ||
|
a1b50a8a70 | ||
|
f96282f56e | ||
|
f82eaf531b | ||
|
a2ad0b0457 | ||
|
e8552007da | ||
|
cb499882dc | ||
|
d3db2eb7fb | ||
|
37e80994f8 | ||
|
fe71548844 | ||
|
e65080181a |
2389 changed files with 145382 additions and 64977 deletions
7
.browserslistrc
Normal file
7
.browserslistrc
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
[production]
|
||||||
|
defaults
|
||||||
|
not IE 11
|
||||||
|
not dead
|
||||||
|
|
||||||
|
[development]
|
||||||
|
supports es6-module
|
|
@ -1,8 +1,8 @@
|
||||||
version: 2.1
|
version: 2.1
|
||||||
|
|
||||||
orbs:
|
orbs:
|
||||||
ruby: circleci/ruby@1.2.0
|
ruby: circleci/ruby@2.0.0
|
||||||
node: circleci/node@4.7.0
|
node: circleci/node@5.0.3
|
||||||
|
|
||||||
executors:
|
executors:
|
||||||
default:
|
default:
|
||||||
|
@ -19,11 +19,11 @@ executors:
|
||||||
DB_USER: root
|
DB_USER: root
|
||||||
DISABLE_SIMPLECOV: true
|
DISABLE_SIMPLECOV: true
|
||||||
RAILS_ENV: test
|
RAILS_ENV: test
|
||||||
- image: cimg/postgres:14.0
|
- image: cimg/postgres:14.5
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_USER: root
|
POSTGRES_USER: root
|
||||||
POSTGRES_HOST_AUTH_METHOD: trust
|
POSTGRES_HOST_AUTH_METHOD: trust
|
||||||
- image: circleci/redis:6-alpine
|
- image: cimg/redis:7.0
|
||||||
|
|
||||||
commands:
|
commands:
|
||||||
install-system-dependencies:
|
install-system-dependencies:
|
||||||
|
@ -32,7 +32,7 @@ commands:
|
||||||
name: Install system dependencies
|
name: Install system dependencies
|
||||||
command: |
|
command: |
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y libicu-dev libidn11-dev libprotobuf-dev protobuf-compiler
|
sudo apt-get install -y libicu-dev libidn11-dev
|
||||||
install-ruby-dependencies:
|
install-ruby-dependencies:
|
||||||
parameters:
|
parameters:
|
||||||
ruby-version:
|
ruby-version:
|
||||||
|
@ -45,7 +45,7 @@ commands:
|
||||||
bundle config without 'development production'
|
bundle config without 'development production'
|
||||||
name: Set bundler settings
|
name: Set bundler settings
|
||||||
- ruby/install-deps:
|
- ruby/install-deps:
|
||||||
bundler-version: '2.2.31'
|
bundler-version: '2.3.26'
|
||||||
key: ruby<< parameters.ruby-version >>-gems-v1
|
key: ruby<< parameters.ruby-version >>-gems-v1
|
||||||
wait-db:
|
wait-db:
|
||||||
steps:
|
steps:
|
||||||
|
@ -68,7 +68,9 @@ jobs:
|
||||||
cache-version: v1
|
cache-version: v1
|
||||||
pkg-manager: yarn
|
pkg-manager: yarn
|
||||||
- run:
|
- run:
|
||||||
command: ./bin/rails assets:precompile
|
command: |
|
||||||
|
export NODE_OPTIONS=--openssl-legacy-provider
|
||||||
|
./bin/rails assets:precompile
|
||||||
name: Precompile assets
|
name: Precompile assets
|
||||||
- persist_to_workspace:
|
- persist_to_workspace:
|
||||||
paths:
|
paths:
|
||||||
|
@ -121,9 +123,77 @@ jobs:
|
||||||
- run:
|
- run:
|
||||||
command: ./bin/rails db:create
|
command: ./bin/rails db:create
|
||||||
name: Create database
|
name: Create database
|
||||||
|
- run:
|
||||||
|
command: ./bin/rails db:migrate VERSION=20171010025614
|
||||||
|
name: Run migrations up to v2.0.0
|
||||||
|
- run:
|
||||||
|
command: ./bin/rails tests:migrations:populate_v2
|
||||||
|
name: Populate database with test data
|
||||||
|
- run:
|
||||||
|
command: ./bin/rails db:migrate VERSION=20180514140000
|
||||||
|
name: Run migrations up to v2.4.0
|
||||||
|
- run:
|
||||||
|
command: ./bin/rails tests:migrations:populate_v2_4
|
||||||
|
name: Populate database with test data
|
||||||
|
- run:
|
||||||
|
command: ./bin/rails db:migrate VERSION=20180707154237
|
||||||
|
name: Run migrations up to v2.4.3
|
||||||
|
- run:
|
||||||
|
command: ./bin/rails tests:migrations:populate_v2_4_3
|
||||||
|
name: Populate database with test data
|
||||||
- run:
|
- run:
|
||||||
command: ./bin/rails db:migrate
|
command: ./bin/rails db:migrate
|
||||||
name: Run migrations
|
name: Run all remaining migrations
|
||||||
|
- run:
|
||||||
|
command: ./bin/rails tests:migrations:check_database
|
||||||
|
name: Check migration result
|
||||||
|
|
||||||
|
test-two-step-migrations:
|
||||||
|
executor:
|
||||||
|
name: default
|
||||||
|
ruby-version: '3.0'
|
||||||
|
steps:
|
||||||
|
- checkout
|
||||||
|
- install-system-dependencies
|
||||||
|
- install-ruby-dependencies:
|
||||||
|
ruby-version: '3.0'
|
||||||
|
- wait-db
|
||||||
|
- run:
|
||||||
|
command: ./bin/rails db:create
|
||||||
|
name: Create database
|
||||||
|
- run:
|
||||||
|
command: ./bin/rails db:migrate VERSION=20171010025614
|
||||||
|
name: Run migrations up to v2.0.0
|
||||||
|
- run:
|
||||||
|
command: ./bin/rails tests:migrations:populate_v2
|
||||||
|
name: Populate database with test data
|
||||||
|
- run:
|
||||||
|
command: ./bin/rails db:migrate VERSION=20180514140000
|
||||||
|
name: Run pre-deployment migrations up to v2.4.0
|
||||||
|
environment:
|
||||||
|
SKIP_POST_DEPLOYMENT_MIGRATIONS: true
|
||||||
|
- run:
|
||||||
|
command: ./bin/rails tests:migrations:populate_v2_4
|
||||||
|
name: Populate database with test data
|
||||||
|
- run:
|
||||||
|
command: ./bin/rails db:migrate VERSION=20180707154237
|
||||||
|
name: Run migrations up to v2.4.3
|
||||||
|
environment:
|
||||||
|
SKIP_POST_DEPLOYMENT_MIGRATIONS: true
|
||||||
|
- run:
|
||||||
|
command: ./bin/rails tests:migrations:populate_v2_4_3
|
||||||
|
name: Populate database with test data
|
||||||
|
- run:
|
||||||
|
command: ./bin/rails db:migrate
|
||||||
|
name: Run all remaining pre-deployment migrations
|
||||||
|
environment:
|
||||||
|
SKIP_POST_DEPLOYMENT_MIGRATIONS: true
|
||||||
|
- run:
|
||||||
|
command: ./bin/rails db:migrate
|
||||||
|
name: Run all post-deployment migrations
|
||||||
|
- run:
|
||||||
|
command: ./bin/rails tests:migrations:check_database
|
||||||
|
name: Check migration result
|
||||||
|
|
||||||
workflows:
|
workflows:
|
||||||
version: 2
|
version: 2
|
||||||
|
@ -142,11 +212,14 @@ workflows:
|
||||||
- test-migrations:
|
- test-migrations:
|
||||||
requires:
|
requires:
|
||||||
- build
|
- build
|
||||||
|
- test-two-step-migrations:
|
||||||
|
requires:
|
||||||
|
- build
|
||||||
- node/run:
|
- node/run:
|
||||||
cache-version: v1
|
cache-version: v1
|
||||||
name: test-webui
|
name: test-webui
|
||||||
pkg-manager: yarn
|
pkg-manager: yarn
|
||||||
requires:
|
requires:
|
||||||
- build
|
- build
|
||||||
version: lts
|
version: '16.18'
|
||||||
yarn-run: test:jest
|
yarn-run: test:jest
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
version: "2"
|
version: '2'
|
||||||
checks:
|
checks:
|
||||||
argument-count:
|
argument-count:
|
||||||
enabled: false
|
enabled: false
|
||||||
|
@ -26,16 +26,14 @@ plugins:
|
||||||
bundler-audit:
|
bundler-audit:
|
||||||
enabled: true
|
enabled: true
|
||||||
eslint:
|
eslint:
|
||||||
enabled: true
|
enabled: false
|
||||||
channel: eslint-7
|
|
||||||
rubocop:
|
rubocop:
|
||||||
enabled: true
|
enabled: false
|
||||||
channel: rubocop-1-9-1
|
|
||||||
sass-lint:
|
sass-lint:
|
||||||
enabled: true
|
enabled: false
|
||||||
exclude_patterns:
|
exclude_patterns:
|
||||||
- spec/
|
- spec/
|
||||||
- vendor/asset/
|
- vendor/asset/
|
||||||
|
|
||||||
- app/javascript/mastodon/locales/**/*.json
|
- app/javascript/mastodon/locales/**/*.json
|
||||||
- config/locales/**/*.yml
|
- config/locales/**/*.yml
|
||||||
|
|
24
.devcontainer/Dockerfile
Normal file
24
.devcontainer/Dockerfile
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# [Choice] Ruby version (use -bullseye variants on local arm64/Apple Silicon): 3, 3.1, 3.0, 2, 2.7, 2.6, 3-bullseye, 3.1-bullseye, 3.0-bullseye, 2-bullseye, 2.7-bullseye, 2.6-bullseye, 3-buster, 3.1-buster, 3.0-buster, 2-buster, 2.7-buster, 2.6-buster
|
||||||
|
ARG VARIANT=3.1-bullseye
|
||||||
|
FROM mcr.microsoft.com/vscode/devcontainers/ruby:${VARIANT}
|
||||||
|
|
||||||
|
# Install Rails
|
||||||
|
# RUN gem install rails webdrivers
|
||||||
|
|
||||||
|
# Default value to allow debug server to serve content over GitHub Codespace's port forwarding service
|
||||||
|
# The value is a comma-separated list of allowed domains
|
||||||
|
ENV RAILS_DEVELOPMENT_HOSTS=".githubpreview.dev"
|
||||||
|
|
||||||
|
# [Choice] Node.js version: lts/*, 18, 16, 14
|
||||||
|
ARG NODE_VERSION="lts/*"
|
||||||
|
RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"
|
||||||
|
|
||||||
|
# [Optional] Uncomment this section to install additional OS packages.
|
||||||
|
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
|
||||||
|
&& apt-get -y install --no-install-recommends libicu-dev libidn11-dev ffmpeg imagemagick libpam-dev
|
||||||
|
|
||||||
|
# [Optional] Uncomment this line to install additional gems.
|
||||||
|
RUN gem install foreman
|
||||||
|
|
||||||
|
# [Optional] Uncomment this line to install global node packages.
|
||||||
|
RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g yarn" 2>&1
|
27
.devcontainer/devcontainer.json
Normal file
27
.devcontainer/devcontainer.json
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"name": "Mastodon",
|
||||||
|
"dockerComposeFile": "docker-compose.yml",
|
||||||
|
"service": "app",
|
||||||
|
"workspaceFolder": "/mastodon",
|
||||||
|
|
||||||
|
// Set *default* container specific settings.json values on container create.
|
||||||
|
"settings": {},
|
||||||
|
|
||||||
|
// Add the IDs of extensions you want installed when the container is created.
|
||||||
|
"extensions": [
|
||||||
|
"EditorConfig.EditorConfig",
|
||||||
|
"dbaeumer.vscode-eslint",
|
||||||
|
"rebornix.Ruby",
|
||||||
|
"webben.browserslist"
|
||||||
|
],
|
||||||
|
|
||||||
|
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||||
|
// This can be used to network with other containers or the host.
|
||||||
|
"forwardPorts": [3000, 4000],
|
||||||
|
|
||||||
|
// Use 'postCreateCommand' to run commands after the container is created.
|
||||||
|
"postCreateCommand": ".devcontainer/post-create.sh",
|
||||||
|
|
||||||
|
// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
|
||||||
|
"remoteUser": "vscode"
|
||||||
|
}
|
90
.devcontainer/docker-compose.yml
Normal file
90
.devcontainer/docker-compose.yml
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
version: '3'
|
||||||
|
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
args:
|
||||||
|
# Update 'VARIANT' to pick a version of Ruby: 3, 3.1, 3.0, 2, 2.7, 2.6
|
||||||
|
# Append -bullseye or -buster to pin to an OS version.
|
||||||
|
# Use -bullseye variants on local arm64/Apple Silicon.
|
||||||
|
VARIANT: '3.0-bullseye'
|
||||||
|
# Optional Node.js version to install
|
||||||
|
NODE_VERSION: '16'
|
||||||
|
volumes:
|
||||||
|
- ..:/mastodon:cached
|
||||||
|
environment:
|
||||||
|
RAILS_ENV: development
|
||||||
|
NODE_ENV: development
|
||||||
|
|
||||||
|
REDIS_HOST: redis
|
||||||
|
REDIS_PORT: '6379'
|
||||||
|
DB_HOST: db
|
||||||
|
DB_USER: postgres
|
||||||
|
DB_PASS: postgres
|
||||||
|
DB_PORT: '5432'
|
||||||
|
ES_ENABLED: 'true'
|
||||||
|
ES_HOST: es
|
||||||
|
ES_PORT: '9200'
|
||||||
|
LIBRE_TRANSLATE_ENDPOINT: http://libretranslate:5000
|
||||||
|
# Overrides default command so things don't shut down after the process ends.
|
||||||
|
command: sleep infinity
|
||||||
|
networks:
|
||||||
|
- external_network
|
||||||
|
- internal_network
|
||||||
|
user: vscode
|
||||||
|
|
||||||
|
db:
|
||||||
|
image: postgres:14-alpine
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- postgres-data:/var/lib/postgresql/data
|
||||||
|
environment:
|
||||||
|
POSTGRES_USER: postgres
|
||||||
|
POSTGRES_DB: postgres
|
||||||
|
POSTGRES_PASSWORD: postgres
|
||||||
|
POSTGRES_HOST_AUTH_METHOD: trust
|
||||||
|
networks:
|
||||||
|
- internal_network
|
||||||
|
|
||||||
|
redis:
|
||||||
|
image: redis:6-alpine
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- redis-data:/data
|
||||||
|
networks:
|
||||||
|
- internal_network
|
||||||
|
|
||||||
|
es:
|
||||||
|
image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
ES_JAVA_OPTS: -Xms512m -Xmx512m
|
||||||
|
cluster.name: es-mastodon
|
||||||
|
discovery.type: single-node
|
||||||
|
bootstrap.memory_lock: 'true'
|
||||||
|
volumes:
|
||||||
|
- es-data:/usr/share/elasticsearch/data
|
||||||
|
networks:
|
||||||
|
- internal_network
|
||||||
|
ulimits:
|
||||||
|
memlock:
|
||||||
|
soft: -1
|
||||||
|
hard: -1
|
||||||
|
|
||||||
|
libretranslate:
|
||||||
|
image: libretranslate/libretranslate:v1.2.9
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- internal_network
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
postgres-data:
|
||||||
|
redis-data:
|
||||||
|
es-data:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
external_network:
|
||||||
|
internal_network:
|
||||||
|
internal: true
|
21
.devcontainer/post-create.sh
Executable file
21
.devcontainer/post-create.sh
Executable file
|
@ -0,0 +1,21 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e # Fail the whole script on first error
|
||||||
|
|
||||||
|
# Fetch Ruby gem dependencies
|
||||||
|
bundle install --path vendor/bundle --with='development test'
|
||||||
|
|
||||||
|
# Fetch Javascript dependencies
|
||||||
|
yarn install
|
||||||
|
|
||||||
|
# Make Gemfile.lock pristine again
|
||||||
|
git checkout -- Gemfile.lock
|
||||||
|
|
||||||
|
# [re]create, migrate, and seed the test database
|
||||||
|
RAILS_ENV=test ./bin/rails db:setup
|
||||||
|
|
||||||
|
# Precompile assets for development
|
||||||
|
RAILS_ENV=development ./bin/rails assets:precompile
|
||||||
|
|
||||||
|
# Precompile assets for test
|
||||||
|
RAILS_ENV=test NODE_ENV=tests ./bin/rails assets:precompile
|
258
.env.nanobox
258
.env.nanobox
|
@ -1,258 +0,0 @@
|
||||||
# Service dependencies
|
|
||||||
# You may set REDIS_URL instead for more advanced options
|
|
||||||
REDIS_HOST=$DATA_REDIS_HOST
|
|
||||||
REDIS_PORT=6379
|
|
||||||
# REDIS_DB=0
|
|
||||||
|
|
||||||
# You may set DATABASE_URL instead for more advanced options
|
|
||||||
DB_HOST=$DATA_DB_HOST
|
|
||||||
DB_USER=$DATA_DB_USER
|
|
||||||
DB_NAME=gonano
|
|
||||||
DB_PASS=$DATA_DB_PASS
|
|
||||||
DB_PORT=5432
|
|
||||||
|
|
||||||
# DATABASE_URL=postgresql://$DATA_DB_USER:$DATA_DB_PASS@$DATA_DB_HOST/gonano
|
|
||||||
|
|
||||||
# Optional Elasticsearch configuration
|
|
||||||
ES_ENABLED=true
|
|
||||||
ES_HOST=$DATA_ELASTIC_HOST
|
|
||||||
ES_PORT=9200
|
|
||||||
|
|
||||||
BIND=0.0.0.0
|
|
||||||
|
|
||||||
# Federation
|
|
||||||
# Note: Changing LOCAL_DOMAIN at a later time will cause unwanted side effects, including breaking all existing federation.
|
|
||||||
# LOCAL_DOMAIN should *NOT* contain the protocol part of the domain e.g https://example.com.
|
|
||||||
LOCAL_DOMAIN=${APP_NAME}.nanoapp.io
|
|
||||||
|
|
||||||
# Changing LOCAL_HTTPS in production is no longer supported. (Mastodon will always serve https:// links)
|
|
||||||
|
|
||||||
# Use this only if you need to run mastodon on a different domain than the one used for federation.
|
|
||||||
# You can read more about this option on https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Serving_a_different_domain.md
|
|
||||||
# DO *NOT* USE THIS UNLESS YOU KNOW *EXACTLY* WHAT YOU ARE DOING.
|
|
||||||
# WEB_DOMAIN=mastodon.example.com
|
|
||||||
|
|
||||||
# Use this if you want to have several aliases handler@example1.com
|
|
||||||
# handler@example2.com etc. for the same user. LOCAL_DOMAIN should not
|
|
||||||
# be added. Comma separated values
|
|
||||||
# ALTERNATE_DOMAINS=example1.com,example2.com
|
|
||||||
|
|
||||||
# Application secrets
|
|
||||||
# Generate each with the `rake secret` task (`nanobox run bundle exec rake secret`)
|
|
||||||
SECRET_KEY_BASE=$SECRET_KEY_BASE
|
|
||||||
OTP_SECRET=$OTP_SECRET
|
|
||||||
|
|
||||||
# VAPID keys (used for push notifications)
|
|
||||||
# You can generate the keys using the following command (first is the private key, second is the public one)
|
|
||||||
# You should only generate this once per instance. If you later decide to change it, all push subscription will
|
|
||||||
# be invalidated, requiring the users to access the website again to resubscribe.
|
|
||||||
#
|
|
||||||
# Generate with `rake mastodon:webpush:generate_vapid_key` task (`nanobox run bundle exec rake mastodon:webpush:generate_vapid_key`)
|
|
||||||
#
|
|
||||||
# For more information visit https://rossta.net/blog/using-the-web-push-api-with-vapid.html
|
|
||||||
VAPID_PRIVATE_KEY=$VAPID_PRIVATE_KEY
|
|
||||||
VAPID_PUBLIC_KEY=$VAPID_PUBLIC_KEY
|
|
||||||
|
|
||||||
# Registrations
|
|
||||||
# Single user mode will disable registrations and redirect frontpage to the first profile
|
|
||||||
# SINGLE_USER_MODE=true
|
|
||||||
# Prevent registrations with following e-mail domains
|
|
||||||
# EMAIL_DOMAIN_BLACKLIST=example1.com|example2.de|etc
|
|
||||||
# Only allow registrations with the following e-mail domains
|
|
||||||
# EMAIL_DOMAIN_WHITELIST=example1.com|example2.de|etc
|
|
||||||
|
|
||||||
# Optionally change default language
|
|
||||||
# DEFAULT_LOCALE=de
|
|
||||||
|
|
||||||
# E-mail configuration
|
|
||||||
# Note: Mailgun and SparkPost (https://sparkpo.st/smtp) each have good free tiers
|
|
||||||
# If you want to use an SMTP server without authentication (e.g local Postfix relay)
|
|
||||||
# then set SMTP_AUTH_METHOD and SMTP_OPENSSL_VERIFY_MODE to 'none' and
|
|
||||||
# *comment* SMTP_LOGIN and SMTP_PASSWORD (leaving them blank is not enough).
|
|
||||||
SMTP_SERVER=$SMTP_SERVER
|
|
||||||
SMTP_PORT=587
|
|
||||||
SMTP_LOGIN=$SMTP_LOGIN
|
|
||||||
SMTP_PASSWORD=$SMTP_PASSWORD
|
|
||||||
SMTP_FROM_ADDRESS=notifications@${APP_NAME}.nanoapp.io
|
|
||||||
#SMTP_REPLY_TO=
|
|
||||||
#SMTP_DOMAIN= # defaults to LOCAL_DOMAIN
|
|
||||||
#SMTP_DELIVERY_METHOD=smtp # delivery method can also be sendmail
|
|
||||||
#SMTP_AUTH_METHOD=plain
|
|
||||||
#SMTP_CA_FILE=/etc/ssl/certs/ca-certificates.crt
|
|
||||||
#SMTP_OPENSSL_VERIFY_MODE=peer
|
|
||||||
#SMTP_ENABLE_STARTTLS_AUTO=true
|
|
||||||
#SMTP_TLS=true
|
|
||||||
|
|
||||||
# Optional user upload path and URL (images, avatars). Default is :rails_root/public/system. If you set this variable, you are responsible for making your HTTP server (eg. nginx) serve these files.
|
|
||||||
# PAPERCLIP_ROOT_PATH=/var/lib/mastodon/public-system
|
|
||||||
# PAPERCLIP_ROOT_URL=/system
|
|
||||||
|
|
||||||
# Optional asset host for multi-server setups
|
|
||||||
# The asset host must allow cross origin request from WEB_DOMAIN or LOCAL_DOMAIN
|
|
||||||
# if WEB_DOMAIN is not set. For example, the server may have the
|
|
||||||
# following header field:
|
|
||||||
# Access-Control-Allow-Origin: https://example.com/
|
|
||||||
# CDN_HOST=https://assets.example.com
|
|
||||||
|
|
||||||
# S3 (optional)
|
|
||||||
# The attachment host must allow cross origin request from WEB_DOMAIN or
|
|
||||||
# LOCAL_DOMAIN if WEB_DOMAIN is not set. For example, the server may have the
|
|
||||||
# following header field:
|
|
||||||
# Access-Control-Allow-Origin: https://192.168.1.123:9000/
|
|
||||||
# S3_ENABLED=true
|
|
||||||
# S3_BUCKET=
|
|
||||||
# AWS_ACCESS_KEY_ID=
|
|
||||||
# AWS_SECRET_ACCESS_KEY=
|
|
||||||
# S3_REGION=
|
|
||||||
# S3_PROTOCOL=http
|
|
||||||
# S3_HOSTNAME=192.168.1.123:9000
|
|
||||||
|
|
||||||
# S3 (Minio Config (optional) Please check Minio instance for details)
|
|
||||||
# The attachment host must allow cross origin request - see the description
|
|
||||||
# above.
|
|
||||||
# S3_ENABLED=true
|
|
||||||
# S3_BUCKET=
|
|
||||||
# AWS_ACCESS_KEY_ID=
|
|
||||||
# AWS_SECRET_ACCESS_KEY=
|
|
||||||
# S3_REGION=
|
|
||||||
# S3_PROTOCOL=https
|
|
||||||
# S3_HOSTNAME=
|
|
||||||
# S3_ENDPOINT=
|
|
||||||
# S3_SIGNATURE_VERSION=
|
|
||||||
|
|
||||||
# Google Cloud Storage (optional)
|
|
||||||
# Use S3 compatible API. Since GCS does not support Multipart Upload,
|
|
||||||
# increase the value of S3_MULTIPART_THRESHOLD to disable Multipart Upload.
|
|
||||||
# The attachment host must allow cross origin request - see the description
|
|
||||||
# above.
|
|
||||||
# S3_ENABLED=true
|
|
||||||
# AWS_ACCESS_KEY_ID=
|
|
||||||
# AWS_SECRET_ACCESS_KEY=
|
|
||||||
# S3_REGION=
|
|
||||||
# S3_PROTOCOL=https
|
|
||||||
# S3_HOSTNAME=storage.googleapis.com
|
|
||||||
# S3_ENDPOINT=https://storage.googleapis.com
|
|
||||||
# S3_MULTIPART_THRESHOLD=52428801 # 50.megabytes
|
|
||||||
|
|
||||||
# Swift (optional)
|
|
||||||
# The attachment host must allow cross origin request - see the description
|
|
||||||
# above.
|
|
||||||
# SWIFT_ENABLED=true
|
|
||||||
# SWIFT_USERNAME=
|
|
||||||
# For Keystone V3, the value for SWIFT_TENANT should be the project name
|
|
||||||
# SWIFT_TENANT=
|
|
||||||
# SWIFT_PASSWORD=
|
|
||||||
# Some OpenStack V3 providers require PROJECT_ID (optional)
|
|
||||||
# SWIFT_PROJECT_ID=
|
|
||||||
# Keystone V2 and V3 URLs are supported. Use a V3 URL if possible to avoid
|
|
||||||
# issues with token rate-limiting during high load.
|
|
||||||
# SWIFT_AUTH_URL=
|
|
||||||
# SWIFT_CONTAINER=
|
|
||||||
# SWIFT_OBJECT_URL=
|
|
||||||
# SWIFT_REGION=
|
|
||||||
# Defaults to 'default'
|
|
||||||
# SWIFT_DOMAIN_NAME=
|
|
||||||
# Defaults to 60 seconds. Set to 0 to disable
|
|
||||||
# SWIFT_CACHE_TTL=
|
|
||||||
|
|
||||||
# Optional alias for S3 (e.g. to serve files on a custom domain, possibly using Cloudfront or Cloudflare)
|
|
||||||
# S3_ALIAS_HOST=
|
|
||||||
|
|
||||||
# Streaming API integration
|
|
||||||
# STREAMING_API_BASE_URL=
|
|
||||||
|
|
||||||
# Advanced settings
|
|
||||||
# If you need to use pgBouncer, you need to disable prepared statements:
|
|
||||||
# PREPARED_STATEMENTS=false
|
|
||||||
|
|
||||||
# Cluster number setting for streaming API server.
|
|
||||||
# If you comment out following line, cluster number will be `numOfCpuCores - 1`.
|
|
||||||
# STREAMING_CLUSTER_NUM=1
|
|
||||||
|
|
||||||
# Docker mastodon user
|
|
||||||
# If you use Docker, you may want to assign UID/GID manually.
|
|
||||||
# UID=1000
|
|
||||||
# GID=1000
|
|
||||||
|
|
||||||
# LDAP authentication (optional)
|
|
||||||
# LDAP_ENABLED=true
|
|
||||||
# LDAP_HOST=localhost
|
|
||||||
# LDAP_PORT=389
|
|
||||||
# LDAP_METHOD=simple_tls
|
|
||||||
# LDAP_BASE=
|
|
||||||
# LDAP_BIND_DN=
|
|
||||||
# LDAP_PASSWORD=
|
|
||||||
# LDAP_UID=cn
|
|
||||||
# LDAP_MAIL=mail
|
|
||||||
# LDAP_SEARCH_FILTER=(|(%{uid}=%{email})(%{mail}=%{email}))
|
|
||||||
# LDAP_UID_CONVERSION_ENABLED=true
|
|
||||||
# LDAP_UID_CONVERSION_SEARCH=., -
|
|
||||||
# LDAP_UID_CONVERSION_REPLACE=_
|
|
||||||
|
|
||||||
# PAM authentication (optional)
|
|
||||||
# PAM authentication uses for the email generation the "email" pam variable
|
|
||||||
# and optional as fallback PAM_DEFAULT_SUFFIX
|
|
||||||
# The pam environment variable "email" is provided by:
|
|
||||||
# https://github.com/devkral/pam_email_extractor
|
|
||||||
# PAM_ENABLED=true
|
|
||||||
# Fallback email domain for email address generation (LOCAL_DOMAIN by default)
|
|
||||||
# PAM_EMAIL_DOMAIN=example.com
|
|
||||||
# Name of the pam service (pam "auth" section is evaluated)
|
|
||||||
# PAM_DEFAULT_SERVICE=rpam
|
|
||||||
# Name of the pam service used for checking if an user can register (pam "account" section is evaluated) (nil (disabled) by default)
|
|
||||||
# PAM_CONTROLLED_SERVICE=rpam
|
|
||||||
|
|
||||||
# Global OAuth settings (optional) :
|
|
||||||
# If you have only one strategy, you may want to enable this
|
|
||||||
# OAUTH_REDIRECT_AT_SIGN_IN=true
|
|
||||||
|
|
||||||
# Optional CAS authentication (cf. omniauth-cas) :
|
|
||||||
# CAS_ENABLED=true
|
|
||||||
# CAS_URL=https://sso.myserver.com/
|
|
||||||
# CAS_HOST=sso.myserver.com/
|
|
||||||
# CAS_PORT=443
|
|
||||||
# CAS_SSL=true
|
|
||||||
# CAS_VALIDATE_URL=
|
|
||||||
# CAS_CALLBACK_URL=
|
|
||||||
# CAS_LOGOUT_URL=
|
|
||||||
# CAS_LOGIN_URL=
|
|
||||||
# CAS_UID_FIELD='user'
|
|
||||||
# CAS_CA_PATH=
|
|
||||||
# CAS_DISABLE_SSL_VERIFICATION=false
|
|
||||||
# CAS_UID_KEY='user'
|
|
||||||
# CAS_NAME_KEY='name'
|
|
||||||
# CAS_EMAIL_KEY='email'
|
|
||||||
# CAS_NICKNAME_KEY='nickname'
|
|
||||||
# CAS_FIRST_NAME_KEY='firstname'
|
|
||||||
# CAS_LAST_NAME_KEY='lastname'
|
|
||||||
# CAS_LOCATION_KEY='location'
|
|
||||||
# CAS_IMAGE_KEY='image'
|
|
||||||
# CAS_PHONE_KEY='phone'
|
|
||||||
# CAS_SECURITY_ASSUME_EMAIL_IS_VERIFIED=true
|
|
||||||
|
|
||||||
# Optional SAML authentication (cf. omniauth-saml)
|
|
||||||
# SAML_ENABLED=true
|
|
||||||
# SAML_ACS_URL=http://localhost:3000/auth/auth/saml/callback
|
|
||||||
# SAML_ISSUER=https://example.com
|
|
||||||
# SAML_IDP_SSO_TARGET_URL=https://idp.testshib.org/idp/profile/SAML2/Redirect/SSO
|
|
||||||
# SAML_IDP_CERT=
|
|
||||||
# SAML_IDP_CERT_FINGERPRINT=
|
|
||||||
# SAML_NAME_IDENTIFIER_FORMAT=
|
|
||||||
# SAML_CERT=
|
|
||||||
# SAML_PRIVATE_KEY=
|
|
||||||
# SAML_SECURITY_WANT_ASSERTION_SIGNED=true
|
|
||||||
# SAML_SECURITY_WANT_ASSERTION_ENCRYPTED=true
|
|
||||||
# SAML_SECURITY_ASSUME_EMAIL_IS_VERIFIED=true
|
|
||||||
# SAML_ATTRIBUTES_STATEMENTS_UID="urn:oid:0.9.2342.19200300.100.1.1"
|
|
||||||
# SAML_ATTRIBUTES_STATEMENTS_EMAIL="urn:oid:1.3.6.1.4.1.5923.1.1.1.6"
|
|
||||||
# SAML_ATTRIBUTES_STATEMENTS_FULL_NAME="urn:oid:2.16.840.1.113730.3.1.241"
|
|
||||||
# SAML_ATTRIBUTES_STATEMENTS_FIRST_NAME="urn:oid:2.5.4.42"
|
|
||||||
# SAML_ATTRIBUTES_STATEMENTS_LAST_NAME="urn:oid:2.5.4.4"
|
|
||||||
# SAML_UID_ATTRIBUTE="urn:oid:0.9.2342.19200300.100.1.1"
|
|
||||||
# SAML_ATTRIBUTES_STATEMENTS_VERIFIED=
|
|
||||||
# SAML_ATTRIBUTES_STATEMENTS_VERIFIED_EMAIL=
|
|
||||||
|
|
||||||
# Use HTTP proxy for outgoing request (optional)
|
|
||||||
# http_proxy=http://gateway.local:8118
|
|
||||||
# Access control for hidden service.
|
|
||||||
# ALLOW_ACCESS_TO_HIDDEN_SERVICE=true
|
|
|
@ -54,11 +54,11 @@ VAPID_PUBLIC_KEY=
|
||||||
|
|
||||||
# Sending mail
|
# Sending mail
|
||||||
# ------------
|
# ------------
|
||||||
SMTP_SERVER=smtp.mailgun.org
|
SMTP_SERVER=
|
||||||
SMTP_PORT=587
|
SMTP_PORT=587
|
||||||
SMTP_LOGIN=
|
SMTP_LOGIN=
|
||||||
SMTP_PASSWORD=
|
SMTP_PASSWORD=
|
||||||
SMTP_FROM_ADDRESS=notificatons@example.com
|
SMTP_FROM_ADDRESS=notifications@example.com
|
||||||
|
|
||||||
# File storage (optional)
|
# File storage (optional)
|
||||||
# -----------------------
|
# -----------------------
|
||||||
|
@ -67,3 +67,11 @@ S3_BUCKET=files.example.com
|
||||||
AWS_ACCESS_KEY_ID=
|
AWS_ACCESS_KEY_ID=
|
||||||
AWS_SECRET_ACCESS_KEY=
|
AWS_SECRET_ACCESS_KEY=
|
||||||
S3_ALIAS_HOST=files.example.com
|
S3_ALIAS_HOST=files.example.com
|
||||||
|
|
||||||
|
# IP and session retention
|
||||||
|
# -----------------------
|
||||||
|
# Make sure to modify the scheduling of ip_cleanup_scheduler in config/sidekiq.yml
|
||||||
|
# to be less than daily if you lower IP_RETENTION_PERIOD below two days (172800).
|
||||||
|
# -----------------------
|
||||||
|
IP_RETENTION_PERIOD=31556952
|
||||||
|
SESSION_RETENTION_PERIOD=31556952
|
||||||
|
|
25
.eslintrc.js
25
.eslintrc.js
|
@ -1,6 +1,10 @@
|
||||||
module.exports = {
|
module.exports = {
|
||||||
root: true,
|
root: true,
|
||||||
|
|
||||||
|
extends: [
|
||||||
|
'eslint:recommended',
|
||||||
|
],
|
||||||
|
|
||||||
env: {
|
env: {
|
||||||
browser: true,
|
browser: true,
|
||||||
node: true,
|
node: true,
|
||||||
|
@ -12,7 +16,7 @@ module.exports = {
|
||||||
ATTACHMENT_HOST: false,
|
ATTACHMENT_HOST: false,
|
||||||
},
|
},
|
||||||
|
|
||||||
parser: 'babel-eslint',
|
parser: '@babel/eslint-parser',
|
||||||
|
|
||||||
plugins: [
|
plugins: [
|
||||||
'react',
|
'react',
|
||||||
|
@ -27,7 +31,7 @@ module.exports = {
|
||||||
experimentalObjectRestSpread: true,
|
experimentalObjectRestSpread: true,
|
||||||
jsx: true,
|
jsx: true,
|
||||||
},
|
},
|
||||||
ecmaVersion: 2018,
|
ecmaVersion: 2021,
|
||||||
},
|
},
|
||||||
|
|
||||||
settings: {
|
settings: {
|
||||||
|
@ -64,8 +68,8 @@ module.exports = {
|
||||||
eqeqeq: 'error',
|
eqeqeq: 'error',
|
||||||
indent: ['warn', 2],
|
indent: ['warn', 2],
|
||||||
'jsx-quotes': ['error', 'prefer-single'],
|
'jsx-quotes': ['error', 'prefer-single'],
|
||||||
|
'no-case-declarations': 'off',
|
||||||
'no-catch-shadow': 'error',
|
'no-catch-shadow': 'error',
|
||||||
'no-cond-assign': 'error',
|
|
||||||
'no-console': [
|
'no-console': [
|
||||||
'warn',
|
'warn',
|
||||||
{
|
{
|
||||||
|
@ -75,13 +79,16 @@ module.exports = {
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
'no-fallthrough': 'error',
|
'no-empty': 'off',
|
||||||
'no-irregular-whitespace': 'error',
|
|
||||||
'no-mixed-spaces-and-tabs': 'warn',
|
|
||||||
'no-nested-ternary': 'warn',
|
'no-nested-ternary': 'warn',
|
||||||
|
'no-prototype-builtins': 'off',
|
||||||
|
'no-restricted-properties': [
|
||||||
|
'error',
|
||||||
|
{ property: 'substring', message: 'Use .slice instead of .substring.' },
|
||||||
|
{ property: 'substr', message: 'Use .slice instead of .substr.' },
|
||||||
|
],
|
||||||
|
'no-self-assign': 'off',
|
||||||
'no-trailing-spaces': 'warn',
|
'no-trailing-spaces': 'warn',
|
||||||
'no-undef': 'error',
|
|
||||||
'no-unreachable': 'error',
|
|
||||||
'no-unused-expressions': 'error',
|
'no-unused-expressions': 'error',
|
||||||
'no-unused-vars': [
|
'no-unused-vars': [
|
||||||
'error',
|
'error',
|
||||||
|
@ -91,6 +98,7 @@ module.exports = {
|
||||||
ignoreRestSiblings: true,
|
ignoreRestSiblings: true,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
'no-useless-escape': 'off',
|
||||||
'object-curly-spacing': ['error', 'always'],
|
'object-curly-spacing': ['error', 'always'],
|
||||||
'padded-blocks': [
|
'padded-blocks': [
|
||||||
'error',
|
'error',
|
||||||
|
@ -100,7 +108,6 @@ module.exports = {
|
||||||
],
|
],
|
||||||
quotes: ['error', 'single'],
|
quotes: ['error', 'single'],
|
||||||
semi: 'error',
|
semi: 'error',
|
||||||
strict: 'off',
|
|
||||||
'valid-typeof': 'error',
|
'valid-typeof': 'error',
|
||||||
|
|
||||||
'react/jsx-boolean-value': 'error',
|
'react/jsx-boolean-value': 'error',
|
||||||
|
|
32
.github/CODEOWNERS
vendored
32
.github/CODEOWNERS
vendored
|
@ -1,32 +0,0 @@
|
||||||
# CODEOWNERS for mastodon/mastodon
|
|
||||||
|
|
||||||
# Translators
|
|
||||||
# To add translator, copy these lines, replace `fr` with appropriate language code and replace `@żelipapą` with user's GitHub nickname preceded by `@` sign or e-mail address.
|
|
||||||
# /app/javascript/mastodon/locales/fr.json @żelipapą
|
|
||||||
# /app/views/user_mailer/*.fr.html.erb @żelipapą
|
|
||||||
# /app/views/user_mailer/*.fr.text.erb @żelipapą
|
|
||||||
# /config/locales/*.fr.yml @żelipapą
|
|
||||||
# /config/locales/fr.yml @żelipapą
|
|
||||||
|
|
||||||
# Polish
|
|
||||||
/app/javascript/mastodon/locales/pl.json @m4sk1n
|
|
||||||
/app/views/user_mailer/*.pl.html.erb @m4sk1n
|
|
||||||
/app/views/user_mailer/*.pl.text.erb @m4sk1n
|
|
||||||
/config/locales/*.pl.yml @m4sk1n
|
|
||||||
/config/locales/pl.yml @m4sk1n
|
|
||||||
|
|
||||||
# French
|
|
||||||
/app/javascript/mastodon/locales/fr.json @aldarone
|
|
||||||
/app/javascript/mastodon/locales/whitelist_fr.json @aldarone
|
|
||||||
/app/views/user_mailer/*.fr.html.erb @aldarone
|
|
||||||
/app/views/user_mailer/*.fr.text.erb @aldarone
|
|
||||||
/config/locales/*.fr.yml @aldarone
|
|
||||||
/config/locales/fr.yml @aldarone
|
|
||||||
|
|
||||||
# Dutch
|
|
||||||
/app/javascript/mastodon/locales/nl.json @jeroenpraat
|
|
||||||
/app/javascript/mastodon/locales/whitelist_nl.json @jeroenpraat
|
|
||||||
/app/views/user_mailer/*.nl.html.erb @jeroenpraat
|
|
||||||
/app/views/user_mailer/*.nl.text.erb @jeroenpraat
|
|
||||||
/config/locales/*.nl.yml @jeroenpraat
|
|
||||||
/config/locales/nl.yml @jeroenpraat
|
|
2
.github/FUNDING.yml
vendored
2
.github/FUNDING.yml
vendored
|
@ -1,3 +1,3 @@
|
||||||
patreon: mastodon
|
patreon: mastodon
|
||||||
open_collective: mastodon
|
open_collective: mastodon
|
||||||
github: [Gargron]
|
custom: https://sponsor.joinmastodon.org
|
||||||
|
|
16
.github/ISSUE_TEMPLATE/1.bug_report.yml
vendored
16
.github/ISSUE_TEMPLATE/1.bug_report.yml
vendored
|
@ -1,6 +1,6 @@
|
||||||
name: Bug Report
|
name: Bug Report
|
||||||
description: If something isn't working as expected
|
description: If something isn't working as expected
|
||||||
labels: bug
|
labels: [bug]
|
||||||
body:
|
body:
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
|
@ -31,6 +31,11 @@ body:
|
||||||
description: What happened?
|
description: What happened?
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Detailed description
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Specifications
|
label: Specifications
|
||||||
|
@ -38,5 +43,14 @@ body:
|
||||||
What version or commit hash of Mastodon did you find this bug in?
|
What version or commit hash of Mastodon did you find this bug in?
|
||||||
|
|
||||||
If a front-end issue, what browser and operating systems were you using?
|
If a front-end issue, what browser and operating systems were you using?
|
||||||
|
placeholder: |
|
||||||
|
Mastodon 3.5.3 (or Edge)
|
||||||
|
Ruby 2.7.6 (or v3.1.2)
|
||||||
|
Node.js 16.18.0
|
||||||
|
|
||||||
|
Google Chrome 106.0.5249.119
|
||||||
|
Firefox 105.0.3
|
||||||
|
|
||||||
|
etc...
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
1
.github/ISSUE_TEMPLATE/2.feature_request.yml
vendored
1
.github/ISSUE_TEMPLATE/2.feature_request.yml
vendored
|
@ -1,5 +1,6 @@
|
||||||
name: Feature Request
|
name: Feature Request
|
||||||
description: I have a suggestion
|
description: I have a suggestion
|
||||||
|
labels: [suggestion]
|
||||||
body:
|
body:
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
|
|
10
.github/ISSUE_TEMPLATE/3.support.md
vendored
10
.github/ISSUE_TEMPLATE/3.support.md
vendored
|
@ -1,10 +0,0 @@
|
||||||
---
|
|
||||||
name: Support
|
|
||||||
about: Ask for help with your deployment
|
|
||||||
title: DO NOT CREATE THIS ISSUE
|
|
||||||
---
|
|
||||||
|
|
||||||
We primarily use GitHub as a bug and feature tracker. For usage questions, troubleshooting of deployments and other individual technical assistance, please use one of the resources below:
|
|
||||||
|
|
||||||
- https://discourse.joinmastodon.org
|
|
||||||
- #mastodon on irc.freenode.net
|
|
4
.github/ISSUE_TEMPLATE/config.yml
vendored
4
.github/ISSUE_TEMPLATE/config.yml
vendored
|
@ -1,5 +1,5 @@
|
||||||
blank_issues_enabled: false
|
blank_issues_enabled: false
|
||||||
contact_links:
|
contact_links:
|
||||||
- name: Mastodon Meta Discussion Board
|
- name: GitHub Discussions
|
||||||
url: https://discourse.joinmastodon.org/
|
url: https://github.com/mastodon/mastodon/discussions
|
||||||
about: Please ask and answer questions here.
|
about: Please ask and answer questions here.
|
||||||
|
|
12
.github/dependabot.yml
vendored
12
.github/dependabot.yml
vendored
|
@ -6,7 +6,7 @@
|
||||||
version: 2
|
version: 2
|
||||||
updates:
|
updates:
|
||||||
- package-ecosystem: npm
|
- package-ecosystem: npm
|
||||||
directory: "/"
|
directory: '/'
|
||||||
schedule:
|
schedule:
|
||||||
interval: weekly
|
interval: weekly
|
||||||
open-pull-requests-limit: 99
|
open-pull-requests-limit: 99
|
||||||
|
@ -14,7 +14,15 @@ updates:
|
||||||
- dependency-type: direct
|
- dependency-type: direct
|
||||||
|
|
||||||
- package-ecosystem: bundler
|
- package-ecosystem: bundler
|
||||||
directory: "/"
|
directory: '/'
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
open-pull-requests-limit: 99
|
||||||
|
allow:
|
||||||
|
- dependency-type: direct
|
||||||
|
|
||||||
|
- package-ecosystem: github-actions
|
||||||
|
directory: '/'
|
||||||
schedule:
|
schedule:
|
||||||
interval: weekly
|
interval: weekly
|
||||||
open-pull-requests-limit: 99
|
open-pull-requests-limit: 99
|
||||||
|
|
21
.github/stylelint-matcher.json
vendored
Normal file
21
.github/stylelint-matcher.json
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"problemMatcher": [
|
||||||
|
{
|
||||||
|
"owner": "stylelint",
|
||||||
|
"pattern": [
|
||||||
|
{
|
||||||
|
"regexp": "^([^\\s].*)$",
|
||||||
|
"file": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"regexp": "^\\s+((\\d+):(\\d+))?\\s+(✖|×)\\s+(.*)\\s{2,}(.*)$",
|
||||||
|
"line": 2,
|
||||||
|
"column": 3,
|
||||||
|
"message": 5,
|
||||||
|
"code": 6,
|
||||||
|
"loop": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
36
.github/workflows/build-image.yml
vendored
36
.github/workflows/build-image.yml
vendored
|
@ -3,20 +3,30 @@ on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- "main"
|
- 'main'
|
||||||
tags:
|
tags:
|
||||||
- "*"
|
- '*'
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- .github/workflows/build-image.yml
|
||||||
|
- Dockerfile
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-image:
|
build-image:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- uses: docker/setup-buildx-action@v1
|
- uses: hadolint/hadolint-action@v3.0.0
|
||||||
- uses: docker/login-action@v1
|
- uses: docker/setup-qemu-action@v2
|
||||||
|
- uses: docker/setup-buildx-action@v2
|
||||||
|
- uses: docker/login-action@v2
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
- uses: docker/metadata-action@v3
|
if: github.event_name != 'pull_request'
|
||||||
|
- uses: docker/metadata-action@v4
|
||||||
id: meta
|
id: meta
|
||||||
with:
|
with:
|
||||||
images: tootsuite/mastodon
|
images: tootsuite/mastodon
|
||||||
|
@ -24,11 +34,15 @@ jobs:
|
||||||
latest=auto
|
latest=auto
|
||||||
tags: |
|
tags: |
|
||||||
type=edge,branch=main
|
type=edge,branch=main
|
||||||
type=semver,pattern={{ raw }}
|
type=pep440,pattern={{raw}}
|
||||||
- uses: docker/build-push-action@v2
|
type=pep440,pattern=v{{major}}.{{minor}}
|
||||||
|
type=ref,event=pr
|
||||||
|
- uses: docker/build-push-action@v3
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
push: true
|
platforms: linux/amd64,linux/arm64
|
||||||
|
builder: ${{ steps.buildx.outputs.name }}
|
||||||
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
cache-from: type=registry,ref=tootsuite/mastodon:latest
|
cache-from: type=gha
|
||||||
cache-to: type=inline
|
cache-to: type=gha,mode=max
|
||||||
|
|
43
.github/workflows/check-i18n.yml
vendored
43
.github/workflows/check-i18n.yml
vendored
|
@ -2,33 +2,36 @@ name: Check i18n
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ main ]
|
branches: [main]
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ main ]
|
branches: [main]
|
||||||
|
|
||||||
env:
|
env:
|
||||||
RAILS_ENV: test
|
RAILS_ENV: test
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check-i18n:
|
check-i18n:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- name: Install system dependencies
|
- name: Install system dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y libicu-dev libidn11-dev libprotobuf-dev protobuf-compiler
|
sudo apt-get install -y libicu-dev libidn11-dev
|
||||||
- name: Set up Ruby
|
- name: Set up Ruby
|
||||||
uses: ruby/setup-ruby@v1
|
uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
ruby-version: '3.0'
|
ruby-version: .ruby-version
|
||||||
bundler-cache: true
|
bundler-cache: true
|
||||||
- name: Check locale file normalization
|
- name: Check locale file normalization
|
||||||
run: bundle exec i18n-tasks check-normalized
|
run: bundle exec i18n-tasks check-normalized
|
||||||
- name: Check for unused strings
|
- name: Check for unused strings
|
||||||
run: bundle exec i18n-tasks unused -l en
|
run: bundle exec i18n-tasks unused -l en
|
||||||
- name: Check for wrong string interpolations
|
- name: Check for wrong string interpolations
|
||||||
run: bundle exec i18n-tasks check-consistent-interpolations
|
run: bundle exec i18n-tasks check-consistent-interpolations
|
||||||
- name: Check that all required locale files exist
|
- name: Check that all required locale files exist
|
||||||
run: bundle exec rake repo:check_locales_files
|
run: bundle exec rake repo:check_locales_files
|
||||||
|
|
62
.github/workflows/codeql.yml
vendored
Normal file
62
.github/workflows/codeql.yml
vendored
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
name: 'CodeQL'
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: ['main']
|
||||||
|
pull_request:
|
||||||
|
# The branches below must be a subset of the branches above
|
||||||
|
branches: ['main']
|
||||||
|
schedule:
|
||||||
|
- cron: '22 6 * * 1'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
analyze:
|
||||||
|
name: Analyze
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
actions: read
|
||||||
|
contents: read
|
||||||
|
security-events: write
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
language: ['javascript', 'ruby']
|
||||||
|
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
|
||||||
|
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
# Initializes the CodeQL tools for scanning.
|
||||||
|
- name: Initialize CodeQL
|
||||||
|
uses: github/codeql-action/init@v2
|
||||||
|
with:
|
||||||
|
languages: ${{ matrix.language }}
|
||||||
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||||
|
# By default, queries listed here will override any specified in a config file.
|
||||||
|
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||||
|
|
||||||
|
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
|
||||||
|
# queries: security-extended,security-and-quality
|
||||||
|
|
||||||
|
# Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java).
|
||||||
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
|
- name: Autobuild
|
||||||
|
uses: github/codeql-action/autobuild@v2
|
||||||
|
|
||||||
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
|
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||||
|
|
||||||
|
# If the Autobuild fails above, remove it and uncomment the following three lines.
|
||||||
|
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
|
||||||
|
|
||||||
|
# - run: |
|
||||||
|
# echo "Run, Build Application using script"
|
||||||
|
# ./location_of_script_within_repo/buildscript.sh
|
||||||
|
|
||||||
|
- name: Perform CodeQL Analysis
|
||||||
|
uses: github/codeql-action/analyze@v2
|
||||||
|
with:
|
||||||
|
category: '/language:${{matrix.language}}'
|
85
.github/workflows/linter.yml
vendored
Normal file
85
.github/workflows/linter.yml
vendored
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
---
|
||||||
|
#################################
|
||||||
|
#################################
|
||||||
|
## Super Linter GitHub Actions ##
|
||||||
|
#################################
|
||||||
|
#################################
|
||||||
|
name: Lint Code Base
|
||||||
|
|
||||||
|
#
|
||||||
|
# Documentation:
|
||||||
|
# https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions
|
||||||
|
#
|
||||||
|
|
||||||
|
#############################
|
||||||
|
# Start the job on all push #
|
||||||
|
#############################
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches-ignore: [main]
|
||||||
|
# Remove the line above to run when pushing to master
|
||||||
|
pull_request:
|
||||||
|
branches: [main]
|
||||||
|
|
||||||
|
###############
|
||||||
|
# Set the Job #
|
||||||
|
###############
|
||||||
|
permissions:
|
||||||
|
checks: write
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
|
statuses: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
# Name the Job
|
||||||
|
name: Lint Code Base
|
||||||
|
# Set the agent to run on
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
##################
|
||||||
|
# Load all steps #
|
||||||
|
##################
|
||||||
|
steps:
|
||||||
|
##########################
|
||||||
|
# Checkout the code base #
|
||||||
|
##########################
|
||||||
|
- name: Checkout Code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
# Full git history is needed to get a proper list of changed files within `super-linter`
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Set-up Node.js
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version-file: .nvmrc
|
||||||
|
cache: yarn
|
||||||
|
- name: Install dependencies
|
||||||
|
run: yarn install --frozen-lockfile
|
||||||
|
- name: Check prettier formatting
|
||||||
|
run: yarn format-check
|
||||||
|
- name: Set-up RuboCop Problem Mathcher
|
||||||
|
uses: r7kamura/rubocop-problem-matchers-action@v1
|
||||||
|
- name: Set-up Stylelint Problem Matcher
|
||||||
|
uses: xt0rted/stylelint-problem-matcher@v1
|
||||||
|
# https://github.com/xt0rted/stylelint-problem-matcher/issues/360
|
||||||
|
- run: echo "::add-matcher::.github/stylelint-matcher.json"
|
||||||
|
|
||||||
|
################################
|
||||||
|
# Run Linter against code base #
|
||||||
|
################################
|
||||||
|
- name: Lint Code Base
|
||||||
|
uses: github/super-linter@v4
|
||||||
|
env:
|
||||||
|
CSS_FILE_NAME: stylelint.config.js
|
||||||
|
DEFAULT_BRANCH: main
|
||||||
|
NO_COLOR: 1 # https://github.com/xt0rted/stylelint-problem-matcher/issues/360
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
JAVASCRIPT_ES_CONFIG_FILE: .eslintrc.js
|
||||||
|
LINTER_RULES_PATH: .
|
||||||
|
RUBY_CONFIG_FILE: .rubocop.yml
|
||||||
|
VALIDATE_ALL_CODEBASE: false
|
||||||
|
VALIDATE_CSS: true
|
||||||
|
VALIDATE_JAVASCRIPT_ES: true
|
||||||
|
VALIDATE_RUBY: true
|
17
.github/workflows/rebase-needed.yml
vendored
Normal file
17
.github/workflows/rebase-needed.yml
vendored
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
name: PR Needs Rebase
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
pull_request_target:
|
||||||
|
types: [synchronize]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
label-rebase-needed:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Check for merge conflicts
|
||||||
|
uses: eps1lon/actions-label-merge-conflict@releases/2.x
|
||||||
|
with:
|
||||||
|
dirtyLabel: 'rebase needed :construction:'
|
||||||
|
repoToken: '${{ secrets.GITHUB_TOKEN }}'
|
||||||
|
commentOnDirty: This pull request has merge conflicts that must be resolved before it can be merged.
|
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -44,9 +44,6 @@
|
||||||
/redis
|
/redis
|
||||||
/elasticsearch
|
/elasticsearch
|
||||||
|
|
||||||
# ignore Helm dependency charts
|
|
||||||
/chart/charts/*.tgz
|
|
||||||
|
|
||||||
# Ignore Apple files
|
# Ignore Apple files
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
|
|
2
.nvmrc
2
.nvmrc
|
@ -1 +1 @@
|
||||||
14
|
16
|
||||||
|
|
72
.prettierignore
Normal file
72
.prettierignore
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
# See https://help.github.com/articles/ignoring-files for more about ignoring files.
|
||||||
|
#
|
||||||
|
# If you find yourself ignoring temporary files generated by your text editor
|
||||||
|
# or operating system, you probably want to add a global ignore instead:
|
||||||
|
# git config --global core.excludesfile '~/.gitignore_global'
|
||||||
|
|
||||||
|
# Ignore bundler config and downloaded libraries.
|
||||||
|
/.bundle
|
||||||
|
/vendor/bundle
|
||||||
|
|
||||||
|
# Ignore the default SQLite database.
|
||||||
|
/db/*.sqlite3
|
||||||
|
/db/*.sqlite3-journal
|
||||||
|
|
||||||
|
# Ignore all logfiles and tempfiles.
|
||||||
|
.eslintcache
|
||||||
|
/log/*
|
||||||
|
!/log/.keep
|
||||||
|
/tmp
|
||||||
|
/coverage
|
||||||
|
/public/system
|
||||||
|
/public/assets
|
||||||
|
/public/packs
|
||||||
|
/public/packs-test
|
||||||
|
.env
|
||||||
|
.env.production
|
||||||
|
.env.development
|
||||||
|
/node_modules/
|
||||||
|
/build/
|
||||||
|
|
||||||
|
# Ignore Vagrant files
|
||||||
|
.vagrant/
|
||||||
|
|
||||||
|
# Ignore Capistrano customizations
|
||||||
|
/config/deploy/*
|
||||||
|
|
||||||
|
# Ignore IDE files
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# Ignore postgres + redis + elasticsearch volume optionally created by docker-compose
|
||||||
|
/postgres
|
||||||
|
/postgres14
|
||||||
|
/redis
|
||||||
|
/elasticsearch
|
||||||
|
|
||||||
|
# Ignore Apple files
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Ignore vim files
|
||||||
|
*~
|
||||||
|
*.swp
|
||||||
|
|
||||||
|
# Ignore npm debug log
|
||||||
|
npm-debug.log
|
||||||
|
|
||||||
|
# Ignore yarn log files
|
||||||
|
yarn-error.log
|
||||||
|
yarn-debug.log
|
||||||
|
|
||||||
|
# Ignore vagrant log files
|
||||||
|
*-cloudimg-console.log
|
||||||
|
|
||||||
|
# Ignore Docker option files
|
||||||
|
docker-compose.override.yml
|
||||||
|
|
||||||
|
# Ignore emoji map file
|
||||||
|
/app/javascript/mastodon/features/emoji/emoji_map.json
|
||||||
|
|
||||||
|
# Ignore locale files
|
||||||
|
/app/javascript/mastodon/locales
|
||||||
|
/config/locales
|
3
.prettierrc.js
Normal file
3
.prettierrc.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
module.exports = {
|
||||||
|
singleQuote: true
|
||||||
|
}
|
237
.rubocop.yml
237
.rubocop.yml
|
@ -1,21 +1,27 @@
|
||||||
require:
|
require:
|
||||||
- rubocop-rails
|
- rubocop-rails
|
||||||
|
- rubocop-rspec
|
||||||
|
- rubocop-performance
|
||||||
|
|
||||||
AllCops:
|
AllCops:
|
||||||
TargetRubyVersion: 2.5
|
TargetRubyVersion: 2.7
|
||||||
NewCops: disable
|
DisplayCopNames: true
|
||||||
|
DisplayStyleGuide: true
|
||||||
|
ExtraDetails: true
|
||||||
|
UseCache: true
|
||||||
|
CacheRootDirectory: tmp
|
||||||
|
NewCops: enable
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'spec/**/*'
|
- db/schema.rb
|
||||||
- 'db/**/*'
|
- 'app/views/**/*'
|
||||||
- 'app/views/**/*'
|
- 'config/**/*'
|
||||||
- 'config/**/*'
|
- 'bin/*'
|
||||||
- 'bin/*'
|
- 'Rakefile'
|
||||||
- 'Rakefile'
|
- 'node_modules/**/*'
|
||||||
- 'node_modules/**/*'
|
- 'Vagrantfile'
|
||||||
- 'Vagrantfile'
|
- 'vendor/**/*'
|
||||||
- 'vendor/**/*'
|
- 'lib/json_ld/*'
|
||||||
- 'lib/json_ld/*'
|
- 'lib/templates/**/*'
|
||||||
- 'lib/templates/**/*'
|
|
||||||
|
|
||||||
Bundler/OrderedGems:
|
Bundler/OrderedGems:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
@ -29,13 +35,17 @@ Layout/EmptyLineAfterMagicComment:
|
||||||
Layout/EmptyLineAfterGuardClause:
|
Layout/EmptyLineAfterGuardClause:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
Layout/EmptyLineBetweenDefs:
|
||||||
|
AllowAdjacentOneLineDefs: true
|
||||||
|
|
||||||
Layout/EmptyLinesAroundAttributeAccessor:
|
Layout/EmptyLinesAroundAttributeAccessor:
|
||||||
Enabled: true
|
Enabled: true
|
||||||
|
|
||||||
|
Layout/FirstHashElementIndentation:
|
||||||
|
EnforcedStyle: consistent
|
||||||
|
|
||||||
Layout/HashAlignment:
|
Layout/HashAlignment:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
# EnforcedHashRocketStyle: table
|
|
||||||
# EnforcedColonStyle: table
|
|
||||||
|
|
||||||
Layout/SpaceAroundMethodCallOperator:
|
Layout/SpaceAroundMethodCallOperator:
|
||||||
Enabled: true
|
Enabled: true
|
||||||
|
@ -63,15 +73,57 @@ Lint/UselessAccessModifier:
|
||||||
- class_methods
|
- class_methods
|
||||||
|
|
||||||
Metrics/AbcSize:
|
Metrics/AbcSize:
|
||||||
Max: 100
|
Max: 34 # RuboCop default 17
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'lib/mastodon/*_cli.rb'
|
- 'lib/**/*cli*.rb'
|
||||||
|
- db/*migrate/**/*
|
||||||
|
- lib/paperclip/color_extractor.rb
|
||||||
|
- app/workers/scheduler/follow_recommendations_scheduler.rb
|
||||||
|
- app/services/activitypub/fetch*_service.rb
|
||||||
|
- lib/paperclip/**/*
|
||||||
|
CountRepeatedAttributes: false
|
||||||
|
AllowedMethods:
|
||||||
|
- update_media_attachments!
|
||||||
|
- account_link_to
|
||||||
|
- attempt_oembed
|
||||||
|
- build_crutches
|
||||||
|
- calculate_scores
|
||||||
|
- cc
|
||||||
|
- dump_actor!
|
||||||
|
- filter_from_home?
|
||||||
|
- hydrate
|
||||||
|
- import_bookmarks!
|
||||||
|
- import_relationships!
|
||||||
|
- initialize
|
||||||
|
- link_to_mention
|
||||||
|
- log_target
|
||||||
|
- matches_time_window?
|
||||||
|
- parse_metadata
|
||||||
|
- perform_statuses_search!
|
||||||
|
- privatize_media_attachments!
|
||||||
|
- process_update
|
||||||
|
- publish_media_attachments!
|
||||||
|
- remotable_attachment
|
||||||
|
- render_initial_state
|
||||||
|
- render_with_cache
|
||||||
|
- searchable_by
|
||||||
|
- self.cached_filters_for
|
||||||
|
- set_fetchable_attributes!
|
||||||
|
- signed_request_actor
|
||||||
|
- statuses_to_delete
|
||||||
|
- update_poll!
|
||||||
|
|
||||||
Metrics/BlockLength:
|
Metrics/BlockLength:
|
||||||
Max: 55
|
Max: 55
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'lib/tasks/**/*'
|
|
||||||
- 'lib/mastodon/*_cli.rb'
|
- 'lib/mastodon/*_cli.rb'
|
||||||
|
CountComments: false
|
||||||
|
CountAsOne: [array, heredoc]
|
||||||
|
AllowedMethods:
|
||||||
|
- task
|
||||||
|
- namespace
|
||||||
|
- class_methods
|
||||||
|
- included
|
||||||
|
|
||||||
Metrics/BlockNesting:
|
Metrics/BlockNesting:
|
||||||
Max: 3
|
Max: 3
|
||||||
|
@ -80,35 +132,145 @@ Metrics/BlockNesting:
|
||||||
|
|
||||||
Metrics/ClassLength:
|
Metrics/ClassLength:
|
||||||
CountComments: false
|
CountComments: false
|
||||||
Max: 400
|
Max: 500
|
||||||
|
CountAsOne: [array, heredoc]
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'lib/mastodon/*_cli.rb'
|
- 'lib/mastodon/*_cli.rb'
|
||||||
|
|
||||||
Metrics/CyclomaticComplexity:
|
Metrics/CyclomaticComplexity:
|
||||||
Max: 25
|
Max: 12
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'lib/mastodon/*_cli.rb'
|
- lib/mastodon/*cli*.rb
|
||||||
|
- db/*migrate/**/*
|
||||||
|
AllowedMethods:
|
||||||
|
- attempt_oembed
|
||||||
|
- blocked?
|
||||||
|
- build_crutches
|
||||||
|
- calculate_scores
|
||||||
|
- cc
|
||||||
|
- discover_endpoint!
|
||||||
|
- filter_from_home?
|
||||||
|
- hydrate
|
||||||
|
- klass
|
||||||
|
- link_to_mention
|
||||||
|
- log_target
|
||||||
|
- matches_time_window?
|
||||||
|
- patch_for_forwarding!
|
||||||
|
- preprocess_attributes!
|
||||||
|
- process_update
|
||||||
|
- remotable_attachment
|
||||||
|
- scan_text!
|
||||||
|
- self.cached_filters_for
|
||||||
|
- set_fetchable_attributes!
|
||||||
|
- setup_redis_env_url
|
||||||
|
- update_media_attachments!
|
||||||
|
|
||||||
Layout/LineLength:
|
Layout/LineLength:
|
||||||
|
Max: 140 # RuboCop default 120
|
||||||
|
AllowHeredoc: true
|
||||||
AllowURI: true
|
AllowURI: true
|
||||||
Enabled: false
|
IgnoreCopDirectives: true
|
||||||
|
AllowedPatterns:
|
||||||
|
# Allow comments to be long lines
|
||||||
|
- !ruby/regexp / \# .*$/
|
||||||
|
- !ruby/regexp /^\# .*$/
|
||||||
|
Exclude:
|
||||||
|
- lib/**/*cli*.rb
|
||||||
|
- db/*migrate/**/*
|
||||||
|
- db/seeds/**/*
|
||||||
|
|
||||||
Metrics/MethodLength:
|
Metrics/MethodLength:
|
||||||
CountComments: false
|
CountComments: false
|
||||||
Max: 65
|
CountAsOne: [array, heredoc]
|
||||||
|
Max: 25 # RuboCop default 10
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'lib/mastodon/*_cli.rb'
|
- 'lib/mastodon/*_cli.rb'
|
||||||
|
AllowedMethods:
|
||||||
|
- account_link_to
|
||||||
|
- attempt_oembed
|
||||||
|
- body_with_limit
|
||||||
|
- build_crutches
|
||||||
|
- cached_filters_for
|
||||||
|
- calculate_scores
|
||||||
|
- check_webfinger!
|
||||||
|
- clean_feeds!
|
||||||
|
- collection_items
|
||||||
|
- collection_presenter
|
||||||
|
- copy_account_notes!
|
||||||
|
- deduplicate_accounts!
|
||||||
|
- deduplicate_conversations!
|
||||||
|
- deduplicate_local_accounts!
|
||||||
|
- deduplicate_statuses!
|
||||||
|
- deduplicate_tags!
|
||||||
|
- deduplicate_users!
|
||||||
|
- discover_endpoint!
|
||||||
|
- extract_extra_uris_with_indices
|
||||||
|
- extract_hashtags_with_indices
|
||||||
|
- extract_mentions_or_lists_with_indices
|
||||||
|
- filter_from_home?
|
||||||
|
- from_elasticsearch
|
||||||
|
- handle_explicit_update!
|
||||||
|
- handle_mark_as_sensitive!
|
||||||
|
- hsl_to_rgb
|
||||||
|
- import_bookmarks!
|
||||||
|
- import_domain_blocks!
|
||||||
|
- import_relationships!
|
||||||
|
- ldap_options
|
||||||
|
- matches_time_window?
|
||||||
|
- outbox_presenter
|
||||||
|
- pam_get_user
|
||||||
|
- parallelize_with_progress
|
||||||
|
- parse_and_transform
|
||||||
|
- patch_for_forwarding!
|
||||||
|
- populate_home
|
||||||
|
- post_process_style
|
||||||
|
- preload_cache_collection_target_statuses
|
||||||
|
- privatize_media_attachments!
|
||||||
|
- provides_callback_for
|
||||||
|
- publish_media_attachments!
|
||||||
|
- relevant_account_timestamp
|
||||||
|
- remotable_attachment
|
||||||
|
- rgb_to_hsl
|
||||||
|
- rss_status_content_format
|
||||||
|
- set_fetchable_attributes!
|
||||||
|
- setup_redis_env_url
|
||||||
|
- signed_request_actor
|
||||||
|
- to_preview_card_attributes
|
||||||
|
- upgrade_storage_filesystem
|
||||||
|
- upgrade_storage_s3
|
||||||
|
- user_settings_params
|
||||||
|
- hydrate
|
||||||
|
- cc
|
||||||
|
- self_destruct
|
||||||
|
|
||||||
Metrics/ModuleLength:
|
Metrics/ModuleLength:
|
||||||
CountComments: false
|
CountComments: false
|
||||||
Max: 200
|
Max: 200
|
||||||
|
CountAsOne: [array, heredoc]
|
||||||
|
|
||||||
Metrics/ParameterLists:
|
Metrics/ParameterLists:
|
||||||
Max: 5
|
Max: 5 # RuboCop default 5
|
||||||
CountKeywordArgs: true
|
CountKeywordArgs: true # RuboCop default true
|
||||||
|
MaxOptionalParameters: 3 # RuboCop default 3
|
||||||
|
Exclude:
|
||||||
|
- app/models/concerns/account_interactions.rb
|
||||||
|
- app/services/activitypub/fetch_remote_account_service.rb
|
||||||
|
- app/services/activitypub/fetch_remote_actor_service.rb
|
||||||
|
|
||||||
Metrics/PerceivedComplexity:
|
Metrics/PerceivedComplexity:
|
||||||
Max: 25
|
Max: 16 # RuboCop default 8
|
||||||
|
AllowedMethods:
|
||||||
|
- attempt_oembed
|
||||||
|
- build_crutches
|
||||||
|
- calculate_scores
|
||||||
|
- deduplicate_users!
|
||||||
|
- discover_endpoint!
|
||||||
|
- filter_from_home?
|
||||||
|
- hydrate
|
||||||
|
- patch_for_forwarding!
|
||||||
|
- process_update
|
||||||
|
- remove_orphans
|
||||||
|
- update_media_attachments!
|
||||||
|
|
||||||
Naming/MemoizedInstanceVariableName:
|
Naming/MemoizedInstanceVariableName:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
@ -239,6 +401,10 @@ Style/HashTransformKeys:
|
||||||
Style/HashTransformValues:
|
Style/HashTransformValues:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
Style/HashSyntax:
|
||||||
|
Enabled: true
|
||||||
|
EnforcedStyle: ruby19_no_mixed_keys
|
||||||
|
|
||||||
Style/IfUnlessModifier:
|
Style/IfUnlessModifier:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
@ -259,9 +425,6 @@ Style/PercentLiteralDelimiters:
|
||||||
Style/PerlBackrefs:
|
Style/PerlBackrefs:
|
||||||
AutoCorrect: false
|
AutoCorrect: false
|
||||||
|
|
||||||
Style/RedundantAssignment:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Style/RedundantFetchBlock:
|
Style/RedundantFetchBlock:
|
||||||
Enabled: true
|
Enabled: true
|
||||||
|
|
||||||
|
@ -277,11 +440,14 @@ Style/RedundantRegexpEscape:
|
||||||
Style/RedundantReturn:
|
Style/RedundantReturn:
|
||||||
Enabled: true
|
Enabled: true
|
||||||
|
|
||||||
|
Style/RedundantBegin:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
Style/RegexpLiteral:
|
Style/RegexpLiteral:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
Style/RescueStandardError:
|
Style/RescueStandardError:
|
||||||
Enabled: false
|
Enabled: true
|
||||||
|
|
||||||
Style/SignalException:
|
Style/SignalException:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
@ -300,3 +466,14 @@ Style/TrailingCommaInHashLiteral:
|
||||||
|
|
||||||
Style/UnpackFirst:
|
Style/UnpackFirst:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
RSpec/ScatteredSetup:
|
||||||
|
Enabled: false
|
||||||
|
RSpec/ImplicitExpect:
|
||||||
|
Enabled: false
|
||||||
|
RSpec/NamedSubject:
|
||||||
|
Enabled: false
|
||||||
|
RSpec/DescribeClass:
|
||||||
|
Enabled: false
|
||||||
|
RSpec/LetSetup:
|
||||||
|
Enabled: false
|
||||||
|
|
1
.ruby-gemset
Normal file
1
.ruby-gemset
Normal file
|
@ -0,0 +1 @@
|
||||||
|
mastodon
|
|
@ -1 +1 @@
|
||||||
3.0.3
|
3.0.4
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
# Linter Documentation:
|
|
||||||
# https://github.com/sasstools/sass-lint/tree/v1.13.1/docs/options
|
|
||||||
|
|
||||||
files:
|
|
||||||
include: app/javascript/styles/**/*.scss
|
|
||||||
ignore:
|
|
||||||
- app/javascript/styles/mastodon/reset.scss
|
|
||||||
|
|
||||||
rules:
|
|
||||||
# Disallows
|
|
||||||
no-color-literals: 0
|
|
||||||
no-css-comments: 0
|
|
||||||
no-duplicate-properties: 0
|
|
||||||
no-ids: 0
|
|
||||||
no-important: 0
|
|
||||||
no-mergeable-selectors: 0
|
|
||||||
no-misspelled-properties: 0
|
|
||||||
no-qualifying-elements: 0
|
|
||||||
no-transition-all: 0
|
|
||||||
no-vendor-prefixes: 0
|
|
||||||
|
|
||||||
# Nesting
|
|
||||||
force-element-nesting: 0
|
|
||||||
force-attribute-nesting: 0
|
|
||||||
force-pseudo-nesting: 0
|
|
||||||
|
|
||||||
# Name Formats
|
|
||||||
class-name-format: 0
|
|
||||||
leading-zero: 0
|
|
||||||
|
|
||||||
# Style Guide
|
|
||||||
attribute-quotes: 0
|
|
||||||
hex-length: 0
|
|
||||||
indentation: 0
|
|
||||||
nesting-depth: 0
|
|
||||||
property-sort-order: 0
|
|
||||||
quotes: 0
|
|
1288
AUTHORS.md
1288
AUTHORS.md
File diff suppressed because it is too large
Load diff
24
Aptfile
24
Aptfile
|
@ -1,28 +1,4 @@
|
||||||
ffmpeg
|
ffmpeg
|
||||||
libicu[0-9][0-9]
|
|
||||||
libicu-dev
|
|
||||||
libidn11
|
|
||||||
libidn11-dev
|
|
||||||
libpq-dev
|
libpq-dev
|
||||||
libprotobuf-dev
|
|
||||||
libxdamage1
|
libxdamage1
|
||||||
libxfixes3
|
libxfixes3
|
||||||
protobuf-compiler
|
|
||||||
zlib1g-dev
|
|
||||||
libcairo2
|
|
||||||
libcroco3
|
|
||||||
libdatrie1
|
|
||||||
libgdk-pixbuf2.0-0
|
|
||||||
libgraphite2-3
|
|
||||||
libharfbuzz0b
|
|
||||||
libpango-1.0-0
|
|
||||||
libpangocairo-1.0-0
|
|
||||||
libpangoft2-1.0-0
|
|
||||||
libpixman-1-0
|
|
||||||
librsvg2-2
|
|
||||||
libthai-data
|
|
||||||
libthai0
|
|
||||||
libvpx[5-9]
|
|
||||||
libxcb-render0
|
|
||||||
libxcb-shm0
|
|
||||||
libxrender1
|
|
||||||
|
|
626
CHANGELOG.md
626
CHANGELOG.md
|
@ -3,6 +3,602 @@ Changelog
|
||||||
|
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
## [4.0.2] - 2022-11-15
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix wrong color on mentions hidden behind content warning in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/20724))
|
||||||
|
- Fix filters from other users being used in the streaming service ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20719))
|
||||||
|
- Fix `unsafe-eval` being used when `wasm-unsafe-eval` is enough in Content Security Policy ([Gargron](https://github.com/mastodon/mastodon/pull/20729), [prplecake](https://github.com/mastodon/mastodon/pull/20606))
|
||||||
|
|
||||||
|
## [4.0.1] - 2022-11-14
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix nodes order being sometimes mangled when rewriting emoji ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20677))
|
||||||
|
|
||||||
|
## [4.0.0] - 2022-11-14
|
||||||
|
|
||||||
|
Some of the features in this release have been funded through the [NGI0 Discovery](https://nlnet.nl/discovery) Fund, a fund established by [NLnet](https://nlnet.nl/) with financial support from the European Commission's [Next Generation Internet](https://ngi.eu/) programme, under the aegis of DG Communications Networks, Content and Technology under grant agreement No 825322.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add ability to filter followed accounts' posts by language ([Gargron](https://github.com/mastodon/mastodon/pull/19095), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/19268))
|
||||||
|
- **Add ability to follow hashtags** ([Gargron](https://github.com/mastodon/mastodon/pull/18809), [Gargron](https://github.com/mastodon/mastodon/pull/18862), [Gargron](https://github.com/mastodon/mastodon/pull/19472), [noellabo](https://github.com/mastodon/mastodon/pull/18924))
|
||||||
|
- Add ability to filter individual posts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18945))
|
||||||
|
- **Add ability to translate posts** ([Gargron](https://github.com/mastodon/mastodon/pull/19218), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/19433), [Gargron](https://github.com/mastodon/mastodon/pull/19453), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/19434), [Gargron](https://github.com/mastodon/mastodon/pull/19388), [ykzts](https://github.com/mastodon/mastodon/pull/19244), [Gargron](https://github.com/mastodon/mastodon/pull/19245))
|
||||||
|
- Add featured tags to web UI ([noellabo](https://github.com/mastodon/mastodon/pull/19408), [noellabo](https://github.com/mastodon/mastodon/pull/19380), [noellabo](https://github.com/mastodon/mastodon/pull/19358), [noellabo](https://github.com/mastodon/mastodon/pull/19409), [Gargron](https://github.com/mastodon/mastodon/pull/19382), [ykzts](https://github.com/mastodon/mastodon/pull/19418), [noellabo](https://github.com/mastodon/mastodon/pull/19403), [noellabo](https://github.com/mastodon/mastodon/pull/19404), [Gargron](https://github.com/mastodon/mastodon/pull/19398), [Gargron](https://github.com/mastodon/mastodon/pull/19712), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/20018))
|
||||||
|
- **Add support for language preferences for trending statuses and links** ([Gargron](https://github.com/mastodon/mastodon/pull/18288), [Gargron](https://github.com/mastodon/mastodon/pull/19349), [ykzts](https://github.com/mastodon/mastodon/pull/19335))
|
||||||
|
- Previously, you could only see trends in your current language
|
||||||
|
- For less popular languages, that meant empty trends
|
||||||
|
- Now, trends in your preferred languages' are shown on top, with others beneath
|
||||||
|
- Add server rules to sign-up flow ([Gargron](https://github.com/mastodon/mastodon/pull/19296))
|
||||||
|
- Add privacy icons to report modal in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19190))
|
||||||
|
- Add `noopener` to links to remote profiles in web UI ([shleeable](https://github.com/mastodon/mastodon/pull/19014))
|
||||||
|
- Add option to open original page in dropdowns of remote content in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/20299))
|
||||||
|
- Add warning for sensitive audio posts in web UI ([rgroothuijsen](https://github.com/mastodon/mastodon/pull/17885))
|
||||||
|
- Add language attribute to posts in web UI ([tribela](https://github.com/mastodon/mastodon/pull/18544))
|
||||||
|
- Add support for uploading WebP files ([Saiv46](https://github.com/mastodon/mastodon/pull/18506))
|
||||||
|
- Add support for uploading `audio/vnd.wave` files ([tribela](https://github.com/mastodon/mastodon/pull/18737))
|
||||||
|
- Add support for uploading AVIF files ([txt-file](https://github.com/mastodon/mastodon/pull/19647))
|
||||||
|
- Add support for uploading HEIC files ([Gargron](https://github.com/mastodon/mastodon/pull/19618))
|
||||||
|
- Add more debug information when processing remote accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15605), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/19209))
|
||||||
|
- **Add retention policy for cached content and media** ([Gargron](https://github.com/mastodon/mastodon/pull/19232), [zunda](https://github.com/mastodon/mastodon/pull/19478), [Gargron](https://github.com/mastodon/mastodon/pull/19458), [Gargron](https://github.com/mastodon/mastodon/pull/19248))
|
||||||
|
- Set for how long remote posts or media should be cached on your server
|
||||||
|
- Hands-off alternative to `tootctl` commands
|
||||||
|
- **Add customizable user roles** ([Gargron](https://github.com/mastodon/mastodon/pull/18641), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/18812), [Gargron](https://github.com/mastodon/mastodon/pull/19040), [tribela](https://github.com/mastodon/mastodon/pull/18825), [tribela](https://github.com/mastodon/mastodon/pull/18826), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/18776), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/18777), [unextro](https://github.com/mastodon/mastodon/pull/18786), [tribela](https://github.com/mastodon/mastodon/pull/18824), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/19436))
|
||||||
|
- Previously, there were 3 hard-coded roles, user, moderator, and admin
|
||||||
|
- Create your own roles and decide which permissions they should have
|
||||||
|
- Add notifications for new reports ([Gargron](https://github.com/mastodon/mastodon/pull/18697), [Gargron](https://github.com/mastodon/mastodon/pull/19475))
|
||||||
|
- Add ability to select all accounts matching search for batch actions in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/19053), [Gargron](https://github.com/mastodon/mastodon/pull/19054))
|
||||||
|
- Add ability to view previous edits of a status in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/19462))
|
||||||
|
- Add ability to block sign-ups from IP ([Gargron](https://github.com/mastodon/mastodon/pull/19037))
|
||||||
|
- **Add webhooks to admin UI** ([Gargron](https://github.com/mastodon/mastodon/pull/18510))
|
||||||
|
- Add admin API for managing domain allows ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18668))
|
||||||
|
- Add admin API for managing domain blocks ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18247))
|
||||||
|
- Add admin API for managing e-mail domain blocks ([Gargron](https://github.com/mastodon/mastodon/pull/19066))
|
||||||
|
- Add admin API for managing canonical e-mail blocks ([Gargron](https://github.com/mastodon/mastodon/pull/19067))
|
||||||
|
- Add admin API for managing IP blocks ([Gargron](https://github.com/mastodon/mastodon/pull/19065), [trwnh](https://github.com/mastodon/mastodon/pull/20207))
|
||||||
|
- Add `sensitized` attribute to accounts in admin REST API ([trwnh](https://github.com/mastodon/mastodon/pull/20094))
|
||||||
|
- Add `services` and `metadata` to the NodeInfo endpoint ([MFTabriz](https://github.com/mastodon/mastodon/pull/18563))
|
||||||
|
- Add `--remove-role` option to `tootctl accounts modify` ([Gargron](https://github.com/mastodon/mastodon/pull/19477))
|
||||||
|
- Add `--days` option to `tootctl media refresh` ([tribela](https://github.com/mastodon/mastodon/pull/18425))
|
||||||
|
- Add `EMAIL_DOMAIN_LISTS_APPLY_AFTER_CONFIRMATION` environment variable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18642))
|
||||||
|
- Add `IP_RETENTION_PERIOD` and `SESSION_RETENTION_PERIOD` environment variables ([kescherCode](https://github.com/mastodon/mastodon/pull/18757))
|
||||||
|
- Add `http_hidden_proxy` environment variable ([tribela](https://github.com/mastodon/mastodon/pull/18427))
|
||||||
|
- Add `ENABLE_STARTTLS` environment variable ([erbridge](https://github.com/mastodon/mastodon/pull/20321))
|
||||||
|
- Add caching for payload serialization during fan-out ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19637), [Gargron](https://github.com/mastodon/mastodon/pull/19642), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/19746), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/19747), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/19963))
|
||||||
|
- Add assets from Twemoji 14.0 ([Gargron](https://github.com/mastodon/mastodon/pull/19733))
|
||||||
|
- Add reputation and followers score boost to SQL-only account search ([Gargron](https://github.com/mastodon/mastodon/pull/19251))
|
||||||
|
- Add Scots, Balaibalan, Láadan, Lingua Franca Nova, Lojban, Toki Pona to languages list ([VyrCossont](https://github.com/mastodon/mastodon/pull/20168))
|
||||||
|
- Set autocomplete hints for e-mail, password and OTP fields ([rcombs](https://github.com/mastodon/mastodon/pull/19833), [offbyone](https://github.com/mastodon/mastodon/pull/19946), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/20071))
|
||||||
|
- Add support for DigitalOcean Spaces in setup wizard ([v-aisac](https://github.com/mastodon/mastodon/pull/20573))
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- **Change brand color and logotypes** ([Gargron](https://github.com/mastodon/mastodon/pull/18592), [Gargron](https://github.com/mastodon/mastodon/pull/18639), [Gargron](https://github.com/mastodon/mastodon/pull/18691), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/18634), [Gargron](https://github.com/mastodon/mastodon/pull/19254), [mayaeh](https://github.com/mastodon/mastodon/pull/18710))
|
||||||
|
- **Change post editing to be enabled in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/19103))
|
||||||
|
- **Change web UI to work for logged-out users** ([Gargron](https://github.com/mastodon/mastodon/pull/18961), [Gargron](https://github.com/mastodon/mastodon/pull/19250), [Gargron](https://github.com/mastodon/mastodon/pull/19294), [Gargron](https://github.com/mastodon/mastodon/pull/19306), [Gargron](https://github.com/mastodon/mastodon/pull/19315), [ykzts](https://github.com/mastodon/mastodon/pull/19322), [Gargron](https://github.com/mastodon/mastodon/pull/19412), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/19437), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/19415), [Gargron](https://github.com/mastodon/mastodon/pull/19348), [Gargron](https://github.com/mastodon/mastodon/pull/19295), [Gargron](https://github.com/mastodon/mastodon/pull/19422), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/19414), [Gargron](https://github.com/mastodon/mastodon/pull/19319), [Gargron](https://github.com/mastodon/mastodon/pull/19345), [Gargron](https://github.com/mastodon/mastodon/pull/19310), [Gargron](https://github.com/mastodon/mastodon/pull/19301), [Gargron](https://github.com/mastodon/mastodon/pull/19423), [ykzts](https://github.com/mastodon/mastodon/pull/19471), [ykzts](https://github.com/mastodon/mastodon/pull/19333), [ykzts](https://github.com/mastodon/mastodon/pull/19337), [ykzts](https://github.com/mastodon/mastodon/pull/19272), [ykzts](https://github.com/mastodon/mastodon/pull/19468), [Gargron](https://github.com/mastodon/mastodon/pull/19466), [Gargron](https://github.com/mastodon/mastodon/pull/19457), [Gargron](https://github.com/mastodon/mastodon/pull/19426), [Gargron](https://github.com/mastodon/mastodon/pull/19427), [Gargron](https://github.com/mastodon/mastodon/pull/19421), [Gargron](https://github.com/mastodon/mastodon/pull/19417), [Gargron](https://github.com/mastodon/mastodon/pull/19413), [Gargron](https://github.com/mastodon/mastodon/pull/19397), [Gargron](https://github.com/mastodon/mastodon/pull/19387), [Gargron](https://github.com/mastodon/mastodon/pull/19396), [Gargron](https://github.com/mastodon/mastodon/pull/19385), [ykzts](https://github.com/mastodon/mastodon/pull/19334), [ykzts](https://github.com/mastodon/mastodon/pull/19329), [Gargron](https://github.com/mastodon/mastodon/pull/19324), [Gargron](https://github.com/mastodon/mastodon/pull/19318), [Gargron](https://github.com/mastodon/mastodon/pull/19316), [Gargron](https://github.com/mastodon/mastodon/pull/19263), [trwnh](https://github.com/mastodon/mastodon/pull/19305), [ykzts](https://github.com/mastodon/mastodon/pull/19273), [Gargron](https://github.com/mastodon/mastodon/pull/19801), [Gargron](https://github.com/mastodon/mastodon/pull/19790), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/19773), [Gargron](https://github.com/mastodon/mastodon/pull/19798), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/19724), [Gargron](https://github.com/mastodon/mastodon/pull/19709), [Gargron](https://github.com/mastodon/mastodon/pull/19514), [Gargron](https://github.com/mastodon/mastodon/pull/19562), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/19981), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/19978), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/20148), [Gargron](https://github.com/mastodon/mastodon/pull/20302), [cutls](https://github.com/mastodon/mastodon/pull/20400))
|
||||||
|
- The web app can now be accessed without being logged in
|
||||||
|
- No more `/web` prefix on web app paths
|
||||||
|
- Profiles, posts, and other public pages now use the same interface for logged in and logged out users
|
||||||
|
- The web app displays a server information banner
|
||||||
|
- Pop-up windows for remote interaction have been replaced with a modal window
|
||||||
|
- No need to type in your username for remote interaction, copy-paste-to-search method explained
|
||||||
|
- Various hints throughout the app explain what the different timelines are
|
||||||
|
- New about page design
|
||||||
|
- New privacy policy page design shows when the policy was last updated
|
||||||
|
- All sections of the web app now have appropriate window titles
|
||||||
|
- The layout of the interface has been streamlined between different screen sizes
|
||||||
|
- Posts now use more horizontal space
|
||||||
|
- Change label of publish button to be "Publish" again in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/18583))
|
||||||
|
- Change language to be carried over on reply in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18557))
|
||||||
|
- Change "Unfollow" to "Cancel follow request" when request still pending in web UI ([prplecake](https://github.com/mastodon/mastodon/pull/19363))
|
||||||
|
- **Change post filtering system** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18058), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/19050), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/18894), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/19051), [noellabo](https://github.com/mastodon/mastodon/pull/18923), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/18956), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/18744), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/19878), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/20567))
|
||||||
|
- Filtered keywords and phrases can now be grouped into named categories
|
||||||
|
- Filtered posts show which exact filter was hit
|
||||||
|
- Individual posts can be added to a filter
|
||||||
|
- You can peek inside filtered posts anyway
|
||||||
|
- Change path of privacy policy page from `/terms` to `/privacy-policy` ([Gargron](https://github.com/mastodon/mastodon/pull/19249))
|
||||||
|
- Change how hashtags are normalized ([Gargron](https://github.com/mastodon/mastodon/pull/18795), [Gargron](https://github.com/mastodon/mastodon/pull/18863), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/18854))
|
||||||
|
- Change settings area to be separated into categories in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/19407), [Gargron](https://github.com/mastodon/mastodon/pull/19533))
|
||||||
|
- Change "No accounts selected" errors to use the appropriate noun in admin UI ([prplecake](https://github.com/mastodon/mastodon/pull/19356))
|
||||||
|
- Change e-mail domain blocks to match subdomains of blocked domains ([Gargron](https://github.com/mastodon/mastodon/pull/18979))
|
||||||
|
- Change custom emoji file size limit from 50 KB to 256 KB ([Gargron](https://github.com/mastodon/mastodon/pull/18788))
|
||||||
|
- Change "Allow trends without prior review" setting to also work for trending posts ([Gargron](https://github.com/mastodon/mastodon/pull/17977))
|
||||||
|
- Change admin announcements form to use single inputs for date and time in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18321))
|
||||||
|
- Change search API to be accessible without being logged in ([Gargron](https://github.com/mastodon/mastodon/pull/18963), [Gargron](https://github.com/mastodon/mastodon/pull/19326))
|
||||||
|
- Change following and followers API to be accessible without being logged in ([Gargron](https://github.com/mastodon/mastodon/pull/18964))
|
||||||
|
- Change `AUTHORIZED_FETCH` to not block unauthenticated REST API access ([Gargron](https://github.com/mastodon/mastodon/pull/19803))
|
||||||
|
- Change Helm configuration ([deepy](https://github.com/mastodon/mastodon/pull/18997), [jgsmith](https://github.com/mastodon/mastodon/pull/18415), [deepy](https://github.com/mastodon/mastodon/pull/18941))
|
||||||
|
- Change mentions of blocked users to not be processed ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19725))
|
||||||
|
- Change max. thumbnail dimensions to 640x360px (360p) ([Gargron](https://github.com/mastodon/mastodon/pull/19619))
|
||||||
|
- Change post-processing to be deferred only for large media types ([Gargron](https://github.com/mastodon/mastodon/pull/19617))
|
||||||
|
- Change link verification to only work for https links without unicode ([Gargron](https://github.com/mastodon/mastodon/pull/20304), [Gargron](https://github.com/mastodon/mastodon/pull/20295))
|
||||||
|
- Change account deletion requests to spread out over time ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20222))
|
||||||
|
- Change larger reblogs/favourites numbers to be shortened in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/20303))
|
||||||
|
- Change incoming activity processing to happen in `ingress` queue ([Gargron](https://github.com/mastodon/mastodon/pull/20264))
|
||||||
|
- Change notifications to not link show preview cards in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20335))
|
||||||
|
- Change amount of replies returned for logged out users in REST API ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20355))
|
||||||
|
- Change in-app links to keep you in-app in web UI ([trwnh](https://github.com/mastodon/mastodon/pull/20540), [Gargron](https://github.com/mastodon/mastodon/pull/20628))
|
||||||
|
- Change table header to be sticky in admin UI ([sk22](https://github.com/mastodon/mastodon/pull/20442))
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Remove setting that disables account deletes ([Gargron](https://github.com/mastodon/mastodon/pull/17683))
|
||||||
|
- Remove digest e-mails ([Gargron](https://github.com/mastodon/mastodon/pull/17985))
|
||||||
|
- Remove unnecessary sections from welcome e-mail ([Gargron](https://github.com/mastodon/mastodon/pull/19299))
|
||||||
|
- Remove item titles from RSS feeds ([Gargron](https://github.com/mastodon/mastodon/pull/18640))
|
||||||
|
- Remove volume number from hashtags in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/19253))
|
||||||
|
- Remove Nanobox configuration ([tonyjiang](https://github.com/mastodon/mastodon/pull/17881))
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix rules with same priority being sorted non-deterministically ([Gargron](https://github.com/mastodon/mastodon/pull/20623))
|
||||||
|
- Fix error when invalid domain name is submitted ([Gargron](https://github.com/mastodon/mastodon/pull/19474))
|
||||||
|
- Fix icons having an image role ([Gargron](https://github.com/mastodon/mastodon/pull/20600))
|
||||||
|
- Fix connections to IPv6-only servers ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20108))
|
||||||
|
- Fix unnecessary service worker registration and preloading when logged out in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20341))
|
||||||
|
- Fix unnecessary and slow regex construction ([raggi](https://github.com/mastodon/mastodon/pull/20215))
|
||||||
|
- Fix `mailers` queue not being used for mailers ([Gargron](https://github.com/mastodon/mastodon/pull/20274))
|
||||||
|
- Fix error in webfinger redirect handling ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20260))
|
||||||
|
- Fix report category not being set to `violation` if rule IDs are provided ([trwnh](https://github.com/mastodon/mastodon/pull/20137))
|
||||||
|
- Fix nodeinfo metadata attribute being an array instead of an object ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20114))
|
||||||
|
- Fix account endorsements not being idempotent ([trwnh](https://github.com/mastodon/mastodon/pull/20118))
|
||||||
|
- Fix status and rule IDs not being strings in admin reports REST API ([trwnh](https://github.com/mastodon/mastodon/pull/20122))
|
||||||
|
- Fix error on invalid `replies_policy` in REST API ([trwnh](https://github.com/mastodon/mastodon/pull/20126))
|
||||||
|
- Fix redrafting a currently-editing post not leaving edit mode in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20023))
|
||||||
|
- Fix performance by avoiding method cache busts ([raggi](https://github.com/mastodon/mastodon/pull/19957))
|
||||||
|
- Fix opening the language picker scrolling the single-column view to the top in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19983))
|
||||||
|
- Fix content warning button missing `aria-expanded` attribute in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19975))
|
||||||
|
- Fix redundant `aria-pressed` attributes in web UI ([Brawaru](https://github.com/mastodon/mastodon/pull/19912))
|
||||||
|
- Fix crash when external auth provider has no display name set ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19962))
|
||||||
|
- Fix followers count not being updated when migrating follows ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19998))
|
||||||
|
- Fix double button to clear emoji search input in web UI ([sunny](https://github.com/mastodon/mastodon/pull/19888))
|
||||||
|
- Fix missing null check on applications on strike disputes ([kescherCode](https://github.com/mastodon/mastodon/pull/19851))
|
||||||
|
- Fix featured tags not saving preferred casing ([Gargron](https://github.com/mastodon/mastodon/pull/19732))
|
||||||
|
- Fix language not being saved when editing status ([Gargron](https://github.com/mastodon/mastodon/pull/19543))
|
||||||
|
- Fix not being able to input featured tag with hash symbol ([Gargron](https://github.com/mastodon/mastodon/pull/19535))
|
||||||
|
- Fix user clean-up scheduler crash when an unconfirmed account has a moderation note ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19629))
|
||||||
|
- Fix being unable to withdraw follow request when confirmation modal is disabled in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19687))
|
||||||
|
- Fix inaccurate admin log entry for re-sending confirmation e-mails ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19674))
|
||||||
|
- Fix edits not being immediately reflected ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19673))
|
||||||
|
- Fix bookmark import stopping at the first failure ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19669))
|
||||||
|
- Fix account action type validation ([Gargron](https://github.com/mastodon/mastodon/pull/19476))
|
||||||
|
- Fix upload progress not communicating processing phase in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/19530))
|
||||||
|
- Fix wrong host being used for custom.css when asset host configured ([Gargron](https://github.com/mastodon/mastodon/pull/19521))
|
||||||
|
- Fix account migration form ever using outdated account data ([Gargron](https://github.com/mastodon/mastodon/pull/18429), [nightpool](https://github.com/mastodon/mastodon/pull/19883))
|
||||||
|
- Fix error when uploading malformed CSV import ([Gargron](https://github.com/mastodon/mastodon/pull/19509))
|
||||||
|
- Fix avatars not using image tags in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/19488))
|
||||||
|
- Fix handling of duplicate and out-of-order notifications in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19693))
|
||||||
|
- Fix reblogs being discarded after the reblogged status ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19731))
|
||||||
|
- Fix indexing scheduler trying to index when Elasticsearch is disabled ([Gargron](https://github.com/mastodon/mastodon/pull/19805))
|
||||||
|
- Fix n+1 queries when rendering initial state JSON ([Gargron](https://github.com/mastodon/mastodon/pull/19795))
|
||||||
|
- Fix n+1 query during status removal ([Gargron](https://github.com/mastodon/mastodon/pull/19753))
|
||||||
|
- Fix OCR not working due to Content Security Policy in web UI ([prplecake](https://github.com/mastodon/mastodon/pull/18817))
|
||||||
|
- Fix `nofollow` rel being removed in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/19455))
|
||||||
|
- Fix language dropdown causing zoom on mobile devices in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/19428))
|
||||||
|
- Fix button to dismiss suggestions not showing up in search results in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19325))
|
||||||
|
- Fix language dropdown sometimes not appearing in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/19246))
|
||||||
|
- Fix quickly switching notification filters resulting in empty or incorrect list in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19052), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/18960))
|
||||||
|
- Fix media modal link button in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18877))
|
||||||
|
- Fix error upon successful account migration ([Gargron](https://github.com/mastodon/mastodon/pull/19386))
|
||||||
|
- Fix negatives values in search index causing queries to fail ([Gargron](https://github.com/mastodon/mastodon/pull/19464), [Gargron](https://github.com/mastodon/mastodon/pull/19481))
|
||||||
|
- Fix error when searching for invalid URL ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18580))
|
||||||
|
- Fix IP blocks not having a unique index ([Gargron](https://github.com/mastodon/mastodon/pull/19456))
|
||||||
|
- Fix remote account in contact account setting not being used ([Gargron](https://github.com/mastodon/mastodon/pull/19351))
|
||||||
|
- Fix swallowing mentions of unconfirmed/unapproved users ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19191))
|
||||||
|
- Fix incorrect and slow cache invalidation when blocking domain and removing media attachments ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19062))
|
||||||
|
- Fix HTTPs redirect behaviour when running as I2P service ([gi-yt](https://github.com/mastodon/mastodon/pull/18929))
|
||||||
|
- Fix deleted pinned posts potentially counting towards the pinned posts limit ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19005))
|
||||||
|
- Fix compatibility with OpenSSL 3.0 ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18449))
|
||||||
|
- Fix error when a remote report includes a private post the server has no access to ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18760))
|
||||||
|
- Fix suspicious sign-in mails never being sent ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18599))
|
||||||
|
- Fix fallback locale when somehow user's locale is an empty string ([tribela](https://github.com/mastodon/mastodon/pull/18543))
|
||||||
|
- Fix avatar/header not being deleted locally when deleted on remote account ([tribela](https://github.com/mastodon/mastodon/pull/18973))
|
||||||
|
- Fix missing `,` in Blurhash validation ([noellabo](https://github.com/mastodon/mastodon/pull/18660))
|
||||||
|
- Fix order by most recent not working for relationships page in admin UI ([tribela](https://github.com/mastodon/mastodon/pull/18996))
|
||||||
|
- Fix uncaught error when invalid date is supplied to API ([Gargron](https://github.com/mastodon/mastodon/pull/19480))
|
||||||
|
- Fix REST API sometimes returning HTML on error ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19135))
|
||||||
|
- Fix ambiguous column names in `tootctl media refresh` ([tribela](https://github.com/mastodon/mastodon/pull/19206))
|
||||||
|
- Fix ambiguous column names in `tootctl search deploy` ([mashirozx](https://github.com/mastodon/mastodon/pull/18993))
|
||||||
|
- Fix `CDN_HOST` not being used in some asset URLs ([tribela](https://github.com/mastodon/mastodon/pull/18662))
|
||||||
|
- Fix `CAS_DISPLAY_NAME`, `SAML_DISPLAY_NAME` and `OIDC_DISPLAY_NAME` being ignored ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18568))
|
||||||
|
- Fix various typos in comments throughout the codebase ([luzpaz](https://github.com/mastodon/mastodon/pull/18604))
|
||||||
|
- Fix CSV import error when rows include unicode characters ([HamptonMakes](https://github.com/mastodon/mastodon/pull/20592))
|
||||||
|
|
||||||
|
### Security
|
||||||
|
|
||||||
|
- Fix being able to spoof link verification ([Gargron](https://github.com/mastodon/mastodon/pull/20217))
|
||||||
|
- Fix emoji substitution not applying only to text nodes in backend code ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20641))
|
||||||
|
- Fix emoji substitution not applying only to text nodes in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20640))
|
||||||
|
- Fix rate limiting for paths with formats ([Gargron](https://github.com/mastodon/mastodon/pull/20675))
|
||||||
|
- Fix out-of-bound reads in blurhash transcoder ([delroth](https://github.com/mastodon/mastodon/pull/20388))
|
||||||
|
|
||||||
|
## [3.5.3] - 2022-05-26
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- **Add language dropdown to compose form in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/18420), [ykzts](https://github.com/mastodon/mastodon/pull/18460))
|
||||||
|
- **Add warning for limited accounts in web UI** ([Gargron](https://github.com/mastodon/mastodon/pull/18344))
|
||||||
|
- Add `limited` attribute to accounts in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/18344))
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- **Change RSS feeds** ([Gargron](https://github.com/mastodon/mastodon/pull/18356), [tribela](https://github.com/mastodon/mastodon/pull/18406))
|
||||||
|
- Titles are now date and time of post
|
||||||
|
- Bodies now render all content faithfully, including polls and emojis
|
||||||
|
- All media attachments are included with Media RSS
|
||||||
|
- Change "dangerous" to "sensitive" in privacy policy and web UI ([Gargron](https://github.com/mastodon/mastodon/pull/18515))
|
||||||
|
- Change unconfirmed accounts to not be visible in REST API ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17530))
|
||||||
|
- Change `tootctl search deploy` to improve performance ([Gargron](https://github.com/mastodon/mastodon/pull/18463), [Gargron](https://github.com/mastodon/mastodon/pull/18514))
|
||||||
|
- Change search indexing to use batches to minimize resource usage ([Gargron](https://github.com/mastodon/mastodon/pull/18451))
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix follower and other counters being able to go negative ([Gargron](https://github.com/mastodon/mastodon/pull/18517))
|
||||||
|
- Fix unnecessary query on when creating a status ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17901))
|
||||||
|
- Fix warning an account outside of a report closing all reports for that account ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18387))
|
||||||
|
- Fix error when resolving a link that redirects to a local post ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18314))
|
||||||
|
- Fix preferred posting language returning unusable value in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/18428))
|
||||||
|
- Fix race condition error when external status is reblogged ([ykzts](https://github.com/mastodon/mastodon/pull/18424))
|
||||||
|
- Fix missing string for appeal validation error ([Gargron](https://github.com/mastodon/mastodon/pull/18410))
|
||||||
|
- Fix block/mute lists showing a follow button in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18364))
|
||||||
|
- Fix Redis configuration not being changed by `mastodon:setup` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18383))
|
||||||
|
- Fix streaming notifications not using quick filter logic in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18316))
|
||||||
|
- Fix ambiguous wording on appeal actions in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18328))
|
||||||
|
- Fix floating action button obscuring last element in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18332))
|
||||||
|
- Fix account warnings not being recorded in audit log ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18338))
|
||||||
|
- Fix leftover icons for direct visibility statuses ([Steffo99](https://github.com/mastodon/mastodon/pull/18305))
|
||||||
|
- Fix link verification requiring case sensitivity on links ([sgolemon](https://github.com/mastodon/mastodon/pull/18320))
|
||||||
|
- Fix embeds not setting their height correctly ([rinsuki](https://github.com/mastodon/mastodon/pull/18301))
|
||||||
|
|
||||||
|
### Security
|
||||||
|
|
||||||
|
- Fix concurrent unfollowing decrementing follower count more than once ([Gargron](https://github.com/mastodon/mastodon/pull/18527))
|
||||||
|
- Fix being able to appeal a strike unlimited times ([Gargron](https://github.com/mastodon/mastodon/pull/18529))
|
||||||
|
- Fix being able to report otherwise inaccessible statuses ([Gargron](https://github.com/mastodon/mastodon/pull/18528))
|
||||||
|
- Fix empty votes arbitrarily increasing voters count in polls ([Gargron](https://github.com/mastodon/mastodon/pull/18526))
|
||||||
|
- Fix moderator identity leak when approving appeal of sensitive marked statuses ([Gargron](https://github.com/mastodon/mastodon/pull/18525))
|
||||||
|
- Fix suspended users being able to access APIs that don't require a user ([Gargron](https://github.com/mastodon/mastodon/pull/18524))
|
||||||
|
- Fix confirmation redirect to app without `Location` header ([Gargron](https://github.com/mastodon/mastodon/pull/18523))
|
||||||
|
|
||||||
|
## [3.5.2] - 2022-05-04
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add warning on direct messages screen in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/18289))
|
||||||
|
- We already had a warning when composing a direct message, it has now been reworded to be more clear
|
||||||
|
- Same warning is now displayed when viewing sent and received direct messages
|
||||||
|
- Add ability to set approval-based registration through tootctl ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18248))
|
||||||
|
- Add pre-filling of domain from search filter in domain allow/block admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18172))
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Change name of “Direct” visibility to “Mentioned people only” in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/18146), [Gargron](https://github.com/mastodon/mastodon/pull/18289), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/18291))
|
||||||
|
- Change trending posts to only show one post from each account ([Gargron](https://github.com/mastodon/mastodon/pull/18181))
|
||||||
|
- Change half-life of trending posts from 6 hours to 2 hours ([Gargron](https://github.com/mastodon/mastodon/pull/18182))
|
||||||
|
- Change full-text search feature to also include polls you have voted in ([tribela](https://github.com/mastodon/mastodon/pull/18070))
|
||||||
|
- Change Redis from using one connection per process, to using a connection pool ([Gargron](https://github.com/mastodon/mastodon/pull/18135), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/18160), [Gargron](https://github.com/mastodon/mastodon/pull/18171))
|
||||||
|
- Different threads no longer have to wait on a mutex over a single connection
|
||||||
|
- However, this does increase the number of Redis connections by a fair amount
|
||||||
|
- We are planning to optimize Redis use so that the pool can be made smaller in the future
|
||||||
|
|
||||||
|
## Removed
|
||||||
|
|
||||||
|
- Remove IP matching from e-mail domain blocks ([Gargron](https://github.com/mastodon/mastodon/pull/18190))
|
||||||
|
- The IPs of the blocked e-mail domain or its MX records are no longer checked
|
||||||
|
- Previously it was too easy to block e-mail providers by mistake
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- Fix compatibility with Friendica's pinned posts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18254), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/18260))
|
||||||
|
- Fix error when looking up handle with surrounding spaces in REST API ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18225))
|
||||||
|
- Fix double render error when authorizing interaction ([Gargron](https://github.com/mastodon/mastodon/pull/18203))
|
||||||
|
- Fix error when a post references an invalid media attachment ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18211))
|
||||||
|
- Fix error when trying to revoke OAuth token without supplying a token ([Gargron](https://github.com/mastodon/mastodon/pull/18205))
|
||||||
|
- Fix error caused by missing subject in Webfinger response ([Gargron](https://github.com/mastodon/mastodon/pull/18204))
|
||||||
|
- Fix error on attempting to delete an account moderation note ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18196))
|
||||||
|
- Fix light-mode emoji borders in web UI ([Gaelan](https://github.com/mastodon/mastodon/pull/18131))
|
||||||
|
- Fix being able to scroll away from the loading bar in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/18170))
|
||||||
|
- Fix error when a bookmark or favorite has been reported and deleted ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18174))
|
||||||
|
- Fix being offered empty “Server rules violation” report option in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18165))
|
||||||
|
- Fix temporary network errors preventing from authorizing interactions with remote accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18161))
|
||||||
|
- Fix incorrect link in "new trending tags" email ([cdzombak](https://github.com/mastodon/mastodon/pull/18156))
|
||||||
|
- Fix missing indexes on some foreign keys ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18157))
|
||||||
|
- Fix n+1 query on feed merge and populate operations ([Gargron](https://github.com/mastodon/mastodon/pull/18111))
|
||||||
|
- Fix feed unmerge worker being exceptionally slow in some conditions ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18110))
|
||||||
|
- Fix PeerTube videos appearing with an erroneous “Edited at” marker ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18100))
|
||||||
|
- Fix instance actor being created incorrectly when running through migrations ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18109))
|
||||||
|
- Fix web push notifications containing HTML entities ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18071))
|
||||||
|
- Fix inconsistent parsing of `TRUSTED_PROXY_IP` ([ykzts](https://github.com/mastodon/mastodon/pull/18051))
|
||||||
|
- Fix error when fetching pinned posts ([tribela](https://github.com/mastodon/mastodon/pull/18030))
|
||||||
|
- Fix wrong optimization in feed populate operation ([dogelover911](https://github.com/mastodon/mastodon/pull/18009))
|
||||||
|
- Fix error in alias settings page ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/18004))
|
||||||
|
|
||||||
|
## [3.5.1] - 2022-04-08
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add pagination for trending statuses in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/17976))
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Change e-mail notifications to only be sent when recipient is offline ([Gargron](https://github.com/mastodon/mastodon/pull/17984))
|
||||||
|
- Send e-mails for mentions and follows by default again
|
||||||
|
- But only when recipient does not have push notifications through an app
|
||||||
|
- Change `website` attribute to be nullable on `Application` entity in REST API ([rinsuki](https://github.com/mastodon/mastodon/pull/17962))
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Remove sign-in token authentication, instead send e-mail about new sign-in ([Gargron](https://github.com/mastodon/mastodon/pull/17970))
|
||||||
|
- You no longer need to enter a security code sent through e-mail
|
||||||
|
- Instead you get an e-mail about a new sign-in from an unfamiliar IP address
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix error responses for `from` search prefix ([single-right-quote](https://github.com/mastodon/mastodon/pull/17963))
|
||||||
|
- Fix dangling language-specific trends ([Gargron](https://github.com/mastodon/mastodon/pull/17997))
|
||||||
|
- Fix extremely rare race condition when deleting a status or account ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17994))
|
||||||
|
- Fix trends returning less results per page when filtered in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/17996))
|
||||||
|
- Fix pagination header on empty trends responses in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/17986))
|
||||||
|
- Fix cookies secure flag being set when served over Tor ([Gargron](https://github.com/mastodon/mastodon/pull/17992))
|
||||||
|
- Fix migration error handling ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17991))
|
||||||
|
- Fix error when re-running some migrations if they get interrupted at the wrong moment ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17989))
|
||||||
|
- Fix potentially missing statuses when reconnecting to streaming API in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17981), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17987), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17980))
|
||||||
|
- Fix error when sending warning emails with custom text ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17983))
|
||||||
|
- Fix unset `SMTP_RETURN_PATH` environment variable causing e-mail not to send ([Gargron](https://github.com/mastodon/mastodon/pull/17982))
|
||||||
|
- Fix possible duplicate statuses in timelines in some edge cases in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17971))
|
||||||
|
- Fix spurious edits and require incoming edits to be explicitly marked as such ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17918))
|
||||||
|
- Fix error when encountering invalid pinned statuses ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17964))
|
||||||
|
- Fix inconsistency in error handling when removing a status ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17974))
|
||||||
|
- Fix admin API unconditionally requiring CSRF token ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17975))
|
||||||
|
- Fix trending tags endpoint missing `offset` param in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/17973))
|
||||||
|
- Fix unusual number formatting in some locales ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17929))
|
||||||
|
- Fix `S3_FORCE_SINGLE_REQUEST` environment variable not working ([HolgerHuo](https://github.com/mastodon/mastodon/pull/17922))
|
||||||
|
- Fix failure to build assets with OpenSSL 3 ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17930))
|
||||||
|
- Fix PWA manifest using outdated routes ([HolgerHuo](https://github.com/mastodon/mastodon/pull/17921))
|
||||||
|
- Fix error when indexing statuses into Elasticsearch ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17912))
|
||||||
|
|
||||||
|
## [3.5.0] - 2022-03-30
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- **Add support for incoming edited posts** ([Gargron](https://github.com/mastodon/mastodon/pull/16697), [Gargron](https://github.com/mastodon/mastodon/pull/17727), [Gargron](https://github.com/mastodon/mastodon/pull/17728), [Gargron](https://github.com/mastodon/mastodon/pull/17320), [Gargron](https://github.com/mastodon/mastodon/pull/17404), [Gargron](https://github.com/mastodon/mastodon/pull/17390), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17335), [Gargron](https://github.com/mastodon/mastodon/pull/17696), [Gargron](https://github.com/mastodon/mastodon/pull/17745), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17740), [Gargron](https://github.com/mastodon/mastodon/pull/17697), [Gargron](https://github.com/mastodon/mastodon/pull/17648), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17531), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17499), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17498), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17380), [Gargron](https://github.com/mastodon/mastodon/pull/17373), [Gargron](https://github.com/mastodon/mastodon/pull/17334), [Gargron](https://github.com/mastodon/mastodon/pull/17333), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17699), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17748))
|
||||||
|
- Previous versions remain available for perusal and comparison
|
||||||
|
- People who reblogged a post are notified when it's edited
|
||||||
|
- New REST APIs:
|
||||||
|
- `PUT /api/v1/statuses/:id`
|
||||||
|
- `GET /api/v1/statuses/:id/history`
|
||||||
|
- `GET /api/v1/statuses/:id/source`
|
||||||
|
- New streaming API event:
|
||||||
|
- `status.update`
|
||||||
|
- **Add appeals for moderator decisions** ([Gargron](https://github.com/mastodon/mastodon/pull/17364), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17725), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17566), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17652), [Gargron](https://github.com/mastodon/mastodon/pull/17616), [Gargron](https://github.com/mastodon/mastodon/pull/17615), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17554), [Gargron](https://github.com/mastodon/mastodon/pull/17523))
|
||||||
|
- All default moderator decisions now notify the affected user by e-mail
|
||||||
|
- They now link to an appeal page instead of suggesting replying to the e-mail
|
||||||
|
- They can now be found in account settings and not just e-mail
|
||||||
|
- Users can submit one appeal within 20 days of the decision
|
||||||
|
- Moderators can approve or reject the appeal
|
||||||
|
- **Add notifications for posts deleted by moderators** ([Gargron](https://github.com/mastodon/mastodon/pull/17204), [Gargron](https://github.com/mastodon/mastodon/pull/17668), [Gargron](https://github.com/mastodon/mastodon/pull/17746), [Gargron](https://github.com/mastodon/mastodon/pull/17679), [Gargron](https://github.com/mastodon/mastodon/pull/17487))
|
||||||
|
- New, redesigned report view in admin UI
|
||||||
|
- Common report actions now only take one click to complete
|
||||||
|
- Deleting posts or marking as sensitive from report now notifies user
|
||||||
|
- Reports can be categorized by reason and specific rules violated
|
||||||
|
- The reasons are automatically cited in the notifications, except for spam
|
||||||
|
- Marking posts as sensitive now federates using post editing
|
||||||
|
- **Add explore page with trending posts and links** ([Gargron](https://github.com/mastodon/mastodon/pull/17123), [Gargron](https://github.com/mastodon/mastodon/pull/17431), [Gargron](https://github.com/mastodon/mastodon/pull/16917), [Gargron](https://github.com/mastodon/mastodon/pull/17677), [Gargron](https://github.com/mastodon/mastodon/pull/16938), [Gargron](https://github.com/mastodon/mastodon/pull/17044), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16978), [Gargron](https://github.com/mastodon/mastodon/pull/16979), [tribela](https://github.com/mastodon/mastodon/pull/17066), [Gargron](https://github.com/mastodon/mastodon/pull/17072), [Gargron](https://github.com/mastodon/mastodon/pull/17403), [noiob](https://github.com/mastodon/mastodon/pull/17624), [mayaeh](https://github.com/mastodon/mastodon/pull/17755), [mayaeh](https://github.com/mastodon/mastodon/pull/17757), [Gargron](https://github.com/mastodon/mastodon/pull/17760), [mayaeh](https://github.com/mastodon/mastodon/pull/17762))
|
||||||
|
- Hashtag trends algorithm is extended to work for posts and links
|
||||||
|
- Links are only considered if they have an adequate preview card
|
||||||
|
- Preview card generation has been improved to support structured data
|
||||||
|
- Links can only trend if the publisher (domain) has been approved
|
||||||
|
- Posts can only trend if the author has been approved
|
||||||
|
- Individual approval and rejection for posts and links is also available
|
||||||
|
- Moderators are notified about pending trends at most once every 2 hours
|
||||||
|
- Posts and link trends are language-specific
|
||||||
|
- Search page is redesigned into explore page in web UI
|
||||||
|
- Discovery tab is coming soon in official iOS and Android apps
|
||||||
|
- New REST APIs:
|
||||||
|
- `GET /api/v1/trends/links`
|
||||||
|
- `GET /api/v1/trends/statuses`
|
||||||
|
- `GET /api/v1/trends/tags` (alias of `GET /api/v1/trends`)
|
||||||
|
- `GET /api/v1/admin/trends/links`
|
||||||
|
- `GET /api/v1/admin/trends/statuses`
|
||||||
|
- `GET /api/v1/admin/trends/tags`
|
||||||
|
- **Add graphs and retention metrics to admin dashboard** ([Gargron](https://github.com/mastodon/mastodon/pull/16829), [Gargron](https://github.com/mastodon/mastodon/pull/17617), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17570), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16910), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16909), [mashirozx](https://github.com/mastodon/mastodon/pull/16884), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16854))
|
||||||
|
- Dashboard shows more numbers with development over time
|
||||||
|
- Other data such as most used interface languages and sign-up sources
|
||||||
|
- User retention graph shows how many new users stick around
|
||||||
|
- New REST APIs:
|
||||||
|
- `POST /api/v1/admin/measures`
|
||||||
|
- `POST /api/v1/admin/dimensions`
|
||||||
|
- `POST /api/v1/admin/retention`
|
||||||
|
- Add `GET /api/v1/accounts/familiar_followers` to REST API ([Gargron](https://github.com/mastodon/mastodon/pull/17700))
|
||||||
|
- Add `POST /api/v1/accounts/:id/remove_from_followers` to REST API ([noellabo](https://github.com/mastodon/mastodon/pull/16864))
|
||||||
|
- Add `category` and `rule_ids` params to `POST /api/v1/reports` IN REST API ([Gargron](https://github.com/mastodon/mastodon/pull/17492), [Gargron](https://github.com/mastodon/mastodon/pull/17682), [Gargron](https://github.com/mastodon/mastodon/pull/17713))
|
||||||
|
- `category` can be one of: `spam`, `violation`, `other` (default)
|
||||||
|
- `rule_ids` must reference `rules` returned in `GET /api/v1/instance`
|
||||||
|
- Add global `lang` param to REST API ([Gargron](https://github.com/mastodon/mastodon/pull/17464), [Gargron](https://github.com/mastodon/mastodon/pull/17592))
|
||||||
|
- Add `types` param to `GET /api/v1/notifications` in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/17767))
|
||||||
|
- **Add notifications for moderators about new sign-ups** ([Gargron](https://github.com/mastodon/mastodon/pull/16953), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17629))
|
||||||
|
- When a new user confirms e-mail, moderators receive a notification
|
||||||
|
- New notification type:
|
||||||
|
- `admin.sign_up`
|
||||||
|
- Add authentication history ([Gargron](https://github.com/mastodon/mastodon/pull/16408), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16428), [baby-gnu](https://github.com/mastodon/mastodon/pull/16654))
|
||||||
|
- Add ability to automatically delete old posts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16529), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17691), [tribela](https://github.com/mastodon/mastodon/pull/16653))
|
||||||
|
- Add ability to pin private posts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16954), [tribela](https://github.com/mastodon/mastodon/pull/17326), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17304), [MitarashiDango](https://github.com/mastodon/mastodon/pull/17647))
|
||||||
|
- Add ability to filter search results by author using `from:` syntax ([tribela](https://github.com/mastodon/mastodon/pull/16526))
|
||||||
|
- Add ability to delete canonical email blocks in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16644))
|
||||||
|
- Add ability to purge undeliverable domains in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16686), [tribela](https://github.com/mastodon/mastodon/pull/17210), [tribela](https://github.com/mastodon/mastodon/pull/17741), [tribela](https://github.com/mastodon/mastodon/pull/17209))
|
||||||
|
- Add ability to disable e-mail token authentication for specific users in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/16427))
|
||||||
|
- **Add ability to suspend accounts in batches in admin UI** ([Gargron](https://github.com/mastodon/mastodon/pull/17009), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17301), [Gargron](https://github.com/mastodon/mastodon/pull/17444))
|
||||||
|
- New, redesigned accounts list in admin UI
|
||||||
|
- Batch suspensions are meant to help clean up spam and bot accounts
|
||||||
|
- They do not generate notifications
|
||||||
|
- Add ability to filter reports by origin of target account in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/16487))
|
||||||
|
- Add support for login through OpenID Connect ([chandrn7](https://github.com/mastodon/mastodon/pull/16221))
|
||||||
|
- Add lazy loading for emoji picker in web UI ([mashirozx](https://github.com/mastodon/mastodon/pull/16907), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17011))
|
||||||
|
- Add single option votes tooltip in polls in web UI ([Brawaru](https://github.com/mastodon/mastodon/pull/16849))
|
||||||
|
- Add confirmation modal when closing media edit modal with unsaved changes in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16518))
|
||||||
|
- Add hint about missing media attachment description in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/17845))
|
||||||
|
- Add support for fetching Create and Announce activities by URI in ActivityPub ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16383))
|
||||||
|
- Add `S3_FORCE_SINGLE_REQUEST` environment variable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16866))
|
||||||
|
- Add `OMNIAUTH_ONLY` environment variable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17288), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17345))
|
||||||
|
- Add `ES_USER` and `ES_PASS` environment variables for Elasticsearch authentication ([tribela](https://github.com/mastodon/mastodon/pull/16890))
|
||||||
|
- Add `CAS_SECURITY_ASSUME_EMAIL_IS_VERIFIED` environment variable ([baby-gnu](https://github.com/mastodon/mastodon/pull/16655))
|
||||||
|
- Add ability to pass specific domains to `tootctl accounts cull` ([tribela](https://github.com/mastodon/mastodon/pull/16511))
|
||||||
|
- Add `--by-uri` option to `tootctl domains purge` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16434))
|
||||||
|
- Add `--batch-size` option to `tootctl search deploy` ([aquarla](https://github.com/mastodon/mastodon/pull/17049))
|
||||||
|
- Add `--remove-orphans` option to `tootctl statuses remove` ([noellabo](https://github.com/mastodon/mastodon/pull/17067))
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Change design of federation pages in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/17704), [noellabo](https://github.com/mastodon/mastodon/pull/17735), [Gargron](https://github.com/mastodon/mastodon/pull/17765))
|
||||||
|
- Change design of account cards in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/17689))
|
||||||
|
- Change `follow` scope to be covered by `read` and `write` scopes in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/17678))
|
||||||
|
- Change design of authorized applications page ([Gargron](https://github.com/mastodon/mastodon/pull/17656), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17686))
|
||||||
|
- Change e-mail domain blocks to block IPs dynamically ([Gargron](https://github.com/mastodon/mastodon/pull/17635), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17650), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17649))
|
||||||
|
- Change report modal to include category selection in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/17565), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17734), [Gargron](https://github.com/mastodon/mastodon/pull/17654), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17632))
|
||||||
|
- Change reblogs to not count towards hashtag trends anymore ([Gargron](https://github.com/mastodon/mastodon/pull/17501))
|
||||||
|
- Change languages to be listed under standard instead of native name in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/17485))
|
||||||
|
- Change routing paths to use usernames in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/16171), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16772), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16773), [mashirozx](https://github.com/mastodon/mastodon/pull/16793), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17060))
|
||||||
|
- Change list title input design in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17092))
|
||||||
|
- Change "Opt-in to profile directory" preference to be general discoverability preference ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16637))
|
||||||
|
- Change API rate limits to use /64 masking on IPv6 addresses ([tribela](https://github.com/mastodon/mastodon/pull/17588), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17600), [zunda](https://github.com/mastodon/mastodon/pull/17590))
|
||||||
|
- Change allowed formats for locally uploaded custom emojis to include GIF ([rgroothuijsen](https://github.com/mastodon/mastodon/pull/17706), [Gargron](https://github.com/mastodon/mastodon/pull/17759))
|
||||||
|
- Change error message when chosen password is too long ([rgroothuijsen](https://github.com/mastodon/mastodon/pull/17082))
|
||||||
|
- Change minimum required Elasticsearch version from 6 to 7 ([noellabo](https://github.com/mastodon/mastodon/pull/16915))
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Remove profile directory link from main navigation panel in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/17688))
|
||||||
|
- **Remove language detection through cld3** ([Gargron](https://github.com/mastodon/mastodon/pull/17478), [ykzts](https://github.com/mastodon/mastodon/pull/17539), [Gargron](https://github.com/mastodon/mastodon/pull/17496), [Gargron](https://github.com/mastodon/mastodon/pull/17722))
|
||||||
|
- cld3 is very inaccurate on short-form content even with unique alphabets
|
||||||
|
- Post language can be overridden individually using `language` param
|
||||||
|
- Otherwise, it defaults to the user's interface language
|
||||||
|
- Remove support for `OAUTH_REDIRECT_AT_SIGN_IN` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17287))
|
||||||
|
- Use `OMNIAUTH_ONLY` instead
|
||||||
|
- Remove Keybase integration ([Gargron](https://github.com/mastodon/mastodon/pull/17045))
|
||||||
|
- Remove old columns and indexes ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17245), [Gargron](https://github.com/mastodon/mastodon/pull/16409), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17191))
|
||||||
|
- Remove shortcodes from newly-created media attachments ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16730), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/16763))
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
|
||||||
|
- `GET /api/v1/trends` → `GET /api/v1/trends/tags`
|
||||||
|
- OAuth `follow` scope → `read` and/or `write`
|
||||||
|
- `text` attribute on `DELETE /api/v1/statuses/:id` → `GET /api/v1/statuses/:id/source`
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix IDN domains not being rendered correctly in a few left-over places ([Gargron](https://github.com/mastodon/mastodon/pull/17848))
|
||||||
|
- Fix Sanskrit translation not being used in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17820))
|
||||||
|
- Fix Kurdish languages having the wrong language codes ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17812))
|
||||||
|
- Fix pghero making database schema suggestions ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17807))
|
||||||
|
- Fix encoding glitch in the OpenGraph description of a profile page ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17821))
|
||||||
|
- Fix web manifest not permitting PWA usage from alternate domains ([HolgerHuo](https://github.com/mastodon/mastodon/pull/16714))
|
||||||
|
- Fix not being able to edit media attachments for scheduled posts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17690))
|
||||||
|
- Fix subscribed relay activities being recorded as boosts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17571))
|
||||||
|
- Fix streaming API server error messages when JSON parsing fails not specifying the source ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17559))
|
||||||
|
- Fix browsers autofilling new password field with old password ([mashirozx](https://github.com/mastodon/mastodon/pull/17702))
|
||||||
|
- Fix text being invisible before fonts load in web UI ([tribela](https://github.com/mastodon/mastodon/pull/16330))
|
||||||
|
- Fix public profile pages of unconfirmed users being accessible ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17385), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17457))
|
||||||
|
- Fix nil error when trying to fetch key for signature verification ([Gargron](https://github.com/mastodon/mastodon/pull/17747))
|
||||||
|
- Fix null values being included in some indexes ([Gargron](https://github.com/mastodon/mastodon/pull/17711))
|
||||||
|
- Fix `POST /api/v1/emails/confirmations` not being available after sign-up ([Gargron](https://github.com/mastodon/mastodon/pull/17743))
|
||||||
|
- Fix rare race condition when reblogged post is deleted ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17693), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17730))
|
||||||
|
- Fix being able to add more than 4 hashtags to hashtag column in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/17729))
|
||||||
|
- Fix data integrity of featured tags ([Gargron](https://github.com/mastodon/mastodon/pull/17712))
|
||||||
|
- Fix performance of account timelines ([Gargron](https://github.com/mastodon/mastodon/pull/17709))
|
||||||
|
- Fix returning empty `<p>` tag for blank account `note` in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/17687))
|
||||||
|
- Fix leak of existence of otherwise inaccessible posts in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/17684))
|
||||||
|
- Fix not showing loading indicator when searching in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/17655))
|
||||||
|
- Fix media modal footer's “external link” not being a link ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17561))
|
||||||
|
- Fix reply button on media modal not giving focus to compose form ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17626))
|
||||||
|
- Fix some media attachments being converted with too high framerates ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17619))
|
||||||
|
- Fix sign in token and warning emails failing to send when contact e-mail address is malformed ([helloworldstack](https://github.com/mastodon/mastodon/pull/17589))
|
||||||
|
- Fix opening the emoji picker scrolling the single-column view to the top ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17579))
|
||||||
|
- Fix edge case where settings/admin page sidebar would be incorrectly hidden ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17580))
|
||||||
|
- Fix performance of server-side filtering ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17575))
|
||||||
|
- Fix privacy policy link not being visible on small screens ([Gargron](https://github.com/mastodon/mastodon/pull/17533))
|
||||||
|
- Fix duplicate accounts when searching by IP range in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/17524), [tribela](https://github.com/mastodon/mastodon/pull/17150))
|
||||||
|
- Fix error when performing a batch action on posts in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17532))
|
||||||
|
- Fix deletes not being signed in authorized fetch mode ([Gargron](https://github.com/mastodon/mastodon/pull/17484))
|
||||||
|
- Fix Undo Announce sometimes inlining the originally Announced status ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17516))
|
||||||
|
- Fix localization of cold-start follow recommendations ([Gargron](https://github.com/mastodon/mastodon/pull/17479), [Gargron](https://github.com/mastodon/mastodon/pull/17486))
|
||||||
|
- Fix replies collection incorrectly looping ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17462))
|
||||||
|
- Fix errors when multiple Delete are received for a given actor ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17460))
|
||||||
|
- Fixed prototype pollution bug and only allow trusted origin ([r0hanSH](https://github.com/mastodon/mastodon/pull/17420))
|
||||||
|
- Fix text being incorrectly pre-selected in composer textarea on /share ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17339))
|
||||||
|
- Fix SMTP_ENABLE_STARTTLS_AUTO/SMTP_TLS/SMTP_SSL environment variables don't work ([kgtkr](https://github.com/mastodon/mastodon/pull/17216))
|
||||||
|
- Fix media upload specific rate limits only being applied to v1 endpoint in REST API ([tribela](https://github.com/mastodon/mastodon/pull/17272))
|
||||||
|
- Fix media descriptions not being used for client-side filtering ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17206))
|
||||||
|
- Fix cold-start follow recommendation favouring older accounts due to wrong sorting ([noellabo](https://github.com/mastodon/mastodon/pull/17126))
|
||||||
|
- Fix not redirect to the right page after authenticating with WebAuthn ([heguro](https://github.com/mastodon/mastodon/pull/17098))
|
||||||
|
- Fix searching for additional hashtags in hashtag column ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17054))
|
||||||
|
- Fix color of hashtag column settings inputs ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17058))
|
||||||
|
- Fix performance of `tootctl statuses remove` ([noellabo](https://github.com/mastodon/mastodon/pull/17052))
|
||||||
|
- Fix `tootctl accounts cull` not excluding domains on timeouts and certificate issues ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16433))
|
||||||
|
- Fix 404 error when filtering admin action logs by non-existent target account ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16643))
|
||||||
|
- Fix error when accessing streaming API without any OAuth scopes ([Brawaru](https://github.com/mastodon/mastodon/pull/16823))
|
||||||
|
- Fix follow request count not updating when new follow requests arrive over streaming API in web UI ([matildepark](https://github.com/mastodon/mastodon/pull/16652))
|
||||||
|
- Fix error when unsuspending a local account ([HolgerHuo](https://github.com/mastodon/mastodon/pull/16605))
|
||||||
|
- Fix crash when a notification contains a not yet processed media attachment in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16573))
|
||||||
|
- Fix wrong color of download button in audio player in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16572))
|
||||||
|
- Fix notes for others accounts not being deleted when an account is deleted ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16579))
|
||||||
|
- Fix error when logging occurrence of unsupported video file ([noellabo](https://github.com/mastodon/mastodon/pull/16581))
|
||||||
|
- Fix wrong elements in trends widget being hidden on smaller screens in web UI ([tribela](https://github.com/mastodon/mastodon/pull/16570))
|
||||||
|
- Fix link to about page being displayed in limited federation mode ([weex](https://github.com/mastodon/mastodon/pull/16432))
|
||||||
|
- Fix styling of boost button in media modal not reflecting ability to boost ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16387))
|
||||||
|
- Fix OCR failure when erroneous lang data is in cache ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16386))
|
||||||
|
- Fix downloading media from blocked domains in `tootctl media refresh` ([tribela](https://github.com/mastodon/mastodon/pull/16914))
|
||||||
|
- Fix login form being displayed on landing page when already logged in ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17348))
|
||||||
|
- Fix polling for media processing status too frequently in web UI ([tribela](https://github.com/mastodon/mastodon/pull/17271))
|
||||||
|
- Fix hashtag autocomplete overriding user-typed case ([weex](https://github.com/mastodon/mastodon/pull/16460))
|
||||||
|
- Fix WebAuthn authentication setup to not prompt for PIN ([truongnmt](https://github.com/mastodon/mastodon/pull/16545))
|
||||||
|
|
||||||
|
### Security
|
||||||
|
|
||||||
|
- Fix being able to post URLs longer than 4096 characters ([Gargron](https://github.com/mastodon/mastodon/pull/17908))
|
||||||
|
- Fix being able to bypass e-mail restrictions ([Gargron](https://github.com/mastodon/mastodon/pull/17909))
|
||||||
|
|
||||||
|
## [3.4.6] - 2022-02-03
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix `mastodon:webpush:generate_vapid_key` task requiring a functional environment ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17338))
|
||||||
|
- Fix spurious errors when receiving an Add activity for a private post ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17425))
|
||||||
|
|
||||||
|
### Security
|
||||||
|
|
||||||
|
- Fix error-prone SQL queries ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/15828))
|
||||||
|
- Fix not compacting incoming signed JSON-LD activities ([puckipedia](https://github.com/mastodon/mastodon/pull/17426), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/17428)) (CVE-2022-24307)
|
||||||
|
- Fix insufficient sanitization of report comments ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17430))
|
||||||
|
- Fix stop condition of a Common Table Expression ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17427))
|
||||||
|
- Disable legacy XSS filtering ([Wonderfall](https://github.com/mastodon/mastodon/pull/17289))
|
||||||
|
|
||||||
|
## [3.4.5] - 2022-01-31
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add more advanced migration tests ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17393))
|
||||||
|
- Add github workflow to build Docker images ([unasuke](https://github.com/mastodon/mastodon/pull/16973), [Gargron](https://github.com/mastodon/mastodon/pull/16980), [Gargron](https://github.com/mastodon/mastodon/pull/17000))
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix some old migrations failing when skipping releases ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17394))
|
||||||
|
- Fix migrations script failing in certain edge cases ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17398))
|
||||||
|
- Fix Docker build ([tribela](https://github.com/mastodon/mastodon/pull/17188))
|
||||||
|
- Fix Ruby 3.0 dependencies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16723))
|
||||||
|
- Fix followers synchronization mechanism ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16510))
|
||||||
|
|
||||||
|
## [3.4.4] - 2021-11-26
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix error when suspending user with an already blocked canonical email ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17036))
|
||||||
|
- Fix overflow of long profile fields in admin UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17010))
|
||||||
|
- Fix confusing error when WebFinger request returns empty document ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16986))
|
||||||
|
- Fix upload of remote media with OpenStack Swift sometimes failing ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16998))
|
||||||
|
- Fix logout link not working in Safari ([noellabo](https://github.com/mastodon/mastodon/pull/16574))
|
||||||
|
- Fix “open” link of media modal not closing modal in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16524))
|
||||||
|
- Fix replying from modal in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16516))
|
||||||
|
- Fix `mastodon:setup` command crashing in some circumstances ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16976))
|
||||||
|
|
||||||
|
### Security
|
||||||
|
|
||||||
|
- Fix filtering DMs from non-followed users ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17042))
|
||||||
|
- Fix handling of recursive toots in WebUI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/17041))
|
||||||
|
|
||||||
## [3.4.3] - 2021-11-06
|
## [3.4.3] - 2021-11-06
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
|
@ -42,7 +638,7 @@ All notable changes to this project will be documented in this file.
|
||||||
- Fix suspended accounts statuses being merged back into timelines ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16628))
|
- Fix suspended accounts statuses being merged back into timelines ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16628))
|
||||||
- Fix crash when encountering invalid account fields ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16598))
|
- Fix crash when encountering invalid account fields ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16598))
|
||||||
- Fix invalid blurhash handling for remote activities ([noellabo](https://github.com/mastodon/mastodon/pull/16583))
|
- Fix invalid blurhash handling for remote activities ([noellabo](https://github.com/mastodon/mastodon/pull/16583))
|
||||||
- Fix newlines being added to accout notes when an account moves ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16415), [noellabo](https://github.com/mastodon/mastodon/pull/16576))
|
- Fix newlines being added to account notes when an account moves ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16415), [noellabo](https://github.com/mastodon/mastodon/pull/16576))
|
||||||
- Fix crash when creating an announcement with links ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16941))
|
- Fix crash when creating an announcement with links ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16941))
|
||||||
- Fix logging out from one browser logging out all other sessions ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16943))
|
- Fix logging out from one browser logging out all other sessions ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/16943))
|
||||||
|
|
||||||
|
@ -375,7 +971,7 @@ All notable changes to this project will be documented in this file.
|
||||||
- Fix inefficiency when fetching bookmarks ([akihikodaki](https://github.com/mastodon/mastodon/pull/14674))
|
- Fix inefficiency when fetching bookmarks ([akihikodaki](https://github.com/mastodon/mastodon/pull/14674))
|
||||||
- Fix inefficiency when fetching favourites ([akihikodaki](https://github.com/mastodon/mastodon/pull/14673))
|
- Fix inefficiency when fetching favourites ([akihikodaki](https://github.com/mastodon/mastodon/pull/14673))
|
||||||
- Fix inefficiency when fetching media-only account timeline ([akihikodaki](https://github.com/mastodon/mastodon/pull/14675))
|
- Fix inefficiency when fetching media-only account timeline ([akihikodaki](https://github.com/mastodon/mastodon/pull/14675))
|
||||||
- Fix inefficieny when deleting accounts ([Gargron](https://github.com/mastodon/mastodon/pull/15387), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15409), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15407), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15408), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15402), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15416), [Gargron](https://github.com/mastodon/mastodon/pull/15421))
|
- Fix inefficiency when deleting accounts ([Gargron](https://github.com/mastodon/mastodon/pull/15387), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15409), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15407), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15408), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15402), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/15416), [Gargron](https://github.com/mastodon/mastodon/pull/15421))
|
||||||
- Fix redundant query when processing batch actions on custom emojis ([niwatori24](https://github.com/mastodon/mastodon/pull/14534))
|
- Fix redundant query when processing batch actions on custom emojis ([niwatori24](https://github.com/mastodon/mastodon/pull/14534))
|
||||||
- Fix slow distinct queries where grouped queries are faster ([Gargron](https://github.com/mastodon/mastodon/pull/15287))
|
- Fix slow distinct queries where grouped queries are faster ([Gargron](https://github.com/mastodon/mastodon/pull/15287))
|
||||||
- Fix performance on instances list in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/15282))
|
- Fix performance on instances list in admin UI ([Gargron](https://github.com/mastodon/mastodon/pull/15282))
|
||||||
|
@ -462,7 +1058,7 @@ All notable changes to this project will be documented in this file.
|
||||||
- Add blurhash to link previews ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13984), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14143), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13985), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/14267), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/14278), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14126), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14261), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14260))
|
- Add blurhash to link previews ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13984), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14143), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13985), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/14267), [Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/14278), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14126), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14261), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14260))
|
||||||
- In web UI, toots cannot be marked as sensitive unless there is media attached
|
- In web UI, toots cannot be marked as sensitive unless there is media attached
|
||||||
- However, it's possible to do via API or ActivityPub
|
- However, it's possible to do via API or ActivityPub
|
||||||
- Thumnails of link previews of such posts now use blurhash in web UI
|
- Thumbnails of link previews of such posts now use blurhash in web UI
|
||||||
- The Card entity in REST API has a new `blurhash` attribute
|
- The Card entity in REST API has a new `blurhash` attribute
|
||||||
- Add support for `summary` field for media description in ActivityPub ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13763))
|
- Add support for `summary` field for media description in ActivityPub ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13763))
|
||||||
- Add hints about incomplete remote content to web UI ([Gargron](https://github.com/mastodon/mastodon/pull/14031), [noellabo](https://github.com/mastodon/mastodon/pull/14195))
|
- Add hints about incomplete remote content to web UI ([Gargron](https://github.com/mastodon/mastodon/pull/14031), [noellabo](https://github.com/mastodon/mastodon/pull/14195))
|
||||||
|
@ -485,7 +1081,7 @@ All notable changes to this project will be documented in this file.
|
||||||
- The `meta` attribute on the Media Attachment entity in REST API can now have a `colors` attribute which in turn contains three hex colors: `background`, `foreground`, and `accent`
|
- The `meta` attribute on the Media Attachment entity in REST API can now have a `colors` attribute which in turn contains three hex colors: `background`, `foreground`, and `accent`
|
||||||
- The background color is chosen from the most dominant color around the edges of the thumbnail
|
- The background color is chosen from the most dominant color around the edges of the thumbnail
|
||||||
- The foreground and accent colors are chosen from the colors that are the most different from the background color using the CIEDE2000 algorithm
|
- The foreground and accent colors are chosen from the colors that are the most different from the background color using the CIEDE2000 algorithm
|
||||||
- The most satured color of the two is designated as the accent color
|
- The most saturated color of the two is designated as the accent color
|
||||||
- The one with the highest W3C contrast is designated as the foreground color
|
- The one with the highest W3C contrast is designated as the foreground color
|
||||||
- If there are not enough colors in the thumbnail, new ones are generated using a monochrome pattern
|
- If there are not enough colors in the thumbnail, new ones are generated using a monochrome pattern
|
||||||
- Add a visibility indicator to toots in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/14123), [highemerly](https://github.com/mastodon/mastodon/pull/14292))
|
- Add a visibility indicator to toots in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/14123), [highemerly](https://github.com/mastodon/mastodon/pull/14292))
|
||||||
|
@ -511,7 +1107,7 @@ All notable changes to this project will be documented in this file.
|
||||||
- Change boost button to no longer serve as visibility indicator in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/14132), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14373))
|
- Change boost button to no longer serve as visibility indicator in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/14132), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14373))
|
||||||
- Change contrast of flash messages ([cchoi12](https://github.com/mastodon/mastodon/pull/13892))
|
- Change contrast of flash messages ([cchoi12](https://github.com/mastodon/mastodon/pull/13892))
|
||||||
- Change wording from "Hide media" to "Hide image/images" in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13834))
|
- Change wording from "Hide media" to "Hide image/images" in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13834))
|
||||||
- Change appearence of settings pages to be more consistent ([ariasuni](https://github.com/mastodon/mastodon/pull/13938))
|
- Change appearance of settings pages to be more consistent ([ariasuni](https://github.com/mastodon/mastodon/pull/13938))
|
||||||
- Change "Add media" tooltip to not include long list of formats in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13954))
|
- Change "Add media" tooltip to not include long list of formats in web UI ([ariasuni](https://github.com/mastodon/mastodon/pull/13954))
|
||||||
- Change how badly contrasting emoji are rendered in web UI ([leo60228](https://github.com/mastodon/mastodon/pull/13773), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13772), [mfmfuyu](https://github.com/mastodon/mastodon/pull/14020), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14015))
|
- Change how badly contrasting emoji are rendered in web UI ([leo60228](https://github.com/mastodon/mastodon/pull/13773), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13772), [mfmfuyu](https://github.com/mastodon/mastodon/pull/14020), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14015))
|
||||||
- Change structure of unavailable content section on about page ([ariasuni](https://github.com/mastodon/mastodon/pull/13930))
|
- Change structure of unavailable content section on about page ([ariasuni](https://github.com/mastodon/mastodon/pull/13930))
|
||||||
|
@ -527,14 +1123,14 @@ All notable changes to this project will be documented in this file.
|
||||||
- `EMAIL_DOMAIN_WHITELIST` → `EMAIL_DOMAIN_ALLOWLIST`
|
- `EMAIL_DOMAIN_WHITELIST` → `EMAIL_DOMAIN_ALLOWLIST`
|
||||||
- CLI option changed:
|
- CLI option changed:
|
||||||
- `tootctl domains purge --whitelist-mode` → `tootctl domains purge --limited-federation-mode`
|
- `tootctl domains purge --whitelist-mode` → `tootctl domains purge --limited-federation-mode`
|
||||||
- Remove some unnecessary database indices ([lfuelling](https://github.com/mastodon/mastodon/pull/13695), [noellabo](https://github.com/mastodon/mastodon/pull/14259))
|
- Remove some unnecessary database indexes ([lfuelling](https://github.com/mastodon/mastodon/pull/13695), [noellabo](https://github.com/mastodon/mastodon/pull/14259))
|
||||||
- Remove unnecessary Node.js version upper bound ([ykzts](https://github.com/mastodon/mastodon/pull/14139))
|
- Remove unnecessary Node.js version upper bound ([ykzts](https://github.com/mastodon/mastodon/pull/14139))
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- Fix `following` param not working when exact match is found in account search ([noellabo](https://github.com/mastodon/mastodon/pull/14394))
|
- Fix `following` param not working when exact match is found in account search ([noellabo](https://github.com/mastodon/mastodon/pull/14394))
|
||||||
- Fix sometimes occuring duplicate mention notifications ([noellabo](https://github.com/mastodon/mastodon/pull/14378))
|
- Fix sometimes occurring duplicate mention notifications ([noellabo](https://github.com/mastodon/mastodon/pull/14378))
|
||||||
- Fix RSS feeds not being cachable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14368))
|
- Fix RSS feeds not being cacheable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14368))
|
||||||
- Fix lack of locking around processing of Announce activities in ActivityPub ([noellabo](https://github.com/mastodon/mastodon/pull/14365))
|
- Fix lack of locking around processing of Announce activities in ActivityPub ([noellabo](https://github.com/mastodon/mastodon/pull/14365))
|
||||||
- Fix boosted toots from blocked account not being retroactively removed from TL ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14339))
|
- Fix boosted toots from blocked account not being retroactively removed from TL ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14339))
|
||||||
- Fix large shortened numbers (like 1.2K) using incorrect pluralization ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/14061))
|
- Fix large shortened numbers (like 1.2K) using incorrect pluralization ([Sasha-Sorokin](https://github.com/mastodon/mastodon/pull/14061))
|
||||||
|
@ -546,7 +1142,7 @@ All notable changes to this project will be documented in this file.
|
||||||
- Fix new posts pushing down origin of opened dropdown in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14271), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14348))
|
- Fix new posts pushing down origin of opened dropdown in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/14271), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14348))
|
||||||
- Fix timeline markers not being saved sometimes ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13887), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13889), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14155))
|
- Fix timeline markers not being saved sometimes ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13887), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13889), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/14155))
|
||||||
- Fix CSV uploads being rejected ([noellabo](https://github.com/mastodon/mastodon/pull/13835))
|
- Fix CSV uploads being rejected ([noellabo](https://github.com/mastodon/mastodon/pull/13835))
|
||||||
- Fix incompatibility with ElasticSearch 7.x ([noellabo](https://github.com/mastodon/mastodon/pull/13828))
|
- Fix incompatibility with Elasticsearch 7.x ([noellabo](https://github.com/mastodon/mastodon/pull/13828))
|
||||||
- Fix being able to search posts where you're in the target audience but not actively mentioned ([noellabo](https://github.com/mastodon/mastodon/pull/13829))
|
- Fix being able to search posts where you're in the target audience but not actively mentioned ([noellabo](https://github.com/mastodon/mastodon/pull/13829))
|
||||||
- Fix non-local posts appearing on local-only hashtag timelines in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/13827))
|
- Fix non-local posts appearing on local-only hashtag timelines in web UI ([noellabo](https://github.com/mastodon/mastodon/pull/13827))
|
||||||
- Fix `tootctl media remove-orphans` choking on unknown files in storage ([Gargron](https://github.com/mastodon/mastodon/pull/13765))
|
- Fix `tootctl media remove-orphans` choking on unknown files in storage ([Gargron](https://github.com/mastodon/mastodon/pull/13765))
|
||||||
|
@ -661,7 +1257,7 @@ All notable changes to this project will be documented in this file.
|
||||||
- Fix poll refresh button not being debounced in web UI ([rasjonell](https://github.com/mastodon/mastodon/pull/13485), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13490))
|
- Fix poll refresh button not being debounced in web UI ([rasjonell](https://github.com/mastodon/mastodon/pull/13485), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/13490))
|
||||||
- Fix confusing error when failing to add an alias to an unknown account ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13480))
|
- Fix confusing error when failing to add an alias to an unknown account ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13480))
|
||||||
- Fix "Email changed" notification sometimes having wrong e-mail ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13475))
|
- Fix "Email changed" notification sometimes having wrong e-mail ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13475))
|
||||||
- Fix varioues issues on the account aliases page ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13452))
|
- Fix various issues on the account aliases page ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13452))
|
||||||
- Fix API footer link in web UI ([bubblineyuri](https://github.com/mastodon/mastodon/pull/13441))
|
- Fix API footer link in web UI ([bubblineyuri](https://github.com/mastodon/mastodon/pull/13441))
|
||||||
- Fix pagination of following, followers, follow requests, blocks and mutes lists in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13445))
|
- Fix pagination of following, followers, follow requests, blocks and mutes lists in web UI ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13445))
|
||||||
- Fix styling of polls in JS-less fallback on public pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13436))
|
- Fix styling of polls in JS-less fallback on public pages ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/13436))
|
||||||
|
@ -1150,7 +1746,7 @@ All notable changes to this project will be documented in this file.
|
||||||
- Fix URLs appearing twice in errors of ActivityPub::DeliveryWorker ([Gargron](https://github.com/mastodon/mastodon/pull/11231))
|
- Fix URLs appearing twice in errors of ActivityPub::DeliveryWorker ([Gargron](https://github.com/mastodon/mastodon/pull/11231))
|
||||||
- Fix support for HTTP proxies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11245))
|
- Fix support for HTTP proxies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11245))
|
||||||
- Fix HTTP requests to IPv6 hosts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11240))
|
- Fix HTTP requests to IPv6 hosts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/11240))
|
||||||
- Fix error in ElasticSearch index import ([mayaeh](https://github.com/mastodon/mastodon/pull/11192))
|
- Fix error in Elasticsearch index import ([mayaeh](https://github.com/mastodon/mastodon/pull/11192))
|
||||||
- Fix duplicate account error when seeding development database ([ysksn](https://github.com/mastodon/mastodon/pull/11366))
|
- Fix duplicate account error when seeding development database ([ysksn](https://github.com/mastodon/mastodon/pull/11366))
|
||||||
- Fix performance of session clean-up scheduler ([abcang](https://github.com/mastodon/mastodon/pull/11871))
|
- Fix performance of session clean-up scheduler ([abcang](https://github.com/mastodon/mastodon/pull/11871))
|
||||||
- Fix older migrations not running ([zunda](https://github.com/mastodon/mastodon/pull/11377))
|
- Fix older migrations not running ([zunda](https://github.com/mastodon/mastodon/pull/11377))
|
||||||
|
@ -1160,8 +1756,8 @@ All notable changes to this project will be documented in this file.
|
||||||
- Fix muted text color not applying to all text ([trwnh](https://github.com/mastodon/mastodon/pull/11996))
|
- Fix muted text color not applying to all text ([trwnh](https://github.com/mastodon/mastodon/pull/11996))
|
||||||
- Fix follower/following lists resetting on back-navigation in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11986))
|
- Fix follower/following lists resetting on back-navigation in web UI ([Gargron](https://github.com/mastodon/mastodon/pull/11986))
|
||||||
- Fix n+1 query when approving multiple follow requests ([abcang](https://github.com/mastodon/mastodon/pull/12004))
|
- Fix n+1 query when approving multiple follow requests ([abcang](https://github.com/mastodon/mastodon/pull/12004))
|
||||||
- Fix records not being indexed into ElasticSearch sometimes ([Gargron](https://github.com/mastodon/mastodon/pull/12024))
|
- Fix records not being indexed into Elasticsearch sometimes ([Gargron](https://github.com/mastodon/mastodon/pull/12024))
|
||||||
- Fix needlessly indexing unsearchable statuses into ElasticSearch ([Gargron](https://github.com/mastodon/mastodon/pull/12041))
|
- Fix needlessly indexing unsearchable statuses into Elasticsearch ([Gargron](https://github.com/mastodon/mastodon/pull/12041))
|
||||||
- Fix new user bootstrapping crashing when to-be-followed accounts are invalid ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12037))
|
- Fix new user bootstrapping crashing when to-be-followed accounts are invalid ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/12037))
|
||||||
- Fix featured hashtag URL being interpreted as media or replies tab ([Gargron](https://github.com/mastodon/mastodon/pull/12048))
|
- Fix featured hashtag URL being interpreted as media or replies tab ([Gargron](https://github.com/mastodon/mastodon/pull/12048))
|
||||||
- Fix account counters being overwritten by parallel writes ([Gargron](https://github.com/mastodon/mastodon/pull/12045))
|
- Fix account counters being overwritten by parallel writes ([Gargron](https://github.com/mastodon/mastodon/pull/12045))
|
||||||
|
@ -1451,7 +2047,7 @@ All notable changes to this project will be documented in this file.
|
||||||
- Change Docker image to use Ubuntu with jemalloc ([Sir-Boops](https://github.com/mastodon/mastodon/pull/10100), [BenLubar](https://github.com/mastodon/mastodon/pull/10212))
|
- Change Docker image to use Ubuntu with jemalloc ([Sir-Boops](https://github.com/mastodon/mastodon/pull/10100), [BenLubar](https://github.com/mastodon/mastodon/pull/10212))
|
||||||
- Change public pages to be cacheable by proxies ([BenLubar](https://github.com/mastodon/mastodon/pull/9059))
|
- Change public pages to be cacheable by proxies ([BenLubar](https://github.com/mastodon/mastodon/pull/9059))
|
||||||
- Change the 410 gone response for suspended accounts to be cacheable by proxies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10339))
|
- Change the 410 gone response for suspended accounts to be cacheable by proxies ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10339))
|
||||||
- Change web UI to not not empty timeline of blocked users on block ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10359))
|
- Change web UI to not empty timeline of blocked users on block ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/10359))
|
||||||
- Change JSON serializer to remove unused `@context` values ([Gargron](https://github.com/mastodon/mastodon/pull/10378))
|
- Change JSON serializer to remove unused `@context` values ([Gargron](https://github.com/mastodon/mastodon/pull/10378))
|
||||||
- Change GIFV file size limit to be the same as for other videos ([rinsuki](https://github.com/mastodon/mastodon/pull/9924))
|
- Change GIFV file size limit to be the same as for other videos ([rinsuki](https://github.com/mastodon/mastodon/pull/9924))
|
||||||
- Change Webpack to not use @babel/preset-env to compile node_modules ([ykzts](https://github.com/mastodon/mastodon/pull/10289))
|
- Change Webpack to not use @babel/preset-env to compile node_modules ([ykzts](https://github.com/mastodon/mastodon/pull/10289))
|
||||||
|
@ -1628,7 +2224,7 @@ All notable changes to this project will be documented in this file.
|
||||||
- Limit maximum visibility of local silenced users to unlisted ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9583))
|
- Limit maximum visibility of local silenced users to unlisted ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9583))
|
||||||
- Change API error message for unconfirmed accounts ([noellabo](https://github.com/mastodon/mastodon/pull/9625))
|
- Change API error message for unconfirmed accounts ([noellabo](https://github.com/mastodon/mastodon/pull/9625))
|
||||||
- Change the icon to "reply-all" when it's a reply to other accounts ([mayaeh](https://github.com/mastodon/mastodon/pull/9378))
|
- Change the icon to "reply-all" when it's a reply to other accounts ([mayaeh](https://github.com/mastodon/mastodon/pull/9378))
|
||||||
- Do not ignore federated reports targetting already-reported accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9534))
|
- Do not ignore federated reports targeting already-reported accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/9534))
|
||||||
- Upgrade default Ruby version to 2.6.0 ([Gargron](https://github.com/mastodon/mastodon/pull/9688))
|
- Upgrade default Ruby version to 2.6.0 ([Gargron](https://github.com/mastodon/mastodon/pull/9688))
|
||||||
- Change e-mail digest frequency ([Gargron](https://github.com/mastodon/mastodon/pull/9689))
|
- Change e-mail digest frequency ([Gargron](https://github.com/mastodon/mastodon/pull/9689))
|
||||||
- Change Docker images for Tor support in docker-compose.yml ([Sir-Boops](https://github.com/mastodon/mastodon/pull/9438))
|
- Change Docker images for Tor support in docker-compose.yml ([Sir-Boops](https://github.com/mastodon/mastodon/pull/9438))
|
||||||
|
|
|
@ -40,7 +40,7 @@ Project maintainers who do not follow or enforce the Code of Conduct in good fai
|
||||||
|
|
||||||
## Attribution
|
## Attribution
|
||||||
|
|
||||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [https://contributor-covenant.org/version/1/4][version]
|
||||||
|
|
||||||
[homepage]: http://contributor-covenant.org
|
[homepage]: https://contributor-covenant.org
|
||||||
[version]: http://contributor-covenant.org/version/1/4/
|
[version]: https://contributor-covenant.org/version/1/4/
|
||||||
|
|
|
@ -42,6 +42,8 @@ It is not always possible to phrase every change in such a manner, but it is des
|
||||||
- Code style rules (rubocop, eslint)
|
- Code style rules (rubocop, eslint)
|
||||||
- Normalization of locale files (i18n-tasks)
|
- Normalization of locale files (i18n-tasks)
|
||||||
|
|
||||||
|
**Note**: You may need to log in and authorise the GitHub account your fork of this repository belongs to with CircleCI to enable some of the automated checks to run.
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
The [Mastodon documentation](https://docs.joinmastodon.org) is a statically generated site. You can [submit merge requests to mastodon/documentation](https://github.com/mastodon/documentation).
|
The [Mastodon documentation](https://docs.joinmastodon.org) is a statically generated site. You can [submit merge requests to mastodon/documentation](https://github.com/mastodon/documentation).
|
||||||
|
|
170
Dockerfile
170
Dockerfile
|
@ -1,121 +1,99 @@
|
||||||
FROM ubuntu:20.04 as build-dep
|
# syntax=docker/dockerfile:1.4
|
||||||
|
# This needs to be bullseye-slim because the Ruby image is built on bullseye-slim
|
||||||
|
ARG NODE_VERSION="16.18.1-bullseye-slim"
|
||||||
|
|
||||||
# Use bash for the shell
|
FROM ghcr.io/moritzheiber/ruby-jemalloc:3.0.4-slim as ruby
|
||||||
SHELL ["/bin/bash", "-c"]
|
FROM node:${NODE_VERSION} as build
|
||||||
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
|
|
||||||
|
|
||||||
# Install Node v16 (LTS)
|
COPY --link --from=ruby /opt/ruby /opt/ruby
|
||||||
ENV NODE_VER="16.13.0"
|
|
||||||
RUN ARCH= && \
|
|
||||||
dpkgArch="$(dpkg --print-architecture)" && \
|
|
||||||
case "${dpkgArch##*-}" in \
|
|
||||||
amd64) ARCH='x64';; \
|
|
||||||
ppc64el) ARCH='ppc64le';; \
|
|
||||||
s390x) ARCH='s390x';; \
|
|
||||||
arm64) ARCH='arm64';; \
|
|
||||||
armhf) ARCH='armv7l';; \
|
|
||||||
i386) ARCH='x86';; \
|
|
||||||
*) echo "unsupported architecture"; exit 1 ;; \
|
|
||||||
esac && \
|
|
||||||
echo "Etc/UTC" > /etc/localtime && \
|
|
||||||
apt-get update && \
|
|
||||||
apt-get install -y --no-install-recommends ca-certificates wget python apt-utils && \
|
|
||||||
cd ~ && \
|
|
||||||
wget -q https://nodejs.org/download/release/v$NODE_VER/node-v$NODE_VER-linux-$ARCH.tar.gz && \
|
|
||||||
tar xf node-v$NODE_VER-linux-$ARCH.tar.gz && \
|
|
||||||
rm node-v$NODE_VER-linux-$ARCH.tar.gz && \
|
|
||||||
mv node-v$NODE_VER-linux-$ARCH /opt/node
|
|
||||||
|
|
||||||
# Install Ruby 3.0
|
ENV DEBIAN_FRONTEND="noninteractive" \
|
||||||
ENV RUBY_VER="3.0.3"
|
PATH="${PATH}:/opt/ruby/bin"
|
||||||
RUN apt-get update && \
|
|
||||||
apt-get install -y --no-install-recommends build-essential \
|
|
||||||
bison libyaml-dev libgdbm-dev libreadline-dev libjemalloc-dev \
|
|
||||||
libncurses5-dev libffi-dev zlib1g-dev libssl-dev && \
|
|
||||||
cd ~ && \
|
|
||||||
wget https://cache.ruby-lang.org/pub/ruby/${RUBY_VER%.*}/ruby-$RUBY_VER.tar.gz && \
|
|
||||||
tar xf ruby-$RUBY_VER.tar.gz && \
|
|
||||||
cd ruby-$RUBY_VER && \
|
|
||||||
./configure --prefix=/opt/ruby \
|
|
||||||
--with-jemalloc \
|
|
||||||
--with-shared \
|
|
||||||
--disable-install-doc && \
|
|
||||||
make -j"$(nproc)" > /dev/null && \
|
|
||||||
make install && \
|
|
||||||
rm -rf ../ruby-$RUBY_VER.tar.gz ../ruby-$RUBY_VER
|
|
||||||
|
|
||||||
ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin"
|
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||||||
|
|
||||||
RUN npm install -g npm@latest && \
|
|
||||||
npm install -g yarn && \
|
|
||||||
gem install bundler && \
|
|
||||||
apt-get update && \
|
|
||||||
apt-get install -y --no-install-recommends git libicu-dev libidn11-dev \
|
|
||||||
libpq-dev libprotobuf-dev protobuf-compiler shared-mime-info
|
|
||||||
|
|
||||||
|
WORKDIR /opt/mastodon
|
||||||
COPY Gemfile* package.json yarn.lock /opt/mastodon/
|
COPY Gemfile* package.json yarn.lock /opt/mastodon/
|
||||||
|
|
||||||
RUN cd /opt/mastodon && \
|
# hadolint ignore=DL3008
|
||||||
bundle config set --local deployment 'true' && \
|
RUN apt-get update && \
|
||||||
bundle config set --local without 'development test' && \
|
apt-get install -y --no-install-recommends build-essential \
|
||||||
bundle config set silence_root_warning true && \
|
ca-certificates \
|
||||||
bundle install -j"$(nproc)" && \
|
git \
|
||||||
yarn install --pure-lockfile
|
libicu-dev \
|
||||||
|
libidn11-dev \
|
||||||
|
libpq-dev \
|
||||||
|
libjemalloc-dev \
|
||||||
|
zlib1g-dev \
|
||||||
|
libgdbm-dev \
|
||||||
|
libgmp-dev \
|
||||||
|
libssl-dev \
|
||||||
|
libyaml-0-2 \
|
||||||
|
ca-certificates \
|
||||||
|
libreadline8 \
|
||||||
|
python3 \
|
||||||
|
shared-mime-info && \
|
||||||
|
bundle config set --local deployment 'true' && \
|
||||||
|
bundle config set --local without 'development test' && \
|
||||||
|
bundle config set silence_root_warning true && \
|
||||||
|
bundle install -j"$(nproc)" && \
|
||||||
|
yarn install --pure-lockfile --network-timeout 600000
|
||||||
|
|
||||||
FROM ubuntu:20.04
|
FROM node:${NODE_VERSION}
|
||||||
|
|
||||||
# Copy over all the langs needed for runtime
|
ARG UID="991"
|
||||||
COPY --from=build-dep /opt/node /opt/node
|
ARG GID="991"
|
||||||
COPY --from=build-dep /opt/ruby /opt/ruby
|
|
||||||
|
|
||||||
# Add more PATHs to the PATH
|
COPY --link --from=ruby /opt/ruby /opt/ruby
|
||||||
ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin:/opt/mastodon/bin"
|
|
||||||
|
|
||||||
# Create the mastodon user
|
|
||||||
ARG UID=991
|
|
||||||
ARG GID=991
|
|
||||||
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||||||
RUN apt-get update && \
|
|
||||||
echo "Etc/UTC" > /etc/localtime && \
|
|
||||||
apt-get install -y --no-install-recommends whois wget && \
|
|
||||||
addgroup --gid $GID mastodon && \
|
|
||||||
useradd -m -u $UID -g $GID -d /opt/mastodon mastodon && \
|
|
||||||
echo "mastodon:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 24 | mkpasswd -s -m sha-256)" | chpasswd && \
|
|
||||||
rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Install mastodon runtime deps
|
ENV DEBIAN_FRONTEND="noninteractive" \
|
||||||
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
|
PATH="${PATH}:/opt/ruby/bin:/opt/mastodon/bin"
|
||||||
RUN apt-get update && \
|
|
||||||
apt-get -y --no-install-recommends install \
|
# Ignoreing these here since we don't want to pin any versions and the Debian image removes apt-get content after use
|
||||||
libssl1.1 libpq5 imagemagick ffmpeg libjemalloc2 \
|
# hadolint ignore=DL3008,DL3009
|
||||||
libicu66 libprotobuf17 libidn11 libyaml-0-2 \
|
RUN apt-get update && \
|
||||||
file ca-certificates tzdata libreadline8 gcc tini apt-utils && \
|
echo "Etc/UTC" > /etc/localtime && \
|
||||||
ln -s /opt/mastodon /mastodon && \
|
groupadd -g "${GID}" mastodon && \
|
||||||
gem install bundler && \
|
useradd -l -u "$UID" -g "${GID}" -m -d /opt/mastodon mastodon && \
|
||||||
rm -rf /var/cache && \
|
apt-get -y --no-install-recommends install whois \
|
||||||
rm -rf /var/lib/apt/lists/*
|
wget \
|
||||||
|
procps \
|
||||||
|
libssl1.1 \
|
||||||
|
libpq5 \
|
||||||
|
imagemagick \
|
||||||
|
ffmpeg \
|
||||||
|
libjemalloc2 \
|
||||||
|
libicu67 \
|
||||||
|
libidn11 \
|
||||||
|
libyaml-0-2 \
|
||||||
|
file \
|
||||||
|
ca-certificates \
|
||||||
|
tzdata \
|
||||||
|
libreadline8 \
|
||||||
|
tini && \
|
||||||
|
ln -s /opt/mastodon /mastodon
|
||||||
|
|
||||||
|
# Note: no, cleaning here since Debian does this automatically
|
||||||
|
# See the file /etc/apt/apt.conf.d/docker-clean within the Docker image's filesystem
|
||||||
|
|
||||||
# Copy over mastodon source, and dependencies from building, and set permissions
|
|
||||||
COPY --chown=mastodon:mastodon . /opt/mastodon
|
COPY --chown=mastodon:mastodon . /opt/mastodon
|
||||||
COPY --from=build-dep --chown=mastodon:mastodon /opt/mastodon /opt/mastodon
|
COPY --chown=mastodon:mastodon --from=build /opt/mastodon /opt/mastodon
|
||||||
|
|
||||||
# Run mastodon services in prod mode
|
ENV RAILS_ENV="production" \
|
||||||
ENV RAILS_ENV="production"
|
NODE_ENV="production" \
|
||||||
ENV NODE_ENV="production"
|
RAILS_SERVE_STATIC_FILES="true" \
|
||||||
|
BIND="0.0.0.0"
|
||||||
# Tell rails to serve static files
|
|
||||||
ENV RAILS_SERVE_STATIC_FILES="true"
|
|
||||||
ENV BIND="0.0.0.0"
|
|
||||||
|
|
||||||
# Set the run user
|
# Set the run user
|
||||||
USER mastodon
|
USER mastodon
|
||||||
|
WORKDIR /opt/mastodon
|
||||||
|
|
||||||
# Precompile assets
|
# Precompile assets
|
||||||
RUN cd ~ && \
|
RUN OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder rails assets:precompile && \
|
||||||
OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder rails assets:precompile && \
|
yarn cache clean
|
||||||
yarn cache clean
|
|
||||||
|
|
||||||
# Set the work dir and the container entry point
|
# Set the work dir and the container entry point
|
||||||
WORKDIR /opt/mastodon
|
|
||||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
ENTRYPOINT ["/usr/bin/tini", "--"]
|
||||||
EXPOSE 3000 4000
|
EXPOSE 3000 4000
|
||||||
|
|
105
Gemfile
105
Gemfile
|
@ -1,37 +1,35 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
ruby '>= 2.5.0', '< 3.1.0'
|
ruby '>= 2.7.0', '< 3.1.0'
|
||||||
|
|
||||||
gem 'pkg-config', '~> 1.4'
|
gem 'pkg-config', '~> 1.5'
|
||||||
gem 'rexml', '~> 3.2'
|
gem 'rexml', '~> 3.2'
|
||||||
|
|
||||||
gem 'puma', '~> 5.5'
|
gem 'puma', '~> 5.6'
|
||||||
gem 'rails', '~> 6.1.4'
|
gem 'rails', '~> 6.1.7'
|
||||||
gem 'sprockets', '~> 3.7.2'
|
gem 'sprockets', '~> 3.7.2'
|
||||||
gem 'thor', '~> 1.1'
|
gem 'thor', '~> 1.2'
|
||||||
gem 'rack', '~> 2.2.3'
|
gem 'rack', '~> 2.2.4'
|
||||||
|
|
||||||
gem 'hamlit-rails', '~> 0.2'
|
gem 'hamlit-rails', '~> 0.2'
|
||||||
gem 'pg', '~> 1.2'
|
gem 'pg', '~> 1.4'
|
||||||
gem 'makara', '~> 0.5'
|
gem 'makara', '~> 0.5'
|
||||||
gem 'pghero', '~> 2.8'
|
gem 'pghero', '~> 2.8'
|
||||||
gem 'dotenv-rails', '~> 2.7'
|
gem 'dotenv-rails', '~> 2.8'
|
||||||
|
|
||||||
gem 'aws-sdk-s3', '~> 1.109', require: false
|
gem 'aws-sdk-s3', '~> 1.117', require: false
|
||||||
gem 'fog-core', '<= 2.1.0'
|
gem 'fog-core', '<= 2.4.0'
|
||||||
gem 'fog-openstack', '~> 0.3', require: false
|
gem 'fog-openstack', '~> 0.3', require: false
|
||||||
gem 'kt-paperclip', '~> 7.0'
|
gem 'kt-paperclip', '~> 7.1'
|
||||||
gem 'blurhash', '~> 0.1'
|
gem 'blurhash', '~> 0.1'
|
||||||
|
|
||||||
gem 'active_model_serializers', '~> 0.10'
|
gem 'active_model_serializers', '~> 0.10'
|
||||||
gem 'addressable', '~> 2.8'
|
gem 'addressable', '~> 2.8'
|
||||||
gem 'bootsnap', '~> 1.9.2', require: false
|
gem 'bootsnap', '~> 1.15.0', require: false
|
||||||
gem 'browser'
|
gem 'browser'
|
||||||
gem 'charlock_holmes', '~> 0.7.7'
|
gem 'charlock_holmes', '~> 0.7.7'
|
||||||
gem 'iso-639'
|
|
||||||
gem 'chewy', '~> 7.2'
|
gem 'chewy', '~> 7.2'
|
||||||
gem 'cld3', '~> 3.4.3'
|
|
||||||
gem 'devise', '~> 4.8'
|
gem 'devise', '~> 4.8'
|
||||||
gem 'devise-two-factor', '~> 4.0'
|
gem 'devise-two-factor', '~> 4.0'
|
||||||
|
|
||||||
|
@ -42,70 +40,77 @@ end
|
||||||
gem 'net-ldap', '~> 0.17'
|
gem 'net-ldap', '~> 0.17'
|
||||||
gem 'omniauth-cas', '~> 2.0'
|
gem 'omniauth-cas', '~> 2.0'
|
||||||
gem 'omniauth-saml', '~> 1.10'
|
gem 'omniauth-saml', '~> 1.10'
|
||||||
|
gem 'gitlab-omniauth-openid-connect', '~>0.10.0', require: 'omniauth_openid_connect'
|
||||||
gem 'omniauth', '~> 1.9'
|
gem 'omniauth', '~> 1.9'
|
||||||
gem 'omniauth-rails_csrf_protection', '~> 0.1'
|
gem 'omniauth-rails_csrf_protection', '~> 0.1'
|
||||||
|
|
||||||
gem 'color_diff', '~> 0.1'
|
gem 'color_diff', '~> 0.1'
|
||||||
gem 'discard', '~> 1.2'
|
gem 'discard', '~> 1.2'
|
||||||
gem 'doorkeeper', '~> 5.5'
|
gem 'doorkeeper', '~> 5.6'
|
||||||
gem 'ed25519', '~> 1.2'
|
gem 'ed25519', '~> 1.3'
|
||||||
gem 'fast_blank', '~> 1.0'
|
gem 'fast_blank', '~> 1.0'
|
||||||
gem 'fastimage'
|
gem 'fastimage'
|
||||||
gem 'hiredis', '~> 0.6'
|
gem 'hiredis', '~> 0.6'
|
||||||
gem 'redis-namespace', '~> 1.8'
|
gem 'redis-namespace', '~> 1.9'
|
||||||
gem 'htmlentities', '~> 4.3'
|
gem 'htmlentities', '~> 4.3'
|
||||||
gem 'http', '~> 5.0'
|
gem 'http', '~> 5.1'
|
||||||
gem 'http_accept_language', '~> 2.1'
|
gem 'http_accept_language', '~> 2.1'
|
||||||
gem 'httplog', '~> 1.5.0'
|
gem 'httplog', '~> 1.6.2'
|
||||||
gem 'idn-ruby', require: 'idn'
|
gem 'idn-ruby', require: 'idn'
|
||||||
gem 'kaminari', '~> 1.2'
|
gem 'kaminari', '~> 1.2'
|
||||||
gem 'link_header', '~> 0.0'
|
gem 'link_header', '~> 0.0'
|
||||||
gem 'mime-types', '~> 3.4.1', require: 'mime/types/columnar'
|
gem 'mime-types', '~> 3.4.1', require: 'mime/types/columnar'
|
||||||
gem 'nokogiri', '~> 1.12'
|
gem 'nokogiri', '~> 1.13'
|
||||||
gem 'nsa', '~> 0.2'
|
gem 'nsa', '~> 0.2'
|
||||||
gem 'oj', '~> 3.13'
|
gem 'oj', '~> 3.13'
|
||||||
gem 'ox', '~> 2.14'
|
gem 'ox', '~> 2.14'
|
||||||
gem 'parslet'
|
gem 'parslet'
|
||||||
gem 'posix-spawn'
|
gem 'posix-spawn'
|
||||||
gem 'pundit', '~> 2.1'
|
gem 'public_suffix', '~> 5.0'
|
||||||
|
gem 'pundit', '~> 2.3'
|
||||||
gem 'premailer-rails'
|
gem 'premailer-rails'
|
||||||
gem 'rack-attack', '~> 6.5'
|
gem 'rack-attack', '~> 6.6'
|
||||||
gem 'rack-cors', '~> 1.1', require: 'rack/cors'
|
gem 'rack-cors', '~> 1.1', require: 'rack/cors'
|
||||||
gem 'rails-i18n', '~> 6.0'
|
gem 'rails-i18n', '~> 6.0'
|
||||||
gem 'rails-settings-cached', '~> 0.6'
|
gem 'rails-settings-cached', '~> 0.6'
|
||||||
|
gem 'redcarpet', '~> 3.5'
|
||||||
gem 'redis', '~> 4.5', require: ['redis', 'redis/connection/hiredis']
|
gem 'redis', '~> 4.5', require: ['redis', 'redis/connection/hiredis']
|
||||||
gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
|
gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
|
||||||
gem 'rqrcode', '~> 2.1'
|
gem 'rqrcode', '~> 2.1'
|
||||||
gem 'ruby-progressbar', '~> 1.11'
|
gem 'ruby-progressbar', '~> 1.11'
|
||||||
gem 'sanitize', '~> 6.0'
|
gem 'sanitize', '~> 6.0'
|
||||||
gem 'scenic', '~> 1.5'
|
gem 'scenic', '~> 1.7'
|
||||||
gem 'sidekiq', '~> 6.3'
|
gem 'sidekiq', '~> 6.5'
|
||||||
gem 'sidekiq-scheduler', '~> 3.1'
|
gem 'sidekiq-scheduler', '~> 4.0'
|
||||||
gem 'sidekiq-unique-jobs', '~> 7.1'
|
gem 'sidekiq-unique-jobs', '~> 7.1'
|
||||||
gem 'sidekiq-bulk', '~>0.2.0'
|
gem 'sidekiq-bulk', '~> 0.2.0'
|
||||||
gem 'simple-navigation', '~> 4.3'
|
gem 'simple-navigation', '~> 4.4'
|
||||||
gem 'simple_form', '~> 5.1'
|
gem 'simple_form', '~> 5.1'
|
||||||
gem 'sprockets-rails', '~> 3.4', require: 'sprockets/railtie'
|
gem 'sprockets-rails', '~> 3.4', require: 'sprockets/railtie'
|
||||||
gem 'stoplight', '~> 2.2.1'
|
gem 'stoplight', '~> 3.0.1'
|
||||||
gem 'strong_migrations', '~> 0.7'
|
gem 'strong_migrations', '~> 0.7'
|
||||||
gem 'tty-prompt', '~> 0.23', require: false
|
gem 'tty-prompt', '~> 0.23', require: false
|
||||||
gem 'twitter-text', '~> 3.1.0'
|
gem 'twitter-text', '~> 3.1.0'
|
||||||
gem 'tzinfo-data', '~> 1.2021'
|
gem 'tzinfo-data', '~> 1.2022'
|
||||||
gem 'webpacker', '~> 5.4'
|
gem 'webpacker', '~> 5.4'
|
||||||
gem 'webpush', '~> 0.3'
|
gem 'webpush', github: 'ClearlyClaire/webpush', ref: 'f14a4d52e201128b1b00245d11b6de80d6cfdcd9'
|
||||||
gem 'webauthn', '~> 3.0.0.alpha1'
|
gem 'webauthn', '~> 2.5'
|
||||||
|
|
||||||
gem 'json-ld'
|
gem 'json-ld'
|
||||||
gem 'json-ld-preloaded', '~> 3.1'
|
gem 'json-ld-preloaded', '~> 3.2'
|
||||||
gem 'rdf-normalize', '~> 0.4'
|
gem 'rdf-normalize', '~> 0.5'
|
||||||
|
|
||||||
group :development, :test do
|
group :development, :test do
|
||||||
gem 'fabrication', '~> 2.23'
|
gem 'fabrication', '~> 2.30'
|
||||||
gem 'fuubar', '~> 2.5'
|
gem 'fuubar', '~> 2.5'
|
||||||
gem 'i18n-tasks', '~> 0.9', require: false
|
gem 'i18n-tasks', '~> 1.0', require: false
|
||||||
gem 'pry-byebug', '~> 3.9'
|
gem 'pry-byebug', '~> 3.10'
|
||||||
gem 'pry-rails', '~> 0.3'
|
gem 'pry-rails', '~> 0.3'
|
||||||
gem 'rspec-rails', '~> 5.0'
|
gem 'rspec-rails', '~> 5.1'
|
||||||
|
gem 'rubocop-performance', require: false
|
||||||
|
gem 'rubocop-rails', require: false
|
||||||
|
gem 'rubocop-rspec', require: false
|
||||||
|
gem 'rubocop', require: false
|
||||||
end
|
end
|
||||||
|
|
||||||
group :production, :test do
|
group :production, :test do
|
||||||
|
@ -113,32 +118,32 @@ group :production, :test do
|
||||||
end
|
end
|
||||||
|
|
||||||
group :test do
|
group :test do
|
||||||
gem 'capybara', '~> 3.36'
|
gem 'capybara', '~> 3.38'
|
||||||
gem 'climate_control', '~> 0.2'
|
gem 'climate_control', '~> 0.2'
|
||||||
gem 'faker', '~> 2.19'
|
gem 'faker', '~> 3.0'
|
||||||
gem 'microformats', '~> 4.2'
|
gem 'json-schema', '~> 3.0'
|
||||||
|
gem 'microformats', '~> 4.4'
|
||||||
|
gem 'rack-test', '~> 2.0'
|
||||||
gem 'rails-controller-testing', '~> 1.0'
|
gem 'rails-controller-testing', '~> 1.0'
|
||||||
|
gem 'rspec_junit_formatter', '~> 0.6'
|
||||||
gem 'rspec-sidekiq', '~> 3.1'
|
gem 'rspec-sidekiq', '~> 3.1'
|
||||||
gem 'simplecov', '~> 0.21', require: false
|
gem 'simplecov', '~> 0.21', require: false
|
||||||
gem 'webmock', '~> 3.14'
|
gem 'webmock', '~> 3.18'
|
||||||
gem 'rspec_junit_formatter', '~> 0.4'
|
|
||||||
end
|
end
|
||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
gem 'active_record_query_trace', '~> 1.8'
|
gem 'active_record_query_trace', '~> 1.8'
|
||||||
gem 'annotate', '~> 3.1'
|
gem 'annotate', '~> 3.2'
|
||||||
gem 'better_errors', '~> 2.9'
|
gem 'better_errors', '~> 2.9'
|
||||||
gem 'binding_of_caller', '~> 1.0'
|
gem 'binding_of_caller', '~> 1.0'
|
||||||
gem 'bullet', '~> 7.0'
|
gem 'bullet', '~> 7.0'
|
||||||
gem 'letter_opener', '~> 1.7'
|
gem 'letter_opener', '~> 1.8'
|
||||||
gem 'letter_opener_web', '~> 2.0'
|
gem 'letter_opener_web', '~> 2.0'
|
||||||
gem 'memory_profiler'
|
gem 'memory_profiler'
|
||||||
gem 'rubocop', '~> 1.23', require: false
|
gem 'brakeman', '~> 5.4', require: false
|
||||||
gem 'rubocop-rails', '~> 2.12', require: false
|
|
||||||
gem 'brakeman', '~> 5.2', require: false
|
|
||||||
gem 'bundler-audit', '~> 0.9', require: false
|
gem 'bundler-audit', '~> 0.9', require: false
|
||||||
|
|
||||||
gem 'capistrano', '~> 3.16'
|
gem 'capistrano', '~> 3.17'
|
||||||
gem 'capistrano-rails', '~> 1.6'
|
gem 'capistrano-rails', '~> 1.6'
|
||||||
gem 'capistrano-rbenv', '~> 2.2'
|
gem 'capistrano-rbenv', '~> 2.2'
|
||||||
gem 'capistrano-yarn', '~> 2.0'
|
gem 'capistrano-yarn', '~> 2.0'
|
||||||
|
@ -147,10 +152,10 @@ group :development do
|
||||||
end
|
end
|
||||||
|
|
||||||
group :production do
|
group :production do
|
||||||
gem 'lograge', '~> 0.11'
|
gem 'lograge', '~> 0.12'
|
||||||
end
|
end
|
||||||
|
|
||||||
gem 'concurrent-ruby', require: false
|
gem 'concurrent-ruby', require: false
|
||||||
gem 'connection_pool', require: false
|
gem 'connection_pool', require: false
|
||||||
|
|
||||||
gem 'xorcist', '~> 1.1'
|
gem 'xorcist', '~> 1.1'
|
||||||
|
gem 'cocoon', '~> 1.2'
|
||||||
|
|
694
Gemfile.lock
694
Gemfile.lock
File diff suppressed because it is too large
Load diff
18
README.md
18
README.md
|
@ -1,5 +1,8 @@
|
||||||

|
<h1><picture>
|
||||||
========
|
<source media="(prefers-color-scheme: dark)" srcset="./lib/assets/wordmark.dark.png?raw=true">
|
||||||
|
<source media="(prefers-color-scheme: light)" srcset="./lib/assets/wordmark.light.png?raw=true">
|
||||||
|
<img alt="Mastodon" src="./lib/assets/wordmark.light.png?raw=true" height="34">
|
||||||
|
</picture></h1>
|
||||||
|
|
||||||
[][releases]
|
[][releases]
|
||||||
[][circleci]
|
[][circleci]
|
||||||
|
@ -28,14 +31,14 @@ Click below to **learn more** in a video:
|
||||||
- [View sponsors](https://joinmastodon.org/sponsors)
|
- [View sponsors](https://joinmastodon.org/sponsors)
|
||||||
- [Blog](https://blog.joinmastodon.org)
|
- [Blog](https://blog.joinmastodon.org)
|
||||||
- [Documentation](https://docs.joinmastodon.org)
|
- [Documentation](https://docs.joinmastodon.org)
|
||||||
- [Browse Mastodon servers](https://joinmastodon.org/#getting-started)
|
- [Browse Mastodon servers](https://joinmastodon.org/communities)
|
||||||
- [Browse Mastodon apps](https://joinmastodon.org/apps)
|
- [Browse Mastodon apps](https://joinmastodon.org/apps)
|
||||||
|
|
||||||
[patreon]: https://www.patreon.com/mastodon
|
[patreon]: https://www.patreon.com/mastodon
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
<img src="https://docs.joinmastodon.org/elephant.svg" align="right" width="30%" />
|
<img src="/app/javascript/images/elephant_ui_working.svg?raw=true" align="right" width="30%" />
|
||||||
|
|
||||||
### No vendor lock-in: Fully interoperable with any conforming platform
|
### No vendor lock-in: Fully interoperable with any conforming platform
|
||||||
|
|
||||||
|
@ -69,14 +72,15 @@ Mastodon acts as an OAuth2 provider, so 3rd party apps can use the REST and Stre
|
||||||
|
|
||||||
- **PostgreSQL** 9.5+
|
- **PostgreSQL** 9.5+
|
||||||
- **Redis** 4+
|
- **Redis** 4+
|
||||||
- **Ruby** 2.5+
|
- **Ruby** 2.7+
|
||||||
- **Node.js** 12+
|
- **Node.js** 16+
|
||||||
|
|
||||||
The repository includes deployment configurations for **Docker and docker-compose** as well as specific platforms like **Heroku**, **Scalingo**, and **Nanobox**. The [**standalone** installation guide](https://docs.joinmastodon.org/admin/install/) is available in the documentation.
|
The repository includes deployment configurations for **Docker and docker-compose** as well as specific platforms like **Heroku**, **Scalingo**, and **Nanobox**. The [**standalone** installation guide](https://docs.joinmastodon.org/admin/install/) is available in the documentation.
|
||||||
|
|
||||||
A **Vagrant** configuration is included for development purposes. To use it, complete following steps:
|
A **Vagrant** configuration is included for development purposes. To use it, complete following steps:
|
||||||
|
|
||||||
- Install Vagrant and Virtualbox
|
- Install Vagrant and Virtualbox
|
||||||
|
- Install the `vagrant-hostsupdater` plugin: `vagrant plugin install vagrant-hostsupdater`
|
||||||
- Run `vagrant up`
|
- Run `vagrant up`
|
||||||
- Run `vagrant ssh -c "cd /vagrant && foreman start"`
|
- Run `vagrant ssh -c "cd /vagrant && foreman start"`
|
||||||
- Open `http://mastodon.local` in your browser
|
- Open `http://mastodon.local` in your browser
|
||||||
|
@ -91,7 +95,7 @@ You can open issues for bugs you've found or features you think are missing. You
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Copyright (C) 2016-2021 Eugen Rochko & other Mastodon contributors (see [AUTHORS.md](AUTHORS.md))
|
Copyright (C) 2016-2022 Eugen Rochko & other Mastodon contributors (see [AUTHORS.md](AUTHORS.md))
|
||||||
|
|
||||||
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 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.
|
||||||
|
|
||||||
|
|
22
SECURITY.md
22
SECURITY.md
|
@ -1,13 +1,17 @@
|
||||||
# Security Policy
|
# Security Policy
|
||||||
|
|
||||||
|
If you believe you've identified a security vulnerability in Mastodon (a bug that allows something to happen that shouldn't be possible), you can reach us at <security@joinmastodon.org>.
|
||||||
|
|
||||||
|
You should *not* report such issues on GitHub or in other public spaces to give us time to publish a fix for the issue without exposing Mastodon's users to increased risk.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
A "vulnerability in Mastodon" is a vulnerability in the code distributed through our main source code repository on GitHub. Vulnerabilities that are specific to a given installation (e.g. misconfiguration) should be reported to the owner of that installation and not us.
|
||||||
|
|
||||||
## Supported Versions
|
## Supported Versions
|
||||||
|
|
||||||
| Version | Supported |
|
| Version | Supported |
|
||||||
| ------- | ------------------ |
|
| ------- | ----------|
|
||||||
| 3.4.x | :white_check_mark: |
|
| 4.0.x | Yes |
|
||||||
| 3.3.x | :white_check_mark: |
|
| 3.5.x | Yes |
|
||||||
| < 3.3 | :x: |
|
| < 3.5 | No |
|
||||||
|
|
||||||
## Reporting a Vulnerability
|
|
||||||
|
|
||||||
hello@joinmastodon.org
|
|
||||||
|
|
71
Vagrantfile
vendored
71
Vagrantfile
vendored
|
@ -3,16 +3,14 @@
|
||||||
|
|
||||||
ENV["PORT"] ||= "3000"
|
ENV["PORT"] ||= "3000"
|
||||||
|
|
||||||
$provision = <<SCRIPT
|
$provisionA = <<SCRIPT
|
||||||
|
|
||||||
cd /vagrant # This is where the host folder/repo is mounted
|
|
||||||
|
|
||||||
# Add the yarn repo + yarn repo keys
|
# Add the yarn repo + yarn repo keys
|
||||||
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
|
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
|
||||||
sudo apt-add-repository 'deb https://dl.yarnpkg.com/debian/ stable main'
|
sudo apt-add-repository 'deb https://dl.yarnpkg.com/debian/ stable main'
|
||||||
|
|
||||||
# Add repo for NodeJS
|
# Add repo for NodeJS
|
||||||
curl -sL https://deb.nodesource.com/setup_14.x | sudo bash -
|
curl -sL https://deb.nodesource.com/setup_16.x | sudo bash -
|
||||||
|
|
||||||
# Add firewall rule to redirect 80 to PORT and save
|
# Add firewall rule to redirect 80 to PORT and save
|
||||||
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port #{ENV["PORT"]}
|
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port #{ENV["PORT"]}
|
||||||
|
@ -33,34 +31,56 @@ sudo apt-get install \
|
||||||
redis-tools \
|
redis-tools \
|
||||||
postgresql \
|
postgresql \
|
||||||
postgresql-contrib \
|
postgresql-contrib \
|
||||||
protobuf-compiler \
|
|
||||||
yarn \
|
|
||||||
libicu-dev \
|
libicu-dev \
|
||||||
libidn11-dev \
|
libidn11-dev \
|
||||||
|
libreadline6-dev \
|
||||||
|
autoconf \
|
||||||
|
bison \
|
||||||
|
build-essential \
|
||||||
|
ffmpeg \
|
||||||
|
file \
|
||||||
|
gcc \
|
||||||
|
libffi-dev \
|
||||||
|
libgdbm-dev \
|
||||||
|
libjemalloc-dev \
|
||||||
|
libncurses5-dev \
|
||||||
libprotobuf-dev \
|
libprotobuf-dev \
|
||||||
libreadline-dev \
|
libssl-dev \
|
||||||
libpam0g-dev \
|
libyaml-dev \
|
||||||
|
pkg-config \
|
||||||
|
protobuf-compiler \
|
||||||
|
zlib1g-dev \
|
||||||
-y
|
-y
|
||||||
|
|
||||||
# Install rvm
|
# Install rvm
|
||||||
read RUBY_VERSION < .ruby-version
|
sudo apt-add-repository -y ppa:rael-gc/rvm
|
||||||
|
sudo apt-get install rvm -y
|
||||||
|
|
||||||
curl -sSL https://rvm.io/mpapis.asc | gpg --import
|
sudo usermod -a -G rvm $USER
|
||||||
curl -sSL https://rvm.io/pkuczynski.asc | gpg --import
|
|
||||||
|
|
||||||
curl -sSL https://raw.githubusercontent.com/rvm/rvm/stable/binscripts/rvm-installer | bash -s stable --ruby=$RUBY_VERSION
|
SCRIPT
|
||||||
source /home/vagrant/.rvm/scripts/rvm
|
|
||||||
|
$provisionB = <<SCRIPT
|
||||||
|
|
||||||
|
source "/etc/profile.d/rvm.sh"
|
||||||
|
|
||||||
# Install Ruby
|
# Install Ruby
|
||||||
rvm reinstall ruby-$RUBY_VERSION --disable-binary
|
read RUBY_VERSION < /vagrant/.ruby-version
|
||||||
|
rvm install ruby-$RUBY_VERSION --disable-binary
|
||||||
|
|
||||||
# Configure database
|
# Configure database
|
||||||
sudo -u postgres createuser -U postgres vagrant -s
|
sudo -u postgres createuser -U postgres vagrant -s
|
||||||
sudo -u postgres createdb -U postgres mastodon_development
|
sudo -u postgres createdb -U postgres mastodon_development
|
||||||
|
|
||||||
# Install gems and node modules
|
cd /vagrant # This is where the host folder/repo is mounted
|
||||||
|
|
||||||
|
# Install gems
|
||||||
gem install bundler foreman
|
gem install bundler foreman
|
||||||
bundle install
|
bundle install
|
||||||
|
|
||||||
|
# Install node modules
|
||||||
|
sudo corepack enable
|
||||||
|
yarn set version classic
|
||||||
yarn install
|
yarn install
|
||||||
|
|
||||||
# Build Mastodon
|
# Build Mastodon
|
||||||
|
@ -74,18 +94,11 @@ echo 'export $(cat "/vagrant/.env.vagrant" | xargs)' >> ~/.bash_profile
|
||||||
|
|
||||||
SCRIPT
|
SCRIPT
|
||||||
|
|
||||||
$start = <<SCRIPT
|
|
||||||
|
|
||||||
echo 'To start server'
|
|
||||||
echo ' $ vagrant ssh -c "cd /vagrant && foreman start"'
|
|
||||||
|
|
||||||
SCRIPT
|
|
||||||
|
|
||||||
VAGRANTFILE_API_VERSION = "2"
|
VAGRANTFILE_API_VERSION = "2"
|
||||||
|
|
||||||
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
||||||
|
|
||||||
config.vm.box = "ubuntu/bionic64"
|
config.vm.box = "ubuntu/focal64"
|
||||||
|
|
||||||
config.vm.provider :virtualbox do |vb|
|
config.vm.provider :virtualbox do |vb|
|
||||||
vb.name = "mastodon"
|
vb.name = "mastodon"
|
||||||
|
@ -102,7 +115,6 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
||||||
# Use "virtio" network interfaces for better performance.
|
# Use "virtio" network interfaces for better performance.
|
||||||
vb.customize ["modifyvm", :id, "--nictype1", "virtio"]
|
vb.customize ["modifyvm", :id, "--nictype1", "virtio"]
|
||||||
vb.customize ["modifyvm", :id, "--nictype2", "virtio"]
|
vb.customize ["modifyvm", :id, "--nictype2", "virtio"]
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# This uses the vagrant-hostsupdater plugin, and lets you
|
# This uses the vagrant-hostsupdater plugin, and lets you
|
||||||
|
@ -120,7 +132,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
||||||
end
|
end
|
||||||
|
|
||||||
if config.vm.networks.any? { |type, options| type == :private_network }
|
if config.vm.networks.any? { |type, options| type == :private_network }
|
||||||
config.vm.synced_folder ".", "/vagrant", type: "nfs", mount_options: ['rw', 'vers=3', 'tcp', 'actimeo=1']
|
config.vm.synced_folder ".", "/vagrant", type: "nfs", mount_options: ['rw', 'actimeo=1']
|
||||||
else
|
else
|
||||||
config.vm.synced_folder ".", "/vagrant"
|
config.vm.synced_folder ".", "/vagrant"
|
||||||
end
|
end
|
||||||
|
@ -131,9 +143,12 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
||||||
config.vm.network :forwarded_port, guest: 8080, host: 8080
|
config.vm.network :forwarded_port, guest: 8080, host: 8080
|
||||||
|
|
||||||
# Full provisioning script, only runs on first 'vagrant up' or with 'vagrant provision'
|
# Full provisioning script, only runs on first 'vagrant up' or with 'vagrant provision'
|
||||||
config.vm.provision :shell, inline: $provision, privileged: false
|
config.vm.provision :shell, inline: $provisionA, privileged: false, reset: true
|
||||||
|
config.vm.provision :shell, inline: $provisionB, privileged: false
|
||||||
|
|
||||||
# Start up script, runs on every 'vagrant up'
|
config.vm.post_up_message = <<MESSAGE
|
||||||
config.vm.provision :shell, inline: $start, run: 'always', privileged: false
|
To start server
|
||||||
|
$ vagrant ssh -c "cd /vagrant && foreman start"
|
||||||
|
MESSAGE
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
12
app.json
12
app.json
|
@ -79,8 +79,13 @@
|
||||||
"description": "SMTP server certificate verification mode. Defaults is 'peer'.",
|
"description": "SMTP server certificate verification mode. Defaults is 'peer'.",
|
||||||
"required": false
|
"required": false
|
||||||
},
|
},
|
||||||
|
"SMTP_ENABLE_STARTTLS": {
|
||||||
|
"description": "Enable STARTTLS? Default is 'auto'.",
|
||||||
|
"value": "auto",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
"SMTP_ENABLE_STARTTLS_AUTO": {
|
"SMTP_ENABLE_STARTTLS_AUTO": {
|
||||||
"description": "Enable STARTTLS if SMTP server supports it? Default is true.",
|
"description": "Enable STARTTLS if SMTP server supports it? Deprecated by SMTP_ENABLE_STARTTLS.",
|
||||||
"required": false
|
"required": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -95,8 +100,5 @@
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"postdeploy": "bundle exec rails db:migrate && bundle exec rails db:seed"
|
"postdeploy": "bundle exec rails db:migrate && bundle exec rails db:seed"
|
||||||
},
|
},
|
||||||
"addons": [
|
"addons": ["heroku-postgresql", "heroku-redis"]
|
||||||
"heroku-postgresql",
|
|
||||||
"heroku-redis"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class AccountsIndex < Chewy::Index
|
class AccountsIndex < Chewy::Index
|
||||||
settings index: { refresh_interval: '5m' }, analysis: {
|
settings index: { refresh_interval: '30s' }, analysis: {
|
||||||
analyzer: {
|
analyzer: {
|
||||||
content: {
|
content: {
|
||||||
tokenizer: 'whitespace',
|
tokenizer: 'whitespace',
|
||||||
|
@ -23,7 +23,7 @@ class AccountsIndex < Chewy::Index
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
index_scope ::Account.searchable.includes(:account_stat), delete_if: ->(account) { account.destroyed? || !account.searchable? }
|
index_scope ::Account.searchable.includes(:account_stat)
|
||||||
|
|
||||||
root date_detection: false do
|
root date_detection: false do
|
||||||
field :id, type: 'long'
|
field :id, type: 'long'
|
||||||
|
@ -36,8 +36,8 @@ class AccountsIndex < Chewy::Index
|
||||||
field :edge_ngram, type: 'text', analyzer: 'edge_ngram', search_analyzer: 'content'
|
field :edge_ngram, type: 'text', analyzer: 'edge_ngram', search_analyzer: 'content'
|
||||||
end
|
end
|
||||||
|
|
||||||
field :following_count, type: 'long', value: ->(account) { account.following.local.count }
|
field :following_count, type: 'long', value: ->(account) { account.following_count }
|
||||||
field :followers_count, type: 'long', value: ->(account) { account.followers.local.count }
|
field :followers_count, type: 'long', value: ->(account) { account.followers_count }
|
||||||
field :last_status_at, type: 'date', value: ->(account) { account.last_status_at || account.created_at }
|
field :last_status_at, type: 'date', value: ->(account) { account.last_status_at || account.created_at }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class StatusesIndex < Chewy::Index
|
class StatusesIndex < Chewy::Index
|
||||||
settings index: { refresh_interval: '15m' }, analysis: {
|
include FormattingHelper
|
||||||
|
|
||||||
|
settings index: { refresh_interval: '30s' }, analysis: {
|
||||||
filter: {
|
filter: {
|
||||||
english_stop: {
|
english_stop: {
|
||||||
type: 'stop',
|
type: 'stop',
|
||||||
|
@ -31,6 +33,8 @@ class StatusesIndex < Chewy::Index
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# We do not use delete_if option here because it would call a method that we
|
||||||
|
# expect to be called with crutches without crutches, causing n+1 queries
|
||||||
index_scope ::Status.unscoped.kept.without_reblogs.includes(:media_attachments, :preloadable_poll)
|
index_scope ::Status.unscoped.kept.without_reblogs.includes(:media_attachments, :preloadable_poll)
|
||||||
|
|
||||||
crutch :mentions do |collection|
|
crutch :mentions do |collection|
|
||||||
|
@ -53,11 +57,16 @@ class StatusesIndex < Chewy::Index
|
||||||
data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) }
|
data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
crutch :votes do |collection|
|
||||||
|
data = ::PollVote.joins(:poll).where(poll: { status_id: collection.map(&:id) }).where(account: Account.local).pluck(:status_id, :account_id)
|
||||||
|
data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) }
|
||||||
|
end
|
||||||
|
|
||||||
root date_detection: false do
|
root date_detection: false do
|
||||||
field :id, type: 'long'
|
field :id, type: 'long'
|
||||||
field :account_id, type: 'long'
|
field :account_id, type: 'long'
|
||||||
|
|
||||||
field :text, type: 'text', value: ->(status) { [status.spoiler_text, Formatter.instance.plaintext(status)].concat(status.media_attachments.map(&:description)).concat(status.preloadable_poll ? status.preloadable_poll.options : []).join("\n\n") } do
|
field :text, type: 'text', value: ->(status) { status.searchable_text } do
|
||||||
field :stemmed, type: 'text', analyzer: 'content'
|
field :stemmed, type: 'text', analyzer: 'content'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class TagsIndex < Chewy::Index
|
class TagsIndex < Chewy::Index
|
||||||
settings index: { refresh_interval: '15m' }, analysis: {
|
settings index: { refresh_interval: '30s' }, analysis: {
|
||||||
analyzer: {
|
analyzer: {
|
||||||
content: {
|
content: {
|
||||||
tokenizer: 'keyword',
|
tokenizer: 'keyword',
|
||||||
|
@ -23,7 +23,11 @@ class TagsIndex < Chewy::Index
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
index_scope ::Tag.listable, delete_if: ->(tag) { tag.destroyed? || !tag.listable? }
|
index_scope ::Tag.listable
|
||||||
|
|
||||||
|
crutch :time_period do
|
||||||
|
7.days.ago.to_date..0.days.ago.to_date
|
||||||
|
end
|
||||||
|
|
||||||
root date_detection: false do
|
root date_detection: false do
|
||||||
field :name, type: 'text', analyzer: 'content' do
|
field :name, type: 'text', analyzer: 'content' do
|
||||||
|
@ -31,7 +35,7 @@ class TagsIndex < Chewy::Index
|
||||||
end
|
end
|
||||||
|
|
||||||
field :reviewed, type: 'boolean', value: ->(tag) { tag.reviewed? }
|
field :reviewed, type: 'boolean', value: ->(tag) { tag.reviewed? }
|
||||||
field :usage, type: 'long', value: ->(tag) { tag.history.reduce(0) { |total, day| total + day.accounts } }
|
field :usage, type: 'long', value: ->(tag, crutches) { tag.history.aggregate(crutches.time_period).accounts }
|
||||||
field :last_status_at, type: 'date', value: ->(tag) { tag.last_status_at || tag.created_at }
|
field :last_status_at, type: 'date', value: ->(tag) { tag.last_status_at || tag.created_at }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,68 +1,19 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class AboutController < ApplicationController
|
class AboutController < ApplicationController
|
||||||
include RegistrationSpamConcern
|
include WebAppControllerConcern
|
||||||
|
|
||||||
layout 'public'
|
skip_before_action :require_functional!
|
||||||
|
|
||||||
before_action :require_open_federation!, only: [:show, :more]
|
|
||||||
before_action :set_body_classes, only: :show
|
|
||||||
before_action :set_instance_presenter
|
before_action :set_instance_presenter
|
||||||
before_action :set_expires_in, only: [:more, :terms]
|
|
||||||
before_action :set_registration_form_time, only: :show
|
|
||||||
|
|
||||||
skip_before_action :require_functional!, only: [:more, :terms]
|
def show
|
||||||
|
expires_in 0, public: true unless user_signed_in?
|
||||||
def show; end
|
|
||||||
|
|
||||||
def more
|
|
||||||
flash.now[:notice] = I18n.t('about.instance_actor_flash') if params[:instance_actor]
|
|
||||||
|
|
||||||
toc_generator = TOCGenerator.new(@instance_presenter.site_extended_description)
|
|
||||||
|
|
||||||
@rules = Rule.ordered
|
|
||||||
@contents = toc_generator.html
|
|
||||||
@table_of_contents = toc_generator.toc
|
|
||||||
@blocks = DomainBlock.with_user_facing_limitations.by_severity if display_blocks?
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def terms; end
|
|
||||||
|
|
||||||
helper_method :display_blocks?
|
|
||||||
helper_method :display_blocks_rationale?
|
|
||||||
helper_method :public_fetch_mode?
|
|
||||||
helper_method :new_user
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def require_open_federation!
|
|
||||||
not_found if whitelist_mode?
|
|
||||||
end
|
|
||||||
|
|
||||||
def display_blocks?
|
|
||||||
Setting.show_domain_blocks == 'all' || (Setting.show_domain_blocks == 'users' && user_signed_in?)
|
|
||||||
end
|
|
||||||
|
|
||||||
def display_blocks_rationale?
|
|
||||||
Setting.show_domain_blocks_rationale == 'all' || (Setting.show_domain_blocks_rationale == 'users' && user_signed_in?)
|
|
||||||
end
|
|
||||||
|
|
||||||
def new_user
|
|
||||||
User.new.tap do |user|
|
|
||||||
user.build_account
|
|
||||||
user.build_invite_request
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_instance_presenter
|
def set_instance_presenter
|
||||||
@instance_presenter = InstancePresenter.new
|
@instance_presenter = InstancePresenter.new
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_body_classes
|
|
||||||
@hide_navbar = true
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_expires_in
|
|
||||||
expires_in 0, public: true
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
class AccountFollowController < ApplicationController
|
|
||||||
include AccountControllerConcern
|
|
||||||
|
|
||||||
before_action :authenticate_user!
|
|
||||||
|
|
||||||
def create
|
|
||||||
FollowService.new.call(current_user.account, @account, with_rate_limit: true)
|
|
||||||
redirect_to account_path(@account)
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,12 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
class AccountUnfollowController < ApplicationController
|
|
||||||
include AccountControllerConcern
|
|
||||||
|
|
||||||
before_action :authenticate_user!
|
|
||||||
|
|
||||||
def create
|
|
||||||
UnfollowService.new.call(current_user.account, @account)
|
|
||||||
redirect_to account_path(@account)
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -7,9 +7,8 @@ class AccountsController < ApplicationController
|
||||||
include AccountControllerConcern
|
include AccountControllerConcern
|
||||||
include SignatureAuthentication
|
include SignatureAuthentication
|
||||||
|
|
||||||
before_action :require_signature!, if: -> { request.format == :json && authorized_fetch_mode? }
|
before_action :require_account_signature!, if: -> { request.format == :json && authorized_fetch_mode? }
|
||||||
before_action :set_cache_headers
|
before_action :set_cache_headers
|
||||||
before_action :set_body_classes
|
|
||||||
|
|
||||||
skip_around_action :set_locale, if: -> { [:json, :rss].include?(request.format&.to_sym) }
|
skip_around_action :set_locale, if: -> { [:json, :rss].include?(request.format&.to_sym) }
|
||||||
skip_before_action :require_functional!, unless: :whitelist_mode?
|
skip_before_action :require_functional!, unless: :whitelist_mode?
|
||||||
|
@ -19,23 +18,7 @@ class AccountsController < ApplicationController
|
||||||
format.html do
|
format.html do
|
||||||
expires_in 0, public: true unless user_signed_in?
|
expires_in 0, public: true unless user_signed_in?
|
||||||
|
|
||||||
@pinned_statuses = []
|
@rss_url = rss_url
|
||||||
@endorsed_accounts = @account.endorsed_accounts.to_a.sample(4)
|
|
||||||
@featured_hashtags = @account.featured_tags.order(statuses_count: :desc)
|
|
||||||
|
|
||||||
if current_account && @account.blocking?(current_account)
|
|
||||||
@statuses = []
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
@pinned_statuses = cache_collection(@account.pinned_statuses, Status) if show_pinned_statuses?
|
|
||||||
@statuses = cached_filtered_status_page
|
|
||||||
@rss_url = rss_url
|
|
||||||
|
|
||||||
unless @statuses.empty?
|
|
||||||
@older_url = older_url if @statuses.last.id > filtered_statuses.last.id
|
|
||||||
@newer_url = newer_url if @statuses.first.id < filtered_statuses.first.id
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
format.rss do
|
format.rss do
|
||||||
|
@ -44,7 +27,6 @@ class AccountsController < ApplicationController
|
||||||
limit = params[:limit].present? ? [params[:limit].to_i, PAGE_SIZE_MAX].min : PAGE_SIZE
|
limit = params[:limit].present? ? [params[:limit].to_i, PAGE_SIZE_MAX].min : PAGE_SIZE
|
||||||
@statuses = filtered_statuses.without_reblogs.limit(limit)
|
@statuses = filtered_statuses.without_reblogs.limit(limit)
|
||||||
@statuses = cache_collection(@statuses, Status)
|
@statuses = cache_collection(@statuses, Status)
|
||||||
render xml: RSS::AccountSerializer.render(@account, @statuses, params[:tag])
|
|
||||||
end
|
end
|
||||||
|
|
||||||
format.json do
|
format.json do
|
||||||
|
@ -56,14 +38,6 @@ class AccountsController < ApplicationController
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def set_body_classes
|
|
||||||
@body_classes = 'with-modals'
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_pinned_statuses?
|
|
||||||
[replies_requested?, media_requested?, tag_requested?, params[:max_id].present?, params[:min_id].present?].none?
|
|
||||||
end
|
|
||||||
|
|
||||||
def filtered_statuses
|
def filtered_statuses
|
||||||
default_statuses.tap do |statuses|
|
default_statuses.tap do |statuses|
|
||||||
statuses.merge!(hashtag_scope) if tag_requested?
|
statuses.merge!(hashtag_scope) if tag_requested?
|
||||||
|
@ -110,26 +84,6 @@ class AccountsController < ApplicationController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def older_url
|
|
||||||
pagination_url(max_id: @statuses.last.id)
|
|
||||||
end
|
|
||||||
|
|
||||||
def newer_url
|
|
||||||
pagination_url(min_id: @statuses.first.id)
|
|
||||||
end
|
|
||||||
|
|
||||||
def pagination_url(max_id: nil, min_id: nil)
|
|
||||||
if tag_requested?
|
|
||||||
short_account_tag_url(@account, params[:tag], max_id: max_id, min_id: min_id)
|
|
||||||
elsif media_requested?
|
|
||||||
short_account_media_url(@account, max_id: max_id, min_id: min_id)
|
|
||||||
elsif replies_requested?
|
|
||||||
short_account_with_replies_url(@account, max_id: max_id, min_id: min_id)
|
|
||||||
else
|
|
||||||
short_account_url(@account, max_id: max_id, min_id: min_id)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def media_requested?
|
def media_requested?
|
||||||
request.path.split('.').first.end_with?('/media') && !tag_requested?
|
request.path.split('.').first.end_with?('/media') && !tag_requested?
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
class ActivityPub::BaseController < Api::BaseController
|
class ActivityPub::BaseController < Api::BaseController
|
||||||
skip_before_action :require_authenticated_user!
|
skip_before_action :require_authenticated_user!
|
||||||
|
skip_before_action :require_not_suspended!
|
||||||
|
skip_around_action :set_locale
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ class ActivityPub::ClaimsController < ActivityPub::BaseController
|
||||||
|
|
||||||
skip_before_action :authenticate_user!
|
skip_before_action :authenticate_user!
|
||||||
|
|
||||||
before_action :require_signature!
|
before_action :require_account_signature!
|
||||||
before_action :set_claim_result
|
before_action :set_claim_result
|
||||||
|
|
||||||
def create
|
def create
|
||||||
|
|
|
@ -4,7 +4,7 @@ class ActivityPub::CollectionsController < ActivityPub::BaseController
|
||||||
include SignatureVerification
|
include SignatureVerification
|
||||||
include AccountOwnedConcern
|
include AccountOwnedConcern
|
||||||
|
|
||||||
before_action :require_signature!, if: :authorized_fetch_mode?
|
before_action :require_account_signature!, if: :authorized_fetch_mode?
|
||||||
before_action :set_items
|
before_action :set_items
|
||||||
before_action :set_size
|
before_action :set_size
|
||||||
before_action :set_type
|
before_action :set_type
|
||||||
|
@ -21,6 +21,7 @@ class ActivityPub::CollectionsController < ActivityPub::BaseController
|
||||||
case params[:id]
|
case params[:id]
|
||||||
when 'featured'
|
when 'featured'
|
||||||
@items = for_signed_account { cache_collection(@account.pinned_statuses, Status) }
|
@items = for_signed_account { cache_collection(@account.pinned_statuses, Status) }
|
||||||
|
@items = @items.map { |item| item.distributable? ? item : ActivityPub::TagManager.instance.uri_for(item) }
|
||||||
when 'tags'
|
when 'tags'
|
||||||
@items = for_signed_account { @account.featured_tags }
|
@items = for_signed_account { @account.featured_tags }
|
||||||
when 'devices'
|
when 'devices'
|
||||||
|
|
|
@ -4,7 +4,7 @@ class ActivityPub::FollowersSynchronizationsController < ActivityPub::BaseContro
|
||||||
include SignatureVerification
|
include SignatureVerification
|
||||||
include AccountOwnedConcern
|
include AccountOwnedConcern
|
||||||
|
|
||||||
before_action :require_signature!
|
before_action :require_account_signature!
|
||||||
before_action :set_items
|
before_action :set_items
|
||||||
before_action :set_cache_headers
|
before_action :set_cache_headers
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ class ActivityPub::InboxesController < ActivityPub::BaseController
|
||||||
include AccountOwnedConcern
|
include AccountOwnedConcern
|
||||||
|
|
||||||
before_action :skip_unknown_actor_activity
|
before_action :skip_unknown_actor_activity
|
||||||
before_action :require_signature!
|
before_action :require_actor_signature!
|
||||||
skip_before_action :authenticate_user!
|
skip_before_action :authenticate_user!
|
||||||
|
|
||||||
def create
|
def create
|
||||||
|
@ -49,17 +49,17 @@ class ActivityPub::InboxesController < ActivityPub::BaseController
|
||||||
end
|
end
|
||||||
|
|
||||||
def upgrade_account
|
def upgrade_account
|
||||||
if signed_request_account.ostatus?
|
if signed_request_account&.ostatus?
|
||||||
signed_request_account.update(last_webfingered_at: nil)
|
signed_request_account.update(last_webfingered_at: nil)
|
||||||
ResolveAccountWorker.perform_async(signed_request_account.acct)
|
ResolveAccountWorker.perform_async(signed_request_account.acct)
|
||||||
end
|
end
|
||||||
|
|
||||||
DeliveryFailureTracker.reset!(signed_request_account.inbox_url)
|
DeliveryFailureTracker.reset!(signed_request_actor.inbox_url)
|
||||||
end
|
end
|
||||||
|
|
||||||
def process_collection_synchronization
|
def process_collection_synchronization
|
||||||
raw_params = request.headers['Collection-Synchronization']
|
raw_params = request.headers['Collection-Synchronization']
|
||||||
return if raw_params.blank? || ENV['DISABLE_FOLLOWERS_SYNCHRONIZATION'] == 'true'
|
return if raw_params.blank? || ENV['DISABLE_FOLLOWERS_SYNCHRONIZATION'] == 'true' || signed_request_account.nil?
|
||||||
|
|
||||||
# Re-using the syntax for signature parameters
|
# Re-using the syntax for signature parameters
|
||||||
tree = SignatureParamsParser.new.parse(raw_params)
|
tree = SignatureParamsParser.new.parse(raw_params)
|
||||||
|
@ -71,6 +71,6 @@ class ActivityPub::InboxesController < ActivityPub::BaseController
|
||||||
end
|
end
|
||||||
|
|
||||||
def process_payload
|
def process_payload
|
||||||
ActivityPub::ProcessingWorker.perform_async(signed_request_account.id, body, @account&.id)
|
ActivityPub::ProcessingWorker.perform_async(signed_request_actor.id, body, @account&.id, signed_request_actor.class.name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,7 +6,7 @@ class ActivityPub::OutboxesController < ActivityPub::BaseController
|
||||||
include SignatureVerification
|
include SignatureVerification
|
||||||
include AccountOwnedConcern
|
include AccountOwnedConcern
|
||||||
|
|
||||||
before_action :require_signature!, if: :authorized_fetch_mode?
|
before_action :require_account_signature!, if: :authorized_fetch_mode?
|
||||||
before_action :set_statuses
|
before_action :set_statuses
|
||||||
before_action :set_cache_headers
|
before_action :set_cache_headers
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ class ActivityPub::OutboxesController < ActivityPub::BaseController
|
||||||
return unless page_requested?
|
return unless page_requested?
|
||||||
|
|
||||||
@statuses = cache_collection_paginated_by_id(
|
@statuses = cache_collection_paginated_by_id(
|
||||||
@account.statuses.permitted_for(@account, signed_request_account),
|
AccountStatusesFilter.new(@account, signed_request_account).results,
|
||||||
Status,
|
Status,
|
||||||
LIMIT,
|
LIMIT,
|
||||||
params_slice(:max_id, :min_id, :since_id)
|
params_slice(:max_id, :min_id, :since_id)
|
||||||
|
|
|
@ -7,7 +7,7 @@ class ActivityPub::RepliesController < ActivityPub::BaseController
|
||||||
|
|
||||||
DESCENDANTS_LIMIT = 60
|
DESCENDANTS_LIMIT = 60
|
||||||
|
|
||||||
before_action :require_signature!, if: :authorized_fetch_mode?
|
before_action :require_account_signature!, if: :authorized_fetch_mode?
|
||||||
before_action :set_status
|
before_action :set_status
|
||||||
before_action :set_cache_headers
|
before_action :set_cache_headers
|
||||||
before_action :set_replies
|
before_action :set_replies
|
||||||
|
@ -63,15 +63,29 @@ class ActivityPub::RepliesController < ActivityPub::BaseController
|
||||||
end
|
end
|
||||||
|
|
||||||
def next_page
|
def next_page
|
||||||
only_other_accounts = !(@replies&.last&.account_id == @account.id && @replies.size == DESCENDANTS_LIMIT)
|
if only_other_accounts?
|
||||||
|
# Only consider remote accounts
|
||||||
|
return nil if @replies.size < DESCENDANTS_LIMIT
|
||||||
|
|
||||||
account_status_replies_url(
|
account_status_replies_url(
|
||||||
@account,
|
@account,
|
||||||
@status,
|
@status,
|
||||||
page: true,
|
page: true,
|
||||||
min_id: only_other_accounts && !only_other_accounts? ? nil : @replies&.last&.id,
|
min_id: @replies&.last&.id,
|
||||||
only_other_accounts: only_other_accounts
|
only_other_accounts: true
|
||||||
)
|
)
|
||||||
|
else
|
||||||
|
# For now, we're serving only self-replies, but next page might be other accounts
|
||||||
|
next_only_other_accounts = @replies&.last&.account_id != @account.id || @replies.size < DESCENDANTS_LIMIT
|
||||||
|
|
||||||
|
account_status_replies_url(
|
||||||
|
@account,
|
||||||
|
@status,
|
||||||
|
page: true,
|
||||||
|
min_id: next_only_other_accounts ? nil : @replies&.last&.id,
|
||||||
|
only_other_accounts: next_only_other_accounts
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def page_params
|
def page_params
|
||||||
|
|
|
@ -5,11 +5,15 @@ module Admin
|
||||||
before_action :set_account
|
before_action :set_account
|
||||||
|
|
||||||
def new
|
def new
|
||||||
|
authorize @account, :show?
|
||||||
|
|
||||||
@account_action = Admin::AccountAction.new(type: params[:type], report_id: params[:report_id], send_email_notification: true, include_statuses: true)
|
@account_action = Admin::AccountAction.new(type: params[:type], report_id: params[:report_id], send_email_notification: true, include_statuses: true)
|
||||||
@warning_presets = AccountWarningPreset.all
|
@warning_presets = AccountWarningPreset.all
|
||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
|
authorize @account, :show?
|
||||||
|
|
||||||
account_action = Admin::AccountAction.new(resource_params)
|
account_action = Admin::AccountAction.new(resource_params)
|
||||||
account_action.target_account = @account
|
account_action.target_account = @account
|
||||||
account_action.current_account = current_account
|
account_action.current_account = current_account
|
||||||
|
|
|
@ -14,7 +14,7 @@ module Admin
|
||||||
else
|
else
|
||||||
@account = @account_moderation_note.target_account
|
@account = @account_moderation_note.target_account
|
||||||
@moderation_notes = @account.targeted_moderation_notes.latest
|
@moderation_notes = @account.targeted_moderation_notes.latest
|
||||||
@warnings = @account.targeted_account_warnings.latest.custom
|
@warnings = @account.strikes.custom.latest
|
||||||
|
|
||||||
render template: 'admin/accounts/show'
|
render template: 'admin/accounts/show'
|
||||||
end
|
end
|
||||||
|
|
|
@ -14,7 +14,13 @@ module Admin
|
||||||
end
|
end
|
||||||
|
|
||||||
def batch
|
def batch
|
||||||
@form = Form::AccountBatch.new(form_account_batch_params.merge(current_account: current_account, action: action_from_button))
|
authorize :account, :index?
|
||||||
|
|
||||||
|
@form = Form::AccountBatch.new(form_account_batch_params)
|
||||||
|
@form.current_account = current_account
|
||||||
|
@form.action = action_from_button
|
||||||
|
@form.select_all_matching = params[:select_all_matching]
|
||||||
|
@form.query = filtered_accounts
|
||||||
@form.save
|
@form.save
|
||||||
rescue ActionController::ParameterMissing
|
rescue ActionController::ParameterMissing
|
||||||
flash[:alert] = I18n.t('admin.accounts.no_account_selected')
|
flash[:alert] = I18n.t('admin.accounts.no_account_selected')
|
||||||
|
@ -28,7 +34,7 @@ module Admin
|
||||||
@deletion_request = @account.deletion_request
|
@deletion_request = @account.deletion_request
|
||||||
@account_moderation_note = current_account.account_moderation_notes.new(target_account: @account)
|
@account_moderation_note = current_account.account_moderation_notes.new(target_account: @account)
|
||||||
@moderation_notes = @account.targeted_moderation_notes.latest
|
@moderation_notes = @account.targeted_moderation_notes.latest
|
||||||
@warnings = @account.targeted_account_warnings.latest.custom
|
@warnings = @account.strikes.includes(:target_account, :account, :appeal).latest
|
||||||
@domain_block = DomainBlock.rule_for(@account.domain)
|
@domain_block = DomainBlock.rule_for(@account.domain)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -48,15 +54,15 @@ module Admin
|
||||||
|
|
||||||
def approve
|
def approve
|
||||||
authorize @account.user, :approve?
|
authorize @account.user, :approve?
|
||||||
log_action :approve, @account.user
|
|
||||||
@account.user.approve!
|
@account.user.approve!
|
||||||
|
log_action :approve, @account.user
|
||||||
redirect_to admin_accounts_path(status: 'pending'), notice: I18n.t('admin.accounts.approved_msg', username: @account.acct)
|
redirect_to admin_accounts_path(status: 'pending'), notice: I18n.t('admin.accounts.approved_msg', username: @account.acct)
|
||||||
end
|
end
|
||||||
|
|
||||||
def reject
|
def reject
|
||||||
authorize @account.user, :reject?
|
authorize @account.user, :reject?
|
||||||
log_action :reject, @account.user, username: @account.username
|
|
||||||
DeleteAccountService.new.call(@account, reserve_email: false, reserve_username: false)
|
DeleteAccountService.new.call(@account, reserve_email: false, reserve_username: false)
|
||||||
|
log_action :reject, @account.user
|
||||||
redirect_to admin_accounts_path(status: 'pending'), notice: I18n.t('admin.accounts.rejected_msg', username: @account.acct)
|
redirect_to admin_accounts_path(status: 'pending'), notice: I18n.t('admin.accounts.rejected_msg', username: @account.acct)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -148,7 +154,7 @@ module Admin
|
||||||
end
|
end
|
||||||
|
|
||||||
def filter_params
|
def filter_params
|
||||||
params.slice(*AccountFilter::KEYS).permit(*AccountFilter::KEYS)
|
params.slice(:page, *AccountFilter::KEYS).permit(:page, *AccountFilter::KEYS)
|
||||||
end
|
end
|
||||||
|
|
||||||
def form_account_batch_params
|
def form_account_batch_params
|
||||||
|
|
|
@ -4,7 +4,10 @@ module Admin
|
||||||
class ActionLogsController < BaseController
|
class ActionLogsController < BaseController
|
||||||
before_action :set_action_logs
|
before_action :set_action_logs
|
||||||
|
|
||||||
def index; end
|
def index
|
||||||
|
authorize :audit_log, :index?
|
||||||
|
@auditable_accounts = Account.where(id: Admin::ActionLog.reorder(nil).select('distinct account_id')).select(:id, :username)
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
|
|
@ -7,8 +7,8 @@ module Admin
|
||||||
|
|
||||||
layout 'admin'
|
layout 'admin'
|
||||||
|
|
||||||
before_action :require_staff!
|
|
||||||
before_action :set_body_classes
|
before_action :set_body_classes
|
||||||
|
after_action :verify_authorized
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ module Admin
|
||||||
|
|
||||||
@user.resend_confirmation_instructions
|
@user.resend_confirmation_instructions
|
||||||
|
|
||||||
log_action :confirm, @user
|
log_action :resend, @user
|
||||||
|
|
||||||
flash[:notice] = I18n.t('admin.accounts.resend_confirmation.success')
|
flash[:notice] = I18n.t('admin.accounts.resend_confirmation.success')
|
||||||
redirect_to admin_accounts_path
|
redirect_to admin_accounts_path
|
||||||
|
|
|
@ -29,10 +29,12 @@ module Admin
|
||||||
end
|
end
|
||||||
|
|
||||||
def batch
|
def batch
|
||||||
|
authorize :custom_emoji, :index?
|
||||||
|
|
||||||
@form = Form::CustomEmojiBatch.new(form_custom_emoji_batch_params.merge(current_account: current_account, action: action_from_button))
|
@form = Form::CustomEmojiBatch.new(form_custom_emoji_batch_params.merge(current_account: current_account, action: action_from_button))
|
||||||
@form.save
|
@form.save
|
||||||
rescue ActionController::ParameterMissing
|
rescue ActionController::ParameterMissing
|
||||||
flash[:alert] = I18n.t('admin.accounts.no_account_selected')
|
flash[:alert] = I18n.t('admin.custom_emojis.no_emoji_selected')
|
||||||
rescue Mastodon::NotPermittedError
|
rescue Mastodon::NotPermittedError
|
||||||
flash[:alert] = I18n.t('admin.custom_emojis.not_permitted')
|
flash[:alert] = I18n.t('admin.custom_emojis.not_permitted')
|
||||||
ensure
|
ensure
|
||||||
|
|
|
@ -2,22 +2,27 @@
|
||||||
|
|
||||||
module Admin
|
module Admin
|
||||||
class DashboardController < BaseController
|
class DashboardController < BaseController
|
||||||
|
include Redisable
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@system_checks = Admin::SystemCheck.perform
|
authorize :dashboard, :index?
|
||||||
|
|
||||||
|
@system_checks = Admin::SystemCheck.perform(current_user)
|
||||||
@time_period = (29.days.ago.to_date...Time.now.utc.to_date)
|
@time_period = (29.days.ago.to_date...Time.now.utc.to_date)
|
||||||
@pending_users_count = User.pending.count
|
@pending_users_count = User.pending.count
|
||||||
@pending_reports_count = Report.unresolved.count
|
@pending_reports_count = Report.unresolved.count
|
||||||
@pending_tags_count = Tag.pending_review.count
|
@pending_tags_count = Tag.pending_review.count
|
||||||
|
@pending_appeals_count = Appeal.pending.count
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def redis_info
|
def redis_info
|
||||||
@redis_info ||= begin
|
@redis_info ||= begin
|
||||||
if Redis.current.is_a?(Redis::Namespace)
|
if redis.is_a?(Redis::Namespace)
|
||||||
Redis.current.redis.info
|
redis.redis.info
|
||||||
else
|
else
|
||||||
Redis.current.info
|
redis.info
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
40
app/controllers/admin/disputes/appeals_controller.rb
Normal file
40
app/controllers/admin/disputes/appeals_controller.rb
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Admin::Disputes::AppealsController < Admin::BaseController
|
||||||
|
before_action :set_appeal, except: :index
|
||||||
|
|
||||||
|
def index
|
||||||
|
authorize :appeal, :index?
|
||||||
|
|
||||||
|
@appeals = filtered_appeals.page(params[:page])
|
||||||
|
end
|
||||||
|
|
||||||
|
def approve
|
||||||
|
authorize @appeal, :approve?
|
||||||
|
log_action :approve, @appeal
|
||||||
|
ApproveAppealService.new.call(@appeal, current_account)
|
||||||
|
redirect_to disputes_strike_path(@appeal.strike)
|
||||||
|
end
|
||||||
|
|
||||||
|
def reject
|
||||||
|
authorize @appeal, :approve?
|
||||||
|
log_action :reject, @appeal
|
||||||
|
@appeal.reject!(current_account)
|
||||||
|
UserMailer.appeal_rejected(@appeal.account.user, @appeal)
|
||||||
|
redirect_to disputes_strike_path(@appeal.strike)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def filtered_appeals
|
||||||
|
Admin::AppealFilter.new(filter_params.with_defaults(status: 'pending')).results.includes(strike: :account)
|
||||||
|
end
|
||||||
|
|
||||||
|
def filter_params
|
||||||
|
params.slice(:page, *Admin::AppealFilter::KEYS).permit(:page, *Admin::AppealFilter::KEYS)
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_appeal
|
||||||
|
@appeal = Appeal.find(params[:id])
|
||||||
|
end
|
||||||
|
end
|
|
@ -4,6 +4,18 @@ module Admin
|
||||||
class DomainBlocksController < BaseController
|
class DomainBlocksController < BaseController
|
||||||
before_action :set_domain_block, only: [:show, :destroy, :edit, :update]
|
before_action :set_domain_block, only: [:show, :destroy, :edit, :update]
|
||||||
|
|
||||||
|
def batch
|
||||||
|
authorize :domain_block, :create?
|
||||||
|
@form = Form::DomainBlockBatch.new(form_domain_block_batch_params.merge(current_account: current_account, action: action_from_button))
|
||||||
|
@form.save
|
||||||
|
rescue ActionController::ParameterMissing
|
||||||
|
flash[:alert] = I18n.t('admin.domain_blocks.no_domain_block_selected')
|
||||||
|
rescue Mastodon::NotPermittedError
|
||||||
|
flash[:alert] = I18n.t('admin.domain_blocks.not_permitted')
|
||||||
|
else
|
||||||
|
redirect_to admin_instances_path(limited: '1'), notice: I18n.t('admin.domain_blocks.created_msg')
|
||||||
|
end
|
||||||
|
|
||||||
def new
|
def new
|
||||||
authorize :domain_block, :create?
|
authorize :domain_block, :create?
|
||||||
@domain_block = DomainBlock.new(domain: params[:_domain])
|
@domain_block = DomainBlock.new(domain: params[:_domain])
|
||||||
|
@ -43,12 +55,8 @@ module Admin
|
||||||
def update
|
def update
|
||||||
authorize :domain_block, :update?
|
authorize :domain_block, :update?
|
||||||
|
|
||||||
@domain_block.update(update_params)
|
if @domain_block.update(update_params)
|
||||||
|
DomainBlockWorker.perform_async(@domain_block.id, @domain_block.severity_previously_changed?)
|
||||||
severity_changed = @domain_block.severity_changed?
|
|
||||||
|
|
||||||
if @domain_block.save
|
|
||||||
DomainBlockWorker.perform_async(@domain_block.id, severity_changed)
|
|
||||||
log_action :update, @domain_block
|
log_action :update, @domain_block
|
||||||
redirect_to admin_instances_path(limited: '1'), notice: I18n.t('admin.domain_blocks.created_msg')
|
redirect_to admin_instances_path(limited: '1'), notice: I18n.t('admin.domain_blocks.created_msg')
|
||||||
else
|
else
|
||||||
|
@ -56,10 +64,6 @@ module Admin
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
|
||||||
authorize @domain_block, :show?
|
|
||||||
end
|
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
authorize @domain_block, :destroy?
|
authorize @domain_block, :destroy?
|
||||||
UnblockDomainService.new.call(@domain_block)
|
UnblockDomainService.new.call(@domain_block)
|
||||||
|
@ -80,5 +84,15 @@ module Admin
|
||||||
def resource_params
|
def resource_params
|
||||||
params.require(:domain_block).permit(:domain, :severity, :reject_media, :reject_reports, :private_comment, :public_comment, :obfuscate)
|
params.require(:domain_block).permit(:domain, :severity, :reject_media, :reject_reports, :private_comment, :public_comment, :obfuscate)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def form_domain_block_batch_params
|
||||||
|
params.require(:form_domain_block_batch).permit(domain_blocks_attributes: [:enabled, :domain, :severity, :reject_media, :reject_reports, :private_comment, :public_comment, :obfuscate])
|
||||||
|
end
|
||||||
|
|
||||||
|
def action_from_button
|
||||||
|
if params[:save]
|
||||||
|
'save'
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,7 +6,22 @@ module Admin
|
||||||
|
|
||||||
def index
|
def index
|
||||||
authorize :email_domain_block, :index?
|
authorize :email_domain_block, :index?
|
||||||
|
|
||||||
@email_domain_blocks = EmailDomainBlock.where(parent_id: nil).includes(:children).order(id: :desc).page(params[:page])
|
@email_domain_blocks = EmailDomainBlock.where(parent_id: nil).includes(:children).order(id: :desc).page(params[:page])
|
||||||
|
@form = Form::EmailDomainBlockBatch.new
|
||||||
|
end
|
||||||
|
|
||||||
|
def batch
|
||||||
|
authorize :email_domain_block, :index?
|
||||||
|
|
||||||
|
@form = Form::EmailDomainBlockBatch.new(form_email_domain_block_batch_params.merge(current_account: current_account, action: action_from_button))
|
||||||
|
@form.save
|
||||||
|
rescue ActionController::ParameterMissing
|
||||||
|
flash[:alert] = I18n.t('admin.email_domain_blocks.no_email_domain_block_selected')
|
||||||
|
rescue Mastodon::NotPermittedError
|
||||||
|
flash[:alert] = I18n.t('admin.email_domain_blocks.not_permitted')
|
||||||
|
ensure
|
||||||
|
redirect_to admin_email_domain_blocks_path
|
||||||
end
|
end
|
||||||
|
|
||||||
def new
|
def new
|
||||||
|
@ -19,41 +34,27 @@ module Admin
|
||||||
|
|
||||||
@email_domain_block = EmailDomainBlock.new(resource_params)
|
@email_domain_block = EmailDomainBlock.new(resource_params)
|
||||||
|
|
||||||
if @email_domain_block.save
|
if action_from_button == 'save'
|
||||||
log_action :create, @email_domain_block
|
EmailDomainBlock.transaction do
|
||||||
|
@email_domain_block.save!
|
||||||
|
log_action :create, @email_domain_block
|
||||||
|
|
||||||
if @email_domain_block.with_dns_records?
|
(@email_domain_block.other_domains || []).uniq.each do |domain|
|
||||||
hostnames = []
|
next if EmailDomainBlock.where(domain: domain).exists?
|
||||||
ips = []
|
|
||||||
|
|
||||||
Resolv::DNS.open do |dns|
|
other_email_domain_block = EmailDomainBlock.create!(domain: domain, parent: @email_domain_block)
|
||||||
dns.timeouts = 5
|
log_action :create, other_email_domain_block
|
||||||
|
|
||||||
hostnames = dns.getresources(@email_domain_block.domain, Resolv::DNS::Resource::IN::MX).to_a.map { |e| e.exchange.to_s }
|
|
||||||
|
|
||||||
([@email_domain_block.domain] + hostnames).uniq.each do |hostname|
|
|
||||||
ips.concat(dns.getresources(hostname, Resolv::DNS::Resource::IN::A).to_a.map { |e| e.address.to_s })
|
|
||||||
ips.concat(dns.getresources(hostname, Resolv::DNS::Resource::IN::AAAA).to_a.map { |e| e.address.to_s })
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
(hostnames + ips).each do |hostname|
|
|
||||||
another_email_domain_block = EmailDomainBlock.new(domain: hostname, parent: @email_domain_block)
|
|
||||||
log_action :create, another_email_domain_block if another_email_domain_block.save
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
redirect_to admin_email_domain_blocks_path, notice: I18n.t('admin.email_domain_blocks.created_msg')
|
redirect_to admin_email_domain_blocks_path, notice: I18n.t('admin.email_domain_blocks.created_msg')
|
||||||
else
|
else
|
||||||
|
set_resolved_records
|
||||||
render :new
|
render :new
|
||||||
end
|
end
|
||||||
end
|
rescue ActiveRecord::RecordInvalid
|
||||||
|
set_resolved_records
|
||||||
def destroy
|
render :new
|
||||||
authorize @email_domain_block, :destroy?
|
|
||||||
@email_domain_block.destroy!
|
|
||||||
log_action :destroy, @email_domain_block
|
|
||||||
redirect_to admin_email_domain_blocks_path, notice: I18n.t('admin.email_domain_blocks.destroyed_msg')
|
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
@ -62,8 +63,27 @@ module Admin
|
||||||
@email_domain_block = EmailDomainBlock.find(params[:id])
|
@email_domain_block = EmailDomainBlock.find(params[:id])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def set_resolved_records
|
||||||
|
Resolv::DNS.open do |dns|
|
||||||
|
dns.timeouts = 5
|
||||||
|
@resolved_records = dns.getresources(@email_domain_block.domain, Resolv::DNS::Resource::IN::MX).to_a
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def resource_params
|
def resource_params
|
||||||
params.require(:email_domain_block).permit(:domain, :with_dns_records)
|
params.require(:email_domain_block).permit(:domain, other_domains: [])
|
||||||
|
end
|
||||||
|
|
||||||
|
def form_email_domain_block_batch_params
|
||||||
|
params.require(:form_email_domain_block_batch).permit(email_domain_block_ids: [])
|
||||||
|
end
|
||||||
|
|
||||||
|
def action_from_button
|
||||||
|
if params[:delete]
|
||||||
|
'delete'
|
||||||
|
elsif params[:save]
|
||||||
|
'save'
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
60
app/controllers/admin/export_domain_allows_controller.rb
Normal file
60
app/controllers/admin/export_domain_allows_controller.rb
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'csv'
|
||||||
|
|
||||||
|
module Admin
|
||||||
|
class ExportDomainAllowsController < BaseController
|
||||||
|
include AdminExportControllerConcern
|
||||||
|
|
||||||
|
before_action :set_dummy_import!, only: [:new]
|
||||||
|
|
||||||
|
def new
|
||||||
|
authorize :domain_allow, :create?
|
||||||
|
end
|
||||||
|
|
||||||
|
def export
|
||||||
|
authorize :instance, :index?
|
||||||
|
send_export_file
|
||||||
|
end
|
||||||
|
|
||||||
|
def import
|
||||||
|
authorize :domain_allow, :create?
|
||||||
|
begin
|
||||||
|
@import = Admin::Import.new(import_params)
|
||||||
|
return render :new unless @import.validate
|
||||||
|
|
||||||
|
parse_import_data!(export_headers)
|
||||||
|
|
||||||
|
@data.take(Admin::Import::ROWS_PROCESSING_LIMIT).each do |row|
|
||||||
|
domain = row['#domain'].strip
|
||||||
|
next if DomainAllow.allowed?(domain)
|
||||||
|
|
||||||
|
domain_allow = DomainAllow.new(domain: domain)
|
||||||
|
log_action :create, domain_allow if domain_allow.save
|
||||||
|
end
|
||||||
|
flash[:notice] = I18n.t('admin.domain_allows.created_msg')
|
||||||
|
rescue ActionController::ParameterMissing
|
||||||
|
flash[:error] = I18n.t('admin.export_domain_allows.no_file')
|
||||||
|
end
|
||||||
|
redirect_to admin_instances_path
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def export_filename
|
||||||
|
'domain_allows.csv'
|
||||||
|
end
|
||||||
|
|
||||||
|
def export_headers
|
||||||
|
%w(#domain)
|
||||||
|
end
|
||||||
|
|
||||||
|
def export_data
|
||||||
|
CSV.generate(headers: export_headers, write_headers: true) do |content|
|
||||||
|
DomainAllow.allowed_domains.each do |instance|
|
||||||
|
content << [instance.domain]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
71
app/controllers/admin/export_domain_blocks_controller.rb
Normal file
71
app/controllers/admin/export_domain_blocks_controller.rb
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'csv'
|
||||||
|
|
||||||
|
module Admin
|
||||||
|
class ExportDomainBlocksController < BaseController
|
||||||
|
include AdminExportControllerConcern
|
||||||
|
|
||||||
|
before_action :set_dummy_import!, only: [:new]
|
||||||
|
|
||||||
|
def new
|
||||||
|
authorize :domain_block, :create?
|
||||||
|
end
|
||||||
|
|
||||||
|
def export
|
||||||
|
authorize :instance, :index?
|
||||||
|
send_export_file
|
||||||
|
end
|
||||||
|
|
||||||
|
def import
|
||||||
|
authorize :domain_block, :create?
|
||||||
|
|
||||||
|
@import = Admin::Import.new(import_params)
|
||||||
|
return render :new unless @import.validate
|
||||||
|
|
||||||
|
parse_import_data!(export_headers)
|
||||||
|
|
||||||
|
@global_private_comment = I18n.t('admin.export_domain_blocks.import.private_comment_template', source: @import.data_file_name, date: I18n.l(Time.now.utc))
|
||||||
|
|
||||||
|
@form = Form::DomainBlockBatch.new
|
||||||
|
@domain_blocks = @data.take(Admin::Import::ROWS_PROCESSING_LIMIT).filter_map do |row|
|
||||||
|
domain = row['#domain'].strip
|
||||||
|
next if DomainBlock.rule_for(domain).present?
|
||||||
|
|
||||||
|
domain_block = DomainBlock.new(domain: domain,
|
||||||
|
severity: row['#severity'].strip,
|
||||||
|
reject_media: row['#reject_media'].strip,
|
||||||
|
reject_reports: row['#reject_reports'].strip,
|
||||||
|
private_comment: @global_private_comment,
|
||||||
|
public_comment: row['#public_comment']&.strip,
|
||||||
|
obfuscate: row['#obfuscate'].strip)
|
||||||
|
|
||||||
|
domain_block if domain_block.valid?
|
||||||
|
end
|
||||||
|
|
||||||
|
@warning_domains = Instance.where(domain: @domain_blocks.map(&:domain)).where('EXISTS (SELECT 1 FROM follows JOIN accounts ON follows.account_id = accounts.id OR follows.target_account_id = accounts.id WHERE accounts.domain = instances.domain)').pluck(:domain)
|
||||||
|
rescue ActionController::ParameterMissing
|
||||||
|
flash.now[:alert] = I18n.t('admin.export_domain_blocks.no_file')
|
||||||
|
set_dummy_import!
|
||||||
|
render :new
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def export_filename
|
||||||
|
'domain_blocks.csv'
|
||||||
|
end
|
||||||
|
|
||||||
|
def export_headers
|
||||||
|
%w(#domain #severity #reject_media #reject_reports #public_comment #obfuscate)
|
||||||
|
end
|
||||||
|
|
||||||
|
def export_data
|
||||||
|
CSV.generate(headers: export_headers, write_headers: true) do |content|
|
||||||
|
DomainBlock.with_limitations.each do |instance|
|
||||||
|
content << [instance.domain, instance.severity, instance.reject_media, instance.reject_reports, instance.public_comment, instance.obfuscate]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -12,6 +12,8 @@ module Admin
|
||||||
end
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
|
authorize :follow_recommendation, :show?
|
||||||
|
|
||||||
@form = Form::AccountBatch.new(form_account_batch_params.merge(current_account: current_account, action: action_from_button))
|
@form = Form::AccountBatch.new(form_account_batch_params.merge(current_account: current_account, action: action_from_button))
|
||||||
@form.save
|
@form.save
|
||||||
rescue ActionController::ParameterMissing
|
rescue ActionController::ParameterMissing
|
||||||
|
|
|
@ -4,28 +4,26 @@ module Admin
|
||||||
class InstancesController < BaseController
|
class InstancesController < BaseController
|
||||||
before_action :set_instances, only: :index
|
before_action :set_instances, only: :index
|
||||||
before_action :set_instance, except: :index
|
before_action :set_instance, except: :index
|
||||||
before_action :set_exhausted_deliveries_days, only: :show
|
|
||||||
|
|
||||||
def index
|
def index
|
||||||
authorize :instance, :index?
|
authorize :instance, :index?
|
||||||
|
preload_delivery_failures!
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
authorize :instance, :show?
|
authorize :instance, :show?
|
||||||
|
@time_period = (6.days.ago.to_date...Time.now.utc.to_date)
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
authorize :instance, :destroy?
|
authorize :instance, :destroy?
|
||||||
|
|
||||||
Admin::DomainPurgeWorker.perform_async(@instance.domain)
|
Admin::DomainPurgeWorker.perform_async(@instance.domain)
|
||||||
|
|
||||||
log_action :destroy, @instance
|
log_action :destroy, @instance
|
||||||
redirect_to admin_instances_path, notice: I18n.t('admin.instances.destroyed_msg', domain: @instance.domain)
|
redirect_to admin_instances_path, notice: I18n.t('admin.instances.destroyed_msg', domain: @instance.domain)
|
||||||
end
|
end
|
||||||
|
|
||||||
def clear_delivery_errors
|
def clear_delivery_errors
|
||||||
authorize :delivery, :clear_delivery_errors?
|
authorize :delivery, :clear_delivery_errors?
|
||||||
|
|
||||||
@instance.delivery_failure_tracker.clear_failures!
|
@instance.delivery_failure_tracker.clear_failures!
|
||||||
redirect_to admin_instance_path(@instance.domain)
|
redirect_to admin_instance_path(@instance.domain)
|
||||||
end
|
end
|
||||||
|
@ -33,11 +31,9 @@ module Admin
|
||||||
def restart_delivery
|
def restart_delivery
|
||||||
authorize :delivery, :restart_delivery?
|
authorize :delivery, :restart_delivery?
|
||||||
|
|
||||||
last_unavailable_domain = unavailable_domain
|
if @instance.unavailable?
|
||||||
|
|
||||||
if last_unavailable_domain.present?
|
|
||||||
@instance.delivery_failure_tracker.track_success!
|
@instance.delivery_failure_tracker.track_success!
|
||||||
log_action :destroy, last_unavailable_domain
|
log_action :destroy, @instance.unavailable_domain
|
||||||
end
|
end
|
||||||
|
|
||||||
redirect_to admin_instance_path(@instance.domain)
|
redirect_to admin_instance_path(@instance.domain)
|
||||||
|
@ -45,8 +41,7 @@ module Admin
|
||||||
|
|
||||||
def stop_delivery
|
def stop_delivery
|
||||||
authorize :delivery, :stop_delivery?
|
authorize :delivery, :stop_delivery?
|
||||||
|
unavailable_domain = UnavailableDomain.create!(domain: @instance.domain)
|
||||||
UnavailableDomain.create(domain: @instance.domain)
|
|
||||||
log_action :create, unavailable_domain
|
log_action :create, unavailable_domain
|
||||||
redirect_to admin_instance_path(@instance.domain)
|
redirect_to admin_instance_path(@instance.domain)
|
||||||
end
|
end
|
||||||
|
@ -57,23 +52,18 @@ module Admin
|
||||||
@instance = Instance.find(params[:id])
|
@instance = Instance.find(params[:id])
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_exhausted_deliveries_days
|
|
||||||
@exhausted_deliveries_days = @instance.delivery_failure_tracker.exhausted_deliveries_days
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_instances
|
def set_instances
|
||||||
@instances = filtered_instances.page(params[:page])
|
@instances = filtered_instances.page(params[:page])
|
||||||
warning_domains_map = DeliveryFailureTracker.warning_domains_map
|
end
|
||||||
|
|
||||||
|
def preload_delivery_failures!
|
||||||
|
warning_domains_map = DeliveryFailureTracker.warning_domains_map(@instances.map(&:domain))
|
||||||
|
|
||||||
@instances.each do |instance|
|
@instances.each do |instance|
|
||||||
instance.failure_days = warning_domains_map[instance.domain]
|
instance.failure_days = warning_domains_map[instance.domain]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def unavailable_domain
|
|
||||||
UnavailableDomain.find_by(domain: @instance.domain)
|
|
||||||
end
|
|
||||||
|
|
||||||
def filtered_instances
|
def filtered_instances
|
||||||
InstanceFilter.new(whitelist_mode? ? { allowed: true } : filter_params).results
|
InstanceFilter.new(whitelist_mode? ? { allowed: true } : filter_params).results
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,7 +5,7 @@ module Admin
|
||||||
def index
|
def index
|
||||||
authorize :ip_block, :index?
|
authorize :ip_block, :index?
|
||||||
|
|
||||||
@ip_blocks = IpBlock.page(params[:page])
|
@ip_blocks = IpBlock.order(ip: :asc).page(params[:page])
|
||||||
@form = Form::IpBlockBatch.new
|
@form = Form::IpBlockBatch.new
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -29,6 +29,8 @@ module Admin
|
||||||
end
|
end
|
||||||
|
|
||||||
def batch
|
def batch
|
||||||
|
authorize :ip_block, :index?
|
||||||
|
|
||||||
@form = Form::IpBlockBatch.new(form_ip_block_batch_params.merge(current_account: current_account, action: action_from_button))
|
@form = Form::IpBlockBatch.new(form_ip_block_batch_params.merge(current_account: current_account, action: action_from_button))
|
||||||
@form.save
|
@form.save
|
||||||
rescue ActionController::ParameterMissing
|
rescue ActionController::ParameterMissing
|
||||||
|
|
|
@ -7,9 +7,10 @@ module Admin
|
||||||
PER_PAGE = 40
|
PER_PAGE = 40
|
||||||
|
|
||||||
def index
|
def index
|
||||||
authorize :account, :index?
|
authorize @account, :show?
|
||||||
|
|
||||||
@accounts = RelationshipFilter.new(@account, filter_params).results.page(params[:page]).per(PER_PAGE)
|
@accounts = RelationshipFilter.new(@account, filter_params).results.includes(:account_stat, user: [:ips, :invite_request]).page(params[:page]).per(PER_PAGE)
|
||||||
|
@form = Form::AccountBatch.new
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
module Admin
|
module Admin
|
||||||
class RelaysController < BaseController
|
class RelaysController < BaseController
|
||||||
before_action :set_relay, except: [:index, :new, :create]
|
before_action :set_relay, except: [:index, :new, :create]
|
||||||
before_action :require_signatures_enabled!, only: [:new, :create, :enable]
|
before_action :warn_signatures_not_enabled!, only: [:new, :create, :enable]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
authorize :relay, :update?
|
authorize :relay, :update?
|
||||||
|
@ -56,8 +56,8 @@ module Admin
|
||||||
params.require(:relay).permit(:inbox_url)
|
params.require(:relay).permit(:inbox_url)
|
||||||
end
|
end
|
||||||
|
|
||||||
def require_signatures_enabled!
|
def warn_signatures_not_enabled!
|
||||||
redirect_to admin_relays_path, alert: I18n.t('admin.relays.signatures_not_enabled') if authorized_fetch_mode?
|
flash.now[:error] = I18n.t('admin.relays.signatures_not_enabled') if authorized_fetch_mode?
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -14,20 +14,17 @@ module Admin
|
||||||
if params[:create_and_resolve]
|
if params[:create_and_resolve]
|
||||||
@report.resolve!(current_account)
|
@report.resolve!(current_account)
|
||||||
log_action :resolve, @report
|
log_action :resolve, @report
|
||||||
|
elsif params[:create_and_unresolve]
|
||||||
redirect_to admin_reports_path, notice: I18n.t('admin.reports.resolved_msg')
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if params[:create_and_unresolve]
|
|
||||||
@report.unresolve!
|
@report.unresolve!
|
||||||
log_action :reopen, @report
|
log_action :reopen, @report
|
||||||
end
|
end
|
||||||
|
|
||||||
redirect_to admin_report_path(@report), notice: I18n.t('admin.report_notes.created_msg')
|
redirect_to after_create_redirect_path, notice: I18n.t('admin.report_notes.created_msg')
|
||||||
else
|
else
|
||||||
@report_notes = (@report.notes.latest + @report.history + @report.target_account.targeted_account_warnings.latest.custom).sort_by(&:created_at)
|
@report_notes = @report.notes.includes(:account).order(id: :desc)
|
||||||
@form = Form::StatusBatch.new
|
@action_logs = @report.history.includes(:target)
|
||||||
|
@form = Admin::StatusBatchAction.new
|
||||||
|
@statuses = @report.statuses.with_includes
|
||||||
|
|
||||||
render template: 'admin/reports/show'
|
render template: 'admin/reports/show'
|
||||||
end
|
end
|
||||||
|
@ -41,6 +38,14 @@ module Admin
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def after_create_redirect_path
|
||||||
|
if params[:create_and_resolve]
|
||||||
|
admin_reports_path
|
||||||
|
else
|
||||||
|
admin_report_path(@report)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def resource_params
|
def resource_params
|
||||||
params.require(:report_note).permit(
|
params.require(:report_note).permit(
|
||||||
:content,
|
:content,
|
||||||
|
|
|
@ -1,44 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Admin
|
|
||||||
class ReportedStatusesController < BaseController
|
|
||||||
before_action :set_report
|
|
||||||
|
|
||||||
def create
|
|
||||||
authorize :status, :update?
|
|
||||||
|
|
||||||
@form = Form::StatusBatch.new(form_status_batch_params.merge(current_account: current_account, action: action_from_button))
|
|
||||||
flash[:alert] = I18n.t('admin.statuses.failed_to_execute') unless @form.save
|
|
||||||
|
|
||||||
redirect_to admin_report_path(@report)
|
|
||||||
rescue ActionController::ParameterMissing
|
|
||||||
flash[:alert] = I18n.t('admin.statuses.no_status_selected')
|
|
||||||
|
|
||||||
redirect_to admin_report_path(@report)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def status_params
|
|
||||||
params.require(:status).permit(:sensitive)
|
|
||||||
end
|
|
||||||
|
|
||||||
def form_status_batch_params
|
|
||||||
params.require(:form_status_batch).permit(status_ids: [])
|
|
||||||
end
|
|
||||||
|
|
||||||
def action_from_button
|
|
||||||
if params[:nsfw_on]
|
|
||||||
'nsfw_on'
|
|
||||||
elsif params[:nsfw_off]
|
|
||||||
'nsfw_off'
|
|
||||||
elsif params[:delete]
|
|
||||||
'delete'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_report
|
|
||||||
@report = Report.find(params[:report_id])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
52
app/controllers/admin/reports/actions_controller.rb
Normal file
52
app/controllers/admin/reports/actions_controller.rb
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Admin::Reports::ActionsController < Admin::BaseController
|
||||||
|
before_action :set_report
|
||||||
|
|
||||||
|
def create
|
||||||
|
authorize @report, :show?
|
||||||
|
|
||||||
|
case action_from_button
|
||||||
|
when 'delete', 'mark_as_sensitive'
|
||||||
|
status_batch_action = Admin::StatusBatchAction.new(
|
||||||
|
type: action_from_button,
|
||||||
|
status_ids: @report.status_ids,
|
||||||
|
current_account: current_account,
|
||||||
|
report_id: @report.id,
|
||||||
|
send_email_notification: !@report.spam?
|
||||||
|
)
|
||||||
|
|
||||||
|
status_batch_action.save!
|
||||||
|
when 'silence', 'suspend'
|
||||||
|
account_action = Admin::AccountAction.new(
|
||||||
|
type: action_from_button,
|
||||||
|
report_id: @report.id,
|
||||||
|
target_account: @report.target_account,
|
||||||
|
current_account: current_account,
|
||||||
|
send_email_notification: !@report.spam?
|
||||||
|
)
|
||||||
|
|
||||||
|
account_action.save!
|
||||||
|
end
|
||||||
|
|
||||||
|
redirect_to admin_reports_path
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_report
|
||||||
|
@report = Report.find(params[:report_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def action_from_button
|
||||||
|
if params[:delete]
|
||||||
|
'delete'
|
||||||
|
elsif params[:mark_as_sensitive]
|
||||||
|
'mark_as_sensitive'
|
||||||
|
elsif params[:silence]
|
||||||
|
'silence'
|
||||||
|
elsif params[:suspend]
|
||||||
|
'suspend'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -13,8 +13,10 @@ module Admin
|
||||||
authorize @report, :show?
|
authorize @report, :show?
|
||||||
|
|
||||||
@report_note = @report.notes.new
|
@report_note = @report.notes.new
|
||||||
@report_notes = (@report.notes.latest + @report.history + @report.target_account.targeted_account_warnings.latest.custom).sort_by(&:created_at)
|
@report_notes = @report.notes.includes(:account).order(id: :desc)
|
||||||
@form = Form::StatusBatch.new
|
@action_logs = @report.history.includes(:target)
|
||||||
|
@form = Admin::StatusBatchAction.new
|
||||||
|
@statuses = @report.statuses.with_includes
|
||||||
end
|
end
|
||||||
|
|
||||||
def assign_to_self
|
def assign_to_self
|
||||||
|
@ -48,7 +50,7 @@ module Admin
|
||||||
private
|
private
|
||||||
|
|
||||||
def filtered_reports
|
def filtered_reports
|
||||||
ReportFilter.new(filter_params).results.includes(:account, :target_account)
|
ReportFilter.new(filter_params).results.order(id: :desc).includes(:account, :target_account)
|
||||||
end
|
end
|
||||||
|
|
||||||
def filter_params
|
def filter_params
|
||||||
|
|
|
@ -2,20 +2,66 @@
|
||||||
|
|
||||||
module Admin
|
module Admin
|
||||||
class RolesController < BaseController
|
class RolesController < BaseController
|
||||||
before_action :set_user
|
before_action :set_role, except: [:index, :new, :create]
|
||||||
|
|
||||||
def promote
|
def index
|
||||||
authorize @user, :promote?
|
authorize :user_role, :index?
|
||||||
@user.promote!
|
|
||||||
log_action :promote, @user
|
@roles = UserRole.order(position: :desc).page(params[:page])
|
||||||
redirect_to admin_account_path(@user.account_id)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def demote
|
def new
|
||||||
authorize @user, :demote?
|
authorize :user_role, :create?
|
||||||
@user.demote!
|
|
||||||
log_action :demote, @user
|
@role = UserRole.new
|
||||||
redirect_to admin_account_path(@user.account_id)
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
authorize :user_role, :create?
|
||||||
|
|
||||||
|
@role = UserRole.new(resource_params)
|
||||||
|
@role.current_account = current_account
|
||||||
|
|
||||||
|
if @role.save
|
||||||
|
log_action :create, @role
|
||||||
|
redirect_to admin_roles_path
|
||||||
|
else
|
||||||
|
render :new
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def edit
|
||||||
|
authorize @role, :update?
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
authorize @role, :update?
|
||||||
|
|
||||||
|
@role.current_account = current_account
|
||||||
|
|
||||||
|
if @role.update(resource_params)
|
||||||
|
log_action :update, @role
|
||||||
|
redirect_to admin_roles_path
|
||||||
|
else
|
||||||
|
render :edit
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
authorize @role, :destroy?
|
||||||
|
@role.destroy!
|
||||||
|
log_action :destroy, @role
|
||||||
|
redirect_to admin_roles_path
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_role
|
||||||
|
@role = UserRole.find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def resource_params
|
||||||
|
params.require(:user_role).permit(:name, :color, :highlighted, :position, permissions_as_keys: [])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
9
app/controllers/admin/settings/about_controller.rb
Normal file
9
app/controllers/admin/settings/about_controller.rb
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Admin::Settings::AboutController < Admin::SettingsController
|
||||||
|
private
|
||||||
|
|
||||||
|
def after_update_redirect_path
|
||||||
|
admin_settings_about_path
|
||||||
|
end
|
||||||
|
end
|
9
app/controllers/admin/settings/appearance_controller.rb
Normal file
9
app/controllers/admin/settings/appearance_controller.rb
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Admin::Settings::AppearanceController < Admin::SettingsController
|
||||||
|
private
|
||||||
|
|
||||||
|
def after_update_redirect_path
|
||||||
|
admin_settings_appearance_path
|
||||||
|
end
|
||||||
|
end
|
9
app/controllers/admin/settings/branding_controller.rb
Normal file
9
app/controllers/admin/settings/branding_controller.rb
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Admin::Settings::BrandingController < Admin::SettingsController
|
||||||
|
private
|
||||||
|
|
||||||
|
def after_update_redirect_path
|
||||||
|
admin_settings_branding_path
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,9 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Admin::Settings::ContentRetentionController < Admin::SettingsController
|
||||||
|
private
|
||||||
|
|
||||||
|
def after_update_redirect_path
|
||||||
|
admin_settings_content_retention_path
|
||||||
|
end
|
||||||
|
end
|
9
app/controllers/admin/settings/discovery_controller.rb
Normal file
9
app/controllers/admin/settings/discovery_controller.rb
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Admin::Settings::DiscoveryController < Admin::SettingsController
|
||||||
|
private
|
||||||
|
|
||||||
|
def after_update_redirect_path
|
||||||
|
admin_settings_discovery_path
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,9 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Admin::Settings::RegistrationsController < Admin::SettingsController
|
||||||
|
private
|
||||||
|
|
||||||
|
def after_update_redirect_path
|
||||||
|
admin_settings_registrations_path
|
||||||
|
end
|
||||||
|
end
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
module Admin
|
module Admin
|
||||||
class SettingsController < BaseController
|
class SettingsController < BaseController
|
||||||
def edit
|
def show
|
||||||
authorize :settings, :show?
|
authorize :settings, :show?
|
||||||
|
|
||||||
@admin_settings = Form::AdminSettings.new
|
@admin_settings = Form::AdminSettings.new
|
||||||
|
@ -15,14 +15,18 @@ module Admin
|
||||||
|
|
||||||
if @admin_settings.save
|
if @admin_settings.save
|
||||||
flash[:notice] = I18n.t('generic.changes_saved_msg')
|
flash[:notice] = I18n.t('generic.changes_saved_msg')
|
||||||
redirect_to edit_admin_settings_path
|
redirect_to after_update_redirect_path
|
||||||
else
|
else
|
||||||
render :edit
|
render :show
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def after_update_redirect_path
|
||||||
|
raise NotImplementedError
|
||||||
|
end
|
||||||
|
|
||||||
def settings_params
|
def settings_params
|
||||||
params.require(:form_admin_settings).permit(*Form::AdminSettings::KEYS)
|
params.require(:form_admin_settings).permit(*Form::AdminSettings::KEYS)
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Admin
|
|
||||||
class SignInTokenAuthenticationsController < BaseController
|
|
||||||
before_action :set_target_user
|
|
||||||
|
|
||||||
def create
|
|
||||||
authorize @user, :enable_sign_in_token_auth?
|
|
||||||
@user.update(skip_sign_in_token: false)
|
|
||||||
log_action :enable_sign_in_token_auth, @user
|
|
||||||
redirect_to admin_account_path(@user.account_id)
|
|
||||||
end
|
|
||||||
|
|
||||||
def destroy
|
|
||||||
authorize @user, :disable_sign_in_token_auth?
|
|
||||||
@user.update(skip_sign_in_token: true)
|
|
||||||
log_action :disable_sign_in_token_auth, @user
|
|
||||||
redirect_to admin_account_path(@user.account_id)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def set_target_user
|
|
||||||
@user = User.find(params[:user_id])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -9,7 +9,7 @@ module Admin
|
||||||
|
|
||||||
@site_upload.destroy!
|
@site_upload.destroy!
|
||||||
|
|
||||||
redirect_to edit_admin_settings_path, notice: I18n.t('admin.site_uploads.destroyed_msg')
|
redirect_to admin_settings_path, notice: I18n.t('admin.site_uploads.destroyed_msg')
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -2,71 +2,74 @@
|
||||||
|
|
||||||
module Admin
|
module Admin
|
||||||
class StatusesController < BaseController
|
class StatusesController < BaseController
|
||||||
helper_method :current_params
|
|
||||||
|
|
||||||
before_action :set_account
|
before_action :set_account
|
||||||
|
before_action :set_statuses, except: :show
|
||||||
|
before_action :set_status, only: :show
|
||||||
|
|
||||||
PER_PAGE = 20
|
PER_PAGE = 20
|
||||||
|
|
||||||
def index
|
def index
|
||||||
authorize :status, :index?
|
authorize [:admin, :status], :index?
|
||||||
|
|
||||||
@statuses = @account.statuses.where(visibility: [:public, :unlisted])
|
@status_batch_action = Admin::StatusBatchAction.new
|
||||||
|
|
||||||
if params[:media]
|
|
||||||
@statuses = @statuses.merge(Status.joins(:media_attachments).merge(@account.media_attachments.reorder(nil)).group(:id)).reorder('statuses.id desc')
|
|
||||||
end
|
|
||||||
|
|
||||||
@statuses = @statuses.preload(:media_attachments, :mentions).page(params[:page]).per(PER_PAGE)
|
|
||||||
@form = Form::StatusBatch.new
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
authorize :status, :index?
|
authorize [:admin, @status], :show?
|
||||||
|
|
||||||
@statuses = @account.statuses.where(id: params[:id])
|
|
||||||
authorize @statuses.first, :show?
|
|
||||||
|
|
||||||
@form = Form::StatusBatch.new
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def batch
|
||||||
authorize :status, :update?
|
authorize [:admin, :status], :index?
|
||||||
|
|
||||||
@form = Form::StatusBatch.new(form_status_batch_params.merge(current_account: current_account, action: action_from_button))
|
@status_batch_action = Admin::StatusBatchAction.new(admin_status_batch_action_params.merge(current_account: current_account, report_id: params[:report_id], type: action_from_button))
|
||||||
flash[:alert] = I18n.t('admin.statuses.failed_to_execute') unless @form.save
|
@status_batch_action.save!
|
||||||
|
|
||||||
redirect_to admin_account_statuses_path(@account.id, current_params)
|
|
||||||
rescue ActionController::ParameterMissing
|
rescue ActionController::ParameterMissing
|
||||||
flash[:alert] = I18n.t('admin.statuses.no_status_selected')
|
flash[:alert] = I18n.t('admin.statuses.no_status_selected')
|
||||||
|
ensure
|
||||||
redirect_to admin_account_statuses_path(@account.id, current_params)
|
redirect_to after_create_redirect_path
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def form_status_batch_params
|
def admin_status_batch_action_params
|
||||||
params.require(:form_status_batch).permit(:action, status_ids: [])
|
params.require(:admin_status_batch_action).permit(status_ids: [])
|
||||||
|
end
|
||||||
|
|
||||||
|
def after_create_redirect_path
|
||||||
|
report_id = @status_batch_action&.report_id || params[:report_id]
|
||||||
|
|
||||||
|
if report_id.present?
|
||||||
|
admin_report_path(report_id)
|
||||||
|
else
|
||||||
|
admin_account_statuses_path(params[:account_id], current_params)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_account
|
def set_account
|
||||||
@account = Account.find(params[:account_id])
|
@account = Account.find(params[:account_id])
|
||||||
end
|
end
|
||||||
|
|
||||||
def current_params
|
def set_status
|
||||||
page = (params[:page] || 1).to_i
|
@status = @account.statuses.find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
{
|
def set_statuses
|
||||||
media: params[:media],
|
@statuses = Admin::StatusFilter.new(@account, filter_params).results.preload(:application, :preloadable_poll, :media_attachments, active_mentions: :account, reblog: [:account, :application, :preloadable_poll, :media_attachments, active_mentions: :account]).page(params[:page]).per(PER_PAGE)
|
||||||
page: page > 1 && page,
|
end
|
||||||
}.select { |_, value| value.present? }
|
|
||||||
|
def filter_params
|
||||||
|
params.slice(*Admin::StatusFilter::KEYS).permit(*Admin::StatusFilter::KEYS)
|
||||||
|
end
|
||||||
|
|
||||||
|
def current_params
|
||||||
|
params.slice(:media, :page).permit(:media, :page)
|
||||||
end
|
end
|
||||||
|
|
||||||
def action_from_button
|
def action_from_button
|
||||||
if params[:nsfw_on]
|
if params[:report]
|
||||||
'nsfw_on'
|
'report'
|
||||||
elsif params[:nsfw_off]
|
elsif params[:remove_from_report]
|
||||||
'nsfw_off'
|
'remove_from_report'
|
||||||
elsif params[:delete]
|
elsif params[:delete]
|
||||||
'delete'
|
'delete'
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Admin
|
|
||||||
class SubscriptionsController < BaseController
|
|
||||||
def index
|
|
||||||
authorize :subscription, :index?
|
|
||||||
@subscriptions = ordered_subscriptions.page(requested_page)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def ordered_subscriptions
|
|
||||||
Subscription.order(id: :desc).includes(:account)
|
|
||||||
end
|
|
||||||
|
|
||||||
def requested_page
|
|
||||||
params[:page].to_i
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -16,6 +16,8 @@ module Admin
|
||||||
if @tag.update(tag_params.merge(reviewed_at: Time.now.utc))
|
if @tag.update(tag_params.merge(reviewed_at: Time.now.utc))
|
||||||
redirect_to admin_tag_path(@tag.id), notice: I18n.t('admin.tags.updated_msg')
|
redirect_to admin_tag_path(@tag.id), notice: I18n.t('admin.tags.updated_msg')
|
||||||
else
|
else
|
||||||
|
@time_period = (6.days.ago.to_date...Time.now.utc.to_date)
|
||||||
|
|
||||||
render :show
|
render :show
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -27,7 +29,7 @@ module Admin
|
||||||
end
|
end
|
||||||
|
|
||||||
def tag_params
|
def tag_params
|
||||||
params.require(:tag).permit(:name, :trendable, :usable, :listable)
|
params.require(:tag).permit(:name, :display_name, :trendable, :usable, :listable)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,17 +2,19 @@
|
||||||
|
|
||||||
class Admin::Trends::Links::PreviewCardProvidersController < Admin::BaseController
|
class Admin::Trends::Links::PreviewCardProvidersController < Admin::BaseController
|
||||||
def index
|
def index
|
||||||
authorize :preview_card_provider, :index?
|
authorize :preview_card_provider, :review?
|
||||||
|
|
||||||
@preview_card_providers = filtered_preview_card_providers.page(params[:page])
|
@preview_card_providers = filtered_preview_card_providers.page(params[:page])
|
||||||
@form = Form::PreviewCardProviderBatch.new
|
@form = Trends::PreviewCardProviderBatch.new
|
||||||
end
|
end
|
||||||
|
|
||||||
def batch
|
def batch
|
||||||
@form = Form::PreviewCardProviderBatch.new(form_preview_card_provider_batch_params.merge(current_account: current_account, action: action_from_button))
|
authorize :preview_card_provider, :review?
|
||||||
|
|
||||||
|
@form = Trends::PreviewCardProviderBatch.new(trends_preview_card_provider_batch_params.merge(current_account: current_account, action: action_from_button))
|
||||||
@form.save
|
@form.save
|
||||||
rescue ActionController::ParameterMissing
|
rescue ActionController::ParameterMissing
|
||||||
flash[:alert] = I18n.t('admin.accounts.no_account_selected')
|
flash[:alert] = I18n.t('admin.trends.links.publishers.no_publisher_selected')
|
||||||
ensure
|
ensure
|
||||||
redirect_to admin_trends_links_preview_card_providers_path(filter_params)
|
redirect_to admin_trends_links_preview_card_providers_path(filter_params)
|
||||||
end
|
end
|
||||||
|
@ -20,15 +22,15 @@ class Admin::Trends::Links::PreviewCardProvidersController < Admin::BaseControll
|
||||||
private
|
private
|
||||||
|
|
||||||
def filtered_preview_card_providers
|
def filtered_preview_card_providers
|
||||||
PreviewCardProviderFilter.new(filter_params).results
|
Trends::PreviewCardProviderFilter.new(filter_params).results
|
||||||
end
|
end
|
||||||
|
|
||||||
def filter_params
|
def filter_params
|
||||||
params.slice(:page, *PreviewCardProviderFilter::KEYS).permit(:page, *PreviewCardProviderFilter::KEYS)
|
params.slice(:page, *Trends::PreviewCardProviderFilter::KEYS).permit(:page, *Trends::PreviewCardProviderFilter::KEYS)
|
||||||
end
|
end
|
||||||
|
|
||||||
def form_preview_card_provider_batch_params
|
def trends_preview_card_provider_batch_params
|
||||||
params.require(:form_preview_card_provider_batch).permit(:action, preview_card_provider_ids: [])
|
params.require(:trends_preview_card_provider_batch).permit(:action, preview_card_provider_ids: [])
|
||||||
end
|
end
|
||||||
|
|
||||||
def action_from_button
|
def action_from_button
|
||||||
|
|
|
@ -2,17 +2,20 @@
|
||||||
|
|
||||||
class Admin::Trends::LinksController < Admin::BaseController
|
class Admin::Trends::LinksController < Admin::BaseController
|
||||||
def index
|
def index
|
||||||
authorize :preview_card, :index?
|
authorize :preview_card, :review?
|
||||||
|
|
||||||
|
@locales = PreviewCardTrend.pluck('distinct language')
|
||||||
@preview_cards = filtered_preview_cards.page(params[:page])
|
@preview_cards = filtered_preview_cards.page(params[:page])
|
||||||
@form = Form::PreviewCardBatch.new
|
@form = Trends::PreviewCardBatch.new
|
||||||
end
|
end
|
||||||
|
|
||||||
def batch
|
def batch
|
||||||
@form = Form::PreviewCardBatch.new(form_preview_card_batch_params.merge(current_account: current_account, action: action_from_button))
|
authorize :preview_card, :review?
|
||||||
|
|
||||||
|
@form = Trends::PreviewCardBatch.new(trends_preview_card_batch_params.merge(current_account: current_account, action: action_from_button))
|
||||||
@form.save
|
@form.save
|
||||||
rescue ActionController::ParameterMissing
|
rescue ActionController::ParameterMissing
|
||||||
flash[:alert] = I18n.t('admin.accounts.no_account_selected')
|
flash[:alert] = I18n.t('admin.trends.links.no_link_selected')
|
||||||
ensure
|
ensure
|
||||||
redirect_to admin_trends_links_path(filter_params)
|
redirect_to admin_trends_links_path(filter_params)
|
||||||
end
|
end
|
||||||
|
@ -20,26 +23,26 @@ class Admin::Trends::LinksController < Admin::BaseController
|
||||||
private
|
private
|
||||||
|
|
||||||
def filtered_preview_cards
|
def filtered_preview_cards
|
||||||
PreviewCardFilter.new(filter_params.with_defaults(trending: 'all')).results
|
Trends::PreviewCardFilter.new(filter_params.with_defaults(trending: 'all')).results
|
||||||
end
|
end
|
||||||
|
|
||||||
def filter_params
|
def filter_params
|
||||||
params.slice(:page, *PreviewCardFilter::KEYS).permit(:page, *PreviewCardFilter::KEYS)
|
params.slice(:page, *Trends::PreviewCardFilter::KEYS).permit(:page, *Trends::PreviewCardFilter::KEYS)
|
||||||
end
|
end
|
||||||
|
|
||||||
def form_preview_card_batch_params
|
def trends_preview_card_batch_params
|
||||||
params.require(:form_preview_card_batch).permit(:action, preview_card_ids: [])
|
params.require(:trends_preview_card_batch).permit(:action, preview_card_ids: [])
|
||||||
end
|
end
|
||||||
|
|
||||||
def action_from_button
|
def action_from_button
|
||||||
if params[:approve]
|
if params[:approve]
|
||||||
'approve'
|
'approve'
|
||||||
elsif params[:approve_all]
|
elsif params[:approve_providers]
|
||||||
'approve_all'
|
'approve_providers'
|
||||||
elsif params[:reject]
|
elsif params[:reject]
|
||||||
'reject'
|
'reject'
|
||||||
elsif params[:reject_all]
|
elsif params[:reject_providers]
|
||||||
'reject_all'
|
'reject_providers'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
48
app/controllers/admin/trends/statuses_controller.rb
Normal file
48
app/controllers/admin/trends/statuses_controller.rb
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Admin::Trends::StatusesController < Admin::BaseController
|
||||||
|
def index
|
||||||
|
authorize [:admin, :status], :review?
|
||||||
|
|
||||||
|
@locales = StatusTrend.pluck('distinct language')
|
||||||
|
@statuses = filtered_statuses.page(params[:page])
|
||||||
|
@form = Trends::StatusBatch.new
|
||||||
|
end
|
||||||
|
|
||||||
|
def batch
|
||||||
|
authorize [:admin, :status], :review?
|
||||||
|
|
||||||
|
@form = Trends::StatusBatch.new(trends_status_batch_params.merge(current_account: current_account, action: action_from_button))
|
||||||
|
@form.save
|
||||||
|
rescue ActionController::ParameterMissing
|
||||||
|
flash[:alert] = I18n.t('admin.trends.statuses.no_status_selected')
|
||||||
|
ensure
|
||||||
|
redirect_to admin_trends_statuses_path(filter_params)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def filtered_statuses
|
||||||
|
Trends::StatusFilter.new(filter_params.with_defaults(trending: 'all')).results.includes(:account, :media_attachments, :active_mentions)
|
||||||
|
end
|
||||||
|
|
||||||
|
def filter_params
|
||||||
|
params.slice(:page, *Trends::StatusFilter::KEYS).permit(:page, *Trends::StatusFilter::KEYS)
|
||||||
|
end
|
||||||
|
|
||||||
|
def trends_status_batch_params
|
||||||
|
params.require(:trends_status_batch).permit(:action, status_ids: [])
|
||||||
|
end
|
||||||
|
|
||||||
|
def action_from_button
|
||||||
|
if params[:approve]
|
||||||
|
'approve'
|
||||||
|
elsif params[:approve_accounts]
|
||||||
|
'approve_accounts'
|
||||||
|
elsif params[:reject]
|
||||||
|
'reject'
|
||||||
|
elsif params[:reject_accounts]
|
||||||
|
'reject_accounts'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -2,17 +2,19 @@
|
||||||
|
|
||||||
class Admin::Trends::TagsController < Admin::BaseController
|
class Admin::Trends::TagsController < Admin::BaseController
|
||||||
def index
|
def index
|
||||||
authorize :tag, :index?
|
authorize :tag, :review?
|
||||||
|
|
||||||
@tags = filtered_tags.page(params[:page])
|
@tags = filtered_tags.page(params[:page])
|
||||||
@form = Form::TagBatch.new
|
@form = Trends::TagBatch.new
|
||||||
end
|
end
|
||||||
|
|
||||||
def batch
|
def batch
|
||||||
@form = Form::TagBatch.new(form_tag_batch_params.merge(current_account: current_account, action: action_from_button))
|
authorize :tag, :review?
|
||||||
|
|
||||||
|
@form = Trends::TagBatch.new(trends_tag_batch_params.merge(current_account: current_account, action: action_from_button))
|
||||||
@form.save
|
@form.save
|
||||||
rescue ActionController::ParameterMissing
|
rescue ActionController::ParameterMissing
|
||||||
flash[:alert] = I18n.t('admin.accounts.no_account_selected')
|
flash[:alert] = I18n.t('admin.trends.tags.no_tag_selected')
|
||||||
ensure
|
ensure
|
||||||
redirect_to admin_trends_tags_path(filter_params)
|
redirect_to admin_trends_tags_path(filter_params)
|
||||||
end
|
end
|
||||||
|
@ -20,15 +22,15 @@ class Admin::Trends::TagsController < Admin::BaseController
|
||||||
private
|
private
|
||||||
|
|
||||||
def filtered_tags
|
def filtered_tags
|
||||||
TagFilter.new(filter_params).results
|
Trends::TagFilter.new(filter_params).results
|
||||||
end
|
end
|
||||||
|
|
||||||
def filter_params
|
def filter_params
|
||||||
params.slice(:page, *TagFilter::KEYS).permit(:page, *TagFilter::KEYS)
|
params.slice(:page, *Trends::TagFilter::KEYS).permit(:page, *Trends::TagFilter::KEYS)
|
||||||
end
|
end
|
||||||
|
|
||||||
def form_tag_batch_params
|
def trends_tag_batch_params
|
||||||
params.require(:form_tag_batch).permit(:action, tag_ids: [])
|
params.require(:trends_tag_batch).permit(:action, tag_ids: [])
|
||||||
end
|
end
|
||||||
|
|
||||||
def action_from_button
|
def action_from_button
|
||||||
|
|
34
app/controllers/admin/users/roles_controller.rb
Normal file
34
app/controllers/admin/users/roles_controller.rb
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Admin
|
||||||
|
class Users::RolesController < BaseController
|
||||||
|
before_action :set_user
|
||||||
|
|
||||||
|
def show
|
||||||
|
authorize @user, :change_role?
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
authorize @user, :change_role?
|
||||||
|
|
||||||
|
@user.current_account = current_account
|
||||||
|
|
||||||
|
if @user.update(resource_params)
|
||||||
|
log_action :change_role, @user
|
||||||
|
redirect_to admin_account_path(@user.account_id), notice: I18n.t('admin.accounts.change_role.changed_msg')
|
||||||
|
else
|
||||||
|
render :show
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_user
|
||||||
|
@user = User.find(params[:user_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def resource_params
|
||||||
|
params.require(:user).permit(:role_id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module Admin
|
module Admin
|
||||||
class TwoFactorAuthenticationsController < BaseController
|
class Users::TwoFactorAuthenticationsController < BaseController
|
||||||
before_action :set_target_user
|
before_action :set_target_user
|
||||||
|
|
||||||
def destroy
|
def destroy
|
19
app/controllers/admin/webhooks/secrets_controller.rb
Normal file
19
app/controllers/admin/webhooks/secrets_controller.rb
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Admin
|
||||||
|
class Webhooks::SecretsController < BaseController
|
||||||
|
before_action :set_webhook
|
||||||
|
|
||||||
|
def rotate
|
||||||
|
authorize @webhook, :rotate_secret?
|
||||||
|
@webhook.rotate_secret!
|
||||||
|
redirect_to admin_webhook_path(@webhook)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_webhook
|
||||||
|
@webhook = Webhook.find(params[:webhook_id])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
77
app/controllers/admin/webhooks_controller.rb
Normal file
77
app/controllers/admin/webhooks_controller.rb
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Admin
|
||||||
|
class WebhooksController < BaseController
|
||||||
|
before_action :set_webhook, except: [:index, :new, :create]
|
||||||
|
|
||||||
|
def index
|
||||||
|
authorize :webhook, :index?
|
||||||
|
|
||||||
|
@webhooks = Webhook.page(params[:page])
|
||||||
|
end
|
||||||
|
|
||||||
|
def new
|
||||||
|
authorize :webhook, :create?
|
||||||
|
|
||||||
|
@webhook = Webhook.new
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
authorize :webhook, :create?
|
||||||
|
|
||||||
|
@webhook = Webhook.new(resource_params)
|
||||||
|
|
||||||
|
if @webhook.save
|
||||||
|
redirect_to admin_webhook_path(@webhook)
|
||||||
|
else
|
||||||
|
render :new
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def show
|
||||||
|
authorize @webhook, :show?
|
||||||
|
end
|
||||||
|
|
||||||
|
def edit
|
||||||
|
authorize @webhook, :update?
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
authorize @webhook, :update?
|
||||||
|
|
||||||
|
if @webhook.update(resource_params)
|
||||||
|
redirect_to admin_webhook_path(@webhook)
|
||||||
|
else
|
||||||
|
render :show
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def enable
|
||||||
|
authorize @webhook, :enable?
|
||||||
|
@webhook.enable!
|
||||||
|
redirect_to admin_webhook_path(@webhook)
|
||||||
|
end
|
||||||
|
|
||||||
|
def disable
|
||||||
|
authorize @webhook, :disable?
|
||||||
|
@webhook.disable!
|
||||||
|
redirect_to admin_webhook_path(@webhook)
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
authorize @webhook, :destroy?
|
||||||
|
@webhook.destroy!
|
||||||
|
redirect_to admin_webhooks_path
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_webhook
|
||||||
|
@webhook = Webhook.find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def resource_params
|
||||||
|
params.require(:webhook).permit(:url, events: [])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue