Compare commits
582 commits
wip/reacti
...
main
Author | SHA1 | Date | |
---|---|---|---|
|
6c28810b39 | ||
|
48b9837ad8 | ||
|
9b0c46ebf2 | ||
|
e853355f24 | ||
|
20fdf8e22c | ||
|
7b3eef4cb1 | ||
|
0a2110b9af | ||
|
00cf8d3748 | ||
|
2bcbeed951 | ||
|
ca5955ed76 | ||
|
e46321e63d | ||
|
de4815afda | ||
|
def6b686ff | ||
|
70608f824e | ||
|
9658d3e580 | ||
|
0ce22859a5 | ||
|
8b75d18371 | ||
|
814d00cf4b | ||
|
778bd96a52 | ||
|
990a0c19a9 | ||
|
0f07e1cd4c | ||
|
0a343b9a91 | ||
|
a178ba7cd5 | ||
|
6282b6da77 | ||
|
93a617236e | ||
|
2da2a1dae9 | ||
|
57fb2cf948 | ||
|
9668ac5acd | ||
|
12472e7f40 | ||
|
a627219b25 | ||
|
bff7769f5f | ||
|
a6d12299f2 | ||
|
fc166d07f0 | ||
|
3286ad5226 | ||
|
f7f5b9dadd | ||
|
226d7a7bad | ||
|
87b5cfc60e | ||
|
7b078b46a2 | ||
|
061464a563 | ||
|
2810231180 | ||
|
b2388be71e | ||
|
66906a1bc1 | ||
|
1b6eb2c7f0 | ||
|
283a891e92 | ||
|
65e82211cd | ||
|
f0d6dc4519 | ||
|
356bbbaa7f | ||
|
cdb042ae86 | ||
|
c9ee1437c0 | ||
|
60b423b3f7 | ||
|
94493cff92 | ||
|
ca560c1095 | ||
|
d5d3a0fc57 | ||
|
5fd56512de | ||
|
c2ca3d152f | ||
|
4e085dff52 | ||
|
19ed3d9441 | ||
|
85c625d319 | ||
|
6beead3867 | ||
|
aad5e841b5 | ||
|
78a8263f73 | ||
|
7f7eba8753 | ||
|
40639510f8 | ||
|
44e855db78 | ||
|
508e93eb64 | ||
|
38a330f963 | ||
|
4f37b4873f | ||
|
47ce5f4ca9 | ||
|
160823716a | ||
|
666760f450 | ||
|
1bf661cddb | ||
|
b5b84fad65 | ||
|
3a7aec2807 | ||
|
13fb54920b | ||
|
9ec7c1f892 | ||
|
6e1b8b33f5 | ||
|
b429c9b8a7 | ||
|
c66fdb3dff | ||
|
cb93c1edf0 | ||
|
f66c9faca0 | ||
|
123108b1cc | ||
|
5e7d88a85d | ||
|
471728d6dd | ||
|
ab4efa3bf8 | ||
|
807cf354fc | ||
|
5ed6622a00 | ||
|
f65a6d50f1 | ||
|
f35ba6963d | ||
|
1959365c2f | ||
|
346530732c | ||
|
9920f41c0f | ||
|
d09b02efb6 | ||
|
482d1087c5 | ||
|
af71f236a2 | ||
|
d933e6b6ae | ||
|
ded11eca4f | ||
|
68b9fe824d | ||
|
0d397db5dd | ||
|
164b09bfcc | ||
|
e20f2e7300 | ||
|
f3f63107f2 | ||
|
fa43a6c835 | ||
|
040aaf3a48 | ||
|
c9557bdd3b | ||
|
3a5a1b2e58 | ||
|
1aa3976f28 | ||
|
0a4a93038f | ||
|
c36a8786c1 | ||
|
6ccee2600b | ||
|
6819bcc4b6 | ||
|
5a3062f723 | ||
|
012698f97a | ||
|
ac041ceefa | ||
|
f26fba7473 | ||
|
3286daa807 | ||
|
21c904b0f6 | ||
|
d8c4284723 | ||
|
c9ccba7045 | ||
|
f7dadc9f0b | ||
|
5cd13ee4f1 | ||
|
8540004f7b | ||
|
ed556db395 | ||
|
96fb6e491f | ||
|
996292cd55 | ||
|
b636ca2099 | ||
|
6167894547 | ||
|
016d194274 | ||
|
2fe1b8d169 | ||
|
bc24c4792d | ||
|
b152f936c1 | ||
|
05126d106f | ||
|
116f01ec7d | ||
|
30ef9fccf0 | ||
|
8e4fea77e3 | ||
|
dbaa4ed891 | ||
|
e5062b7135 | ||
|
4f0d18168c | ||
|
00c34070ae | ||
|
86f17e4b32 | ||
|
9be2c02e52 | ||
|
a96b828023 | ||
|
d544b83f91 | ||
|
e4841ca82b | ||
|
e9cca1cc09 | ||
|
2f73e486b7 | ||
|
c59f6ef5b8 | ||
|
b6ada33ad4 | ||
|
3789d9f825 | ||
|
4b82dc84f5 | ||
|
6662d604c1 | ||
|
e62595c966 | ||
|
f09f5b35f2 | ||
|
494d28bb56 | ||
|
fe7db7905f | ||
|
defd1e4024 | ||
|
a76980a229 | ||
|
552e09d57f | ||
|
a4ce53df27 | ||
|
aac59a34ed | ||
|
8dbcf8a287 | ||
|
d6f9c97ae4 | ||
|
333905b2d5 | ||
|
bac4026d80 | ||
|
bceb45adda | ||
|
b7902225d6 | ||
|
33368e3e79 | ||
|
9aa31be8d3 | ||
|
d5444a2c6c | ||
|
9380805fc1 | ||
|
a7b905d573 | ||
|
4b2054ee57 | ||
|
253ead3aa7 | ||
|
9e260014c7 | ||
|
e7b09486ed | ||
|
616e2f2666 | ||
|
88882fbbee | ||
|
1e7d5d2957 | ||
|
309f352e6a | ||
|
2447497a4c | ||
|
d97d31cce6 | ||
|
ac1d830e6c | ||
|
474e5ffaae | ||
|
62992ba54a | ||
|
a9dd68b90a | ||
|
b039e62194 | ||
|
eeefb7cdbc | ||
|
6204d13a2e | ||
|
360590ecd8 | ||
|
df933836ca | ||
|
62b3f284db | ||
|
946bd2e7e1 | ||
|
ac5113d524 | ||
|
e76ddf79bc | ||
|
6f342a6d4c | ||
|
2d43547934 | ||
|
9ce82a35cb | ||
|
555e33a392 | ||
|
3739dda2f6 | ||
|
0fb469e2f3 | ||
|
41c43168fb | ||
|
b21322b406 | ||
|
4543bb9384 | ||
|
3503fe1865 | ||
|
46cc9141c9 | ||
|
15f6d2d038 | ||
|
87b9b23025 | ||
|
c316852a65 | ||
|
297c8c37b1 | ||
|
0f756eaed2 | ||
|
2c386d4cfe | ||
|
d52263e0e3 | ||
|
3b1c8d56b2 | ||
|
1783820acd | ||
|
375bd52d97 | ||
|
7f404fd635 | ||
|
b3d5567bd0 | ||
|
0f90e624c5 | ||
|
bc370938ef | ||
|
cc720cd38f | ||
|
0ab212f6a9 | ||
|
02f9ce9ce3 | ||
|
5cb4adbf4e | ||
|
555f45f249 | ||
|
371c5e59eb | ||
|
059e10e546 | ||
|
3f61981f5d | ||
|
03af271d3d | ||
|
7b46517c38 | ||
|
d63c0a2879 | ||
|
a6147a831f | ||
|
3024212403 | ||
|
26e10aa203 | ||
|
d6048d3a6c | ||
|
8a34c42341 | ||
|
6f74ede26b | ||
|
75470f1256 | ||
|
f3ea90b89e | ||
|
56821ed879 | ||
|
40d7a553d2 | ||
|
f5376c477d | ||
|
81f0002e76 | ||
|
b8f0a50435 | ||
|
f5d6362e90 | ||
|
924af400da | ||
|
f1a4b4e228 | ||
|
7d3fe2b4c3 | ||
|
ac7f4d57bb | ||
|
95e9de5777 | ||
|
e336466894 | ||
|
a9816f051d | ||
|
b9b4db483c | ||
|
2739d8d5a4 | ||
|
bbf1b603e0 | ||
|
6931cf5727 | ||
|
2123281f7c | ||
|
f0c9cbaf3b | ||
|
4527e012da | ||
|
9be7efedf0 | ||
|
00aec2f33a | ||
|
0efa9854a1 | ||
|
23223369e0 | ||
|
c0584a6f4f | ||
|
31f3dd57e0 | ||
|
d8a4cea41b | ||
|
36909065b5 | ||
|
4f4b77920e | ||
|
7201f99cf8 | ||
|
e0a3662d7b | ||
|
7208edbd37 | ||
|
c3e12a4dfa | ||
|
93cdc66e64 | ||
|
dee57982f1 | ||
|
9a8be8cf49 | ||
|
62bc36416f | ||
|
65093c619f | ||
|
de4a7bf531 | ||
|
0cf6cf457d | ||
|
17e0a31fe3 | ||
|
bb8c6346fb | ||
|
b67b61b963 | ||
|
ac82f34f7d | ||
|
91ca90e25b | ||
|
e845594878 | ||
|
5201882a23 | ||
|
122be8305f | ||
|
4ef0b48b95 | ||
|
0ec061aa8f | ||
|
85fdbd0ad5 | ||
|
113c931cda | ||
|
b79df709a8 | ||
|
d9eee9bf9a | ||
|
0e071edccc | ||
|
b128474625 | ||
|
f4a53f3fb4 | ||
|
ebcf9840f4 | ||
|
74012831f6 | ||
|
b903e6909e | ||
|
0e585b9a52 | ||
|
3f6887557b | ||
|
32ead51e5a | ||
|
a2399046ca | ||
|
049b159beb | ||
|
d754b15afb | ||
|
91c7406b59 | ||
|
1471c0d4e0 | ||
|
483fabf48a | ||
|
2ef098d01c | ||
|
33e829763d | ||
|
ffbbf74c50 | ||
|
56b095edeb | ||
|
1ca6ff8ca5 | ||
|
75163d9daf | ||
|
3655fb6a22 | ||
|
18737aad49 | ||
|
a15139bc02 | ||
|
24e67c4394 | ||
|
3e21af3e4a | ||
|
88f946890d | ||
|
223936c2e8 | ||
|
2ec9bff36e | ||
|
c61130af33 | ||
|
35b517c207 | ||
|
369b2ef0ed | ||
|
c7384adc00 | ||
|
b6f04aed35 | ||
|
933189887b | ||
|
8d47ba893a | ||
|
d24462c81a | ||
|
fa5e154ee3 | ||
|
f5d341382e | ||
|
f386eb6c63 | ||
|
ec71c02c4b | ||
|
4837bfcc6a | ||
|
e5d5bd7ff1 | ||
|
75f9c652e2 | ||
|
443186ff40 | ||
|
11e0049b08 | ||
|
630572323f | ||
|
1ad119941f | ||
|
8bece467f8 | ||
|
013671f29f | ||
|
650c548c31 | ||
|
1d3ecd3fba | ||
|
828299e71c | ||
|
a390299744 | ||
|
ee8f999a7b | ||
|
c35042b7eb | ||
|
fc89ecc6ca | ||
|
9ae2594726 | ||
|
03abff3b30 | ||
|
9ce2db4136 | ||
|
6fed108703 | ||
|
5915bd7f45 | ||
|
caad1e2628 | ||
|
0622107449 | ||
|
6b33d3f81b | ||
|
66ee0d4a1f | ||
|
3159c0a547 | ||
|
e6927db2fe | ||
|
6ee1b034b6 | ||
|
285d4123b5 | ||
|
7fed4a9740 | ||
|
4117c8f6b8 | ||
|
1549e6a9dc | ||
|
4e78cb9988 | ||
|
0d9ad96d3f | ||
|
bf5d948237 | ||
|
67dd1763bb | ||
|
ee4ea83a87 | ||
|
34e826f373 | ||
|
1906330d13 | ||
|
80edd7a317 | ||
|
e3dd60cce1 | ||
|
86c53e175d | ||
|
c4d6e10115 | ||
|
67a37c7279 | ||
|
61d108f415 | ||
|
8986e3b088 | ||
|
c386c36866 | ||
|
3f821e0d5e | ||
|
da6b9238f5 | ||
|
ec5a0e0f5e | ||
|
13bbde2246 | ||
|
5992df0762 | ||
|
449f99e168 | ||
|
20b1e55f24 | ||
|
4826c1da8a | ||
|
576554b19b | ||
|
96bdeeed0e | ||
|
ce98ee9b00 | ||
|
c8e5e13c89 | ||
|
db5a5636d9 | ||
|
4565015615 | ||
|
b57ee5cf5b | ||
|
4948a063d2 | ||
|
b8dca8d22a | ||
|
285f63c02e | ||
|
babbf6017d | ||
|
f3430eebbb | ||
|
13faf26315 | ||
|
730e2127e1 | ||
|
a1277a9b2b | ||
|
2441fe6fd4 | ||
|
b06510d579 | ||
|
499b184fcd | ||
|
79bbb2023d | ||
|
91531e9586 | ||
|
fc533cfad3 | ||
|
b55bbfa2b3 | ||
|
1ae08ae257 | ||
|
0e76b919b5 | ||
|
a844a6a577 | ||
|
c3a128f31e | ||
|
afaad0755f | ||
|
1d1c3a808a | ||
|
f635cde756 | ||
|
0f8b33238f | ||
|
576c085ea0 | ||
|
777984faeb | ||
|
f14b6f3d99 | ||
|
06953f83d9 | ||
|
903dc53522 | ||
|
375af259a2 | ||
|
67842ffb22 | ||
|
0f966209ca | ||
|
f2b23aa5f3 | ||
|
9451997fa8 | ||
|
8a64406d34 | ||
|
e73cf356d2 | ||
|
b61ae28f8d | ||
|
52ab8a59c6 | ||
|
c0fe8a9f13 | ||
|
285a87a77f | ||
|
59da591d13 | ||
|
6ac90d4c5d | ||
|
906a399634 | ||
|
c7378218ba | ||
|
38b9d31f63 | ||
|
1f11aa5f04 | ||
|
601834d746 | ||
|
191bf5876e | ||
|
1c87cb8019 | ||
|
966d7f5bf9 | ||
|
4045c069f8 | ||
|
91d3b3fb25 | ||
|
58dfc12af2 | ||
|
c6da3ee828 | ||
|
cde3206478 | ||
|
37d984b8bf | ||
|
e284417349 | ||
|
5d67247061 | ||
|
56d13069cd | ||
|
4233ee1f59 | ||
|
54c7d1ad14 | ||
|
a7b637768e | ||
|
88c3664889 | ||
|
d27eb181f6 | ||
|
f8b03c3925 | ||
|
edde54e991 | ||
|
921c4c1273 | ||
|
0b9d4103cb | ||
|
f87959ab50 | ||
|
54119570e6 | ||
|
34489591ec | ||
|
f56309f5f0 | ||
|
c70c39cad0 | ||
|
b0692d994f | ||
|
695dded7ed | ||
|
f6e24bbd79 | ||
|
b4d991adaa | ||
|
d05f62391d | ||
|
e47a3d00fe | ||
|
07635228e2 | ||
|
a3fe82e359 | ||
|
c717747603 | ||
|
fa9574086d | ||
|
143d9553fa | ||
|
a4158be4d7 | ||
|
2f7a2d4df7 | ||
|
b58666e12e | ||
|
9611023380 | ||
|
173adb04e2 | ||
|
589e34d00c | ||
|
90eb4a5d01 | ||
|
430da03160 | ||
|
69e5771881 | ||
|
f96648d41c | ||
|
672c9f5f05 | ||
|
671167f6da | ||
|
cd9d11dda6 | ||
|
67442f9039 | ||
|
8a498f4e65 | ||
|
4f068d4fcc | ||
|
e85f24174e | ||
|
d44e7a8578 | ||
|
961bb84e4c | ||
|
d088964761 | ||
|
f2fd1da23f | ||
|
1025fff6b9 | ||
|
c913e2f3e5 | ||
|
b9982ce578 | ||
|
9fbe8d3a0c | ||
|
b016f03637 | ||
|
27d014a7fa | ||
|
d49343ed11 | ||
|
86f999c1f2 | ||
|
1d0a43f6a3 | ||
|
c5692d2f2f | ||
|
b2d841ce9a | ||
|
c4feba4347 | ||
|
de740dfb9c | ||
|
9c24f2d6b1 | ||
|
7508472d84 | ||
|
cfea9cc172 | ||
|
32938dadd7 | ||
|
cf76380c91 | ||
|
b34c089591 | ||
|
b3d970bdb8 | ||
|
c3e3c60069 | ||
|
5e6a600b64 | ||
|
eb926b7e60 | ||
|
a3e8b78250 | ||
|
06fc2b3fde | ||
|
572a8ef7f9 | ||
|
3002a1e89b | ||
|
36bc57de95 | ||
|
02ea161506 | ||
|
0cea7a623b | ||
|
29f9dc742e | ||
|
dd061291b1 | ||
|
766c1fea20 | ||
|
55e2c827bd | ||
|
45f8364cd1 | ||
|
bbf36836b6 | ||
|
799e3be9bd | ||
|
8e7e86ee35 | ||
|
6c381f20b1 | ||
|
81a04ac25c | ||
|
37ca59815c | ||
|
119c7aa0df | ||
|
58376eedda | ||
|
d71d26a3c9 | ||
|
de6c9e0fcd | ||
|
387c78ddf9 | ||
|
dfa43707eb | ||
|
34f293475e | ||
|
5db5fa879b | ||
|
8c1d29df7e | ||
|
ec1e770fea | ||
|
05eda8d193 | ||
|
70a8fcf07d | ||
|
142c018cfa | ||
|
ec6d016da1 | ||
|
7f5e930bd2 | ||
|
f5444c8fe4 | ||
|
05abefe989 | ||
|
814a48517f | ||
|
a59f5694fe | ||
|
75f34b80a8 | ||
|
1df00d4e76 | ||
|
2ec3fcaffe | ||
|
a506b09de0 | ||
|
1feb228275 | ||
|
d13cdced1e | ||
|
885d0faf83 | ||
|
c007dd5dd2 | ||
|
77897cd24c | ||
|
718ee72c80 | ||
|
cdd168f5d3 | ||
|
01464074c9 | ||
|
3f363c61bc | ||
|
7434c9c276 | ||
|
39bac24cb7 | ||
|
62722238c9 | ||
|
be52633ee4 | ||
|
f4d753aedf | ||
|
98a2bb8be2 | ||
|
954b470fbc | ||
|
d4449cc682 | ||
|
99c9db5f67 | ||
|
27a6fa7b0e | ||
|
44bf7b8128 |
997 changed files with 18567 additions and 8826 deletions
|
@ -70,7 +70,7 @@ services:
|
||||||
hard: -1
|
hard: -1
|
||||||
|
|
||||||
libretranslate:
|
libretranslate:
|
||||||
image: libretranslate/libretranslate:v1.5.6
|
image: libretranslate/libretranslate:v1.5.7
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- lt-data:/home/libretranslate/.local
|
- lt-data:/home/libretranslate/.local
|
||||||
|
|
4
.env.development
Normal file
4
.env.development
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
# Required by ActiveRecord encryption feature
|
||||||
|
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=fkSxKD2bF396kdQbrP1EJ7WbU7ZgNokR
|
||||||
|
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=r0hvVmzBVsjxC7AMlwhOzmtc36ZCOS1E
|
||||||
|
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=PhdFyyfy5xJ7WVd2lWBpcPScRQHzRTNr
|
|
@ -3,3 +3,9 @@ NODE_ENV=production
|
||||||
# Federation
|
# Federation
|
||||||
LOCAL_DOMAIN=cb6e6126.ngrok.io
|
LOCAL_DOMAIN=cb6e6126.ngrok.io
|
||||||
LOCAL_HTTPS=true
|
LOCAL_HTTPS=true
|
||||||
|
|
||||||
|
# Secret values required by ActiveRecord encryption feature
|
||||||
|
# Use `bin/rails db:encryption:init` to generate fresh secrets
|
||||||
|
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=test_determinist_key_DO_NOT_USE_IN_PRODUCTION
|
||||||
|
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=test_salt_DO_NOT_USE_IN_PRODUCTION
|
||||||
|
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=test_primary_key_DO_NOT_USE_IN_PRODUCTION
|
||||||
|
|
|
@ -380,6 +380,7 @@ module.exports = defineConfig({
|
||||||
"message": "Use typed hooks `useAppDispatch` and `useAppSelector` instead."
|
"message": "Use typed hooks `useAppDispatch` and `useAppSelector` instead."
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"@typescript-eslint/restrict-template-expressions": ['warn', { allowNumber: true }],
|
||||||
'jsdoc/require-jsdoc': 'off',
|
'jsdoc/require-jsdoc': 'off',
|
||||||
|
|
||||||
// Those rules set stricter rules for TS files
|
// Those rules set stricter rules for TS files
|
||||||
|
|
23
.github/renovate.json5
vendored
23
.github/renovate.json5
vendored
|
@ -125,6 +125,29 @@
|
||||||
],
|
],
|
||||||
groupName: null, // We dont want them to belong to any group
|
groupName: null, // We dont want them to belong to any group
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// Group all RuboCop packages with `rubocop` in the same PR
|
||||||
|
matchManagers: ['bundler'],
|
||||||
|
matchPackageNames: ['rubocop'],
|
||||||
|
matchPackagePrefixes: ['rubocop-'],
|
||||||
|
matchUpdateTypes: ['patch', 'minor'],
|
||||||
|
groupName: 'RuboCop (non-major)',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// Group all RSpec packages with `rspec` in the same PR
|
||||||
|
matchManagers: ['bundler'],
|
||||||
|
matchPackageNames: ['rspec'],
|
||||||
|
matchPackagePrefixes: ['rspec-'],
|
||||||
|
matchUpdateTypes: ['patch', 'minor'],
|
||||||
|
groupName: 'RSpec (non-major)',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// Group all opentelemetry-ruby packages in the same PR
|
||||||
|
matchManagers: ['bundler'],
|
||||||
|
matchPackagePrefixes: ['opentelemetry-'],
|
||||||
|
matchUpdateTypes: ['patch', 'minor'],
|
||||||
|
groupName: 'opentelemetry-ruby (non-major)',
|
||||||
|
},
|
||||||
// Add labels depending on package manager
|
// Add labels depending on package manager
|
||||||
{ matchManagers: ['npm', 'nvm'], addLabels: ['javascript'] },
|
{ matchManagers: ['npm', 'nvm'], addLabels: ['javascript'] },
|
||||||
{ matchManagers: ['bundler', 'ruby-version'], addLabels: ['ruby'] },
|
{ matchManagers: ['bundler', 'ruby-version'], addLabels: ['ruby'] },
|
||||||
|
|
21
.github/stylelint-matcher.json
vendored
21
.github/stylelint-matcher.json
vendored
|
@ -1,21 +0,0 @@
|
||||||
{
|
|
||||||
"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
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
2
.github/workflows/crowdin-download.yml
vendored
2
.github/workflows/crowdin-download.yml
vendored
|
@ -53,7 +53,7 @@ jobs:
|
||||||
|
|
||||||
# Create or update the pull request
|
# Create or update the pull request
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
uses: peter-evans/create-pull-request@v6.0.2
|
uses: peter-evans/create-pull-request@v6.0.5
|
||||||
with:
|
with:
|
||||||
commit-message: 'New Crowdin translations'
|
commit-message: 'New Crowdin translations'
|
||||||
title: 'New Crowdin Translations (automated)'
|
title: 'New Crowdin Translations (automated)'
|
||||||
|
|
6
.github/workflows/lint-css.yml
vendored
6
.github/workflows/lint-css.yml
vendored
|
@ -38,9 +38,5 @@ jobs:
|
||||||
- name: Set up Javascript environment
|
- name: Set up Javascript environment
|
||||||
uses: ./.github/actions/setup-javascript
|
uses: ./.github/actions/setup-javascript
|
||||||
|
|
||||||
- uses: xt0rted/stylelint-problem-matcher@v1
|
|
||||||
|
|
||||||
- run: echo "::add-matcher::.github/stylelint-matcher.json"
|
|
||||||
|
|
||||||
- name: Stylelint
|
- name: Stylelint
|
||||||
run: yarn lint:css
|
run: yarn lint:css -f github
|
||||||
|
|
2
.github/workflows/test-js.yml
vendored
2
.github/workflows/test-js.yml
vendored
|
@ -38,5 +38,5 @@ jobs:
|
||||||
- name: Set up Javascript environment
|
- name: Set up Javascript environment
|
||||||
uses: ./.github/actions/setup-javascript
|
uses: ./.github/actions/setup-javascript
|
||||||
|
|
||||||
- name: Jest testing
|
- name: JavaScript testing
|
||||||
run: yarn jest --reporters github-actions summary
|
run: yarn jest --reporters github-actions summary
|
||||||
|
|
35
.github/workflows/test-ruby.yml
vendored
35
.github/workflows/test-ruby.yml
vendored
|
@ -28,6 +28,9 @@ jobs:
|
||||||
env:
|
env:
|
||||||
RAILS_ENV: ${{ matrix.mode }}
|
RAILS_ENV: ${{ matrix.mode }}
|
||||||
BUNDLE_WITH: ${{ matrix.mode }}
|
BUNDLE_WITH: ${{ matrix.mode }}
|
||||||
|
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY: precompile_placeholder
|
||||||
|
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT: precompile_placeholder
|
||||||
|
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY: precompile_placeholder
|
||||||
OTP_SECRET: precompile_placeholder
|
OTP_SECRET: precompile_placeholder
|
||||||
SECRET_KEY_BASE: precompile_placeholder
|
SECRET_KEY_BASE: precompile_placeholder
|
||||||
|
|
||||||
|
@ -111,8 +114,8 @@ jobs:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
ruby-version:
|
ruby-version:
|
||||||
- '3.0'
|
|
||||||
- '3.1'
|
- '3.1'
|
||||||
|
- '3.2'
|
||||||
- '.ruby-version'
|
- '.ruby-version'
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
@ -142,6 +145,8 @@ jobs:
|
||||||
uses: codecov/codecov-action@v4
|
uses: codecov/codecov-action@v4
|
||||||
with:
|
with:
|
||||||
files: coverage/lcov/mastodon.lcov
|
files: coverage/lcov/mastodon.lcov
|
||||||
|
env:
|
||||||
|
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
|
||||||
test-e2e:
|
test-e2e:
|
||||||
name: End to End testing
|
name: End to End testing
|
||||||
|
@ -181,13 +186,15 @@ jobs:
|
||||||
DISABLE_SIMPLECOV: true
|
DISABLE_SIMPLECOV: true
|
||||||
RAILS_ENV: test
|
RAILS_ENV: test
|
||||||
BUNDLE_WITH: test
|
BUNDLE_WITH: test
|
||||||
|
LOCAL_DOMAIN: localhost:3000
|
||||||
|
LOCAL_HTTPS: false
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
ruby-version:
|
ruby-version:
|
||||||
- '3.0'
|
|
||||||
- '3.1'
|
- '3.1'
|
||||||
|
- '3.2'
|
||||||
- '.ruby-version'
|
- '.ruby-version'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
@ -210,7 +217,7 @@ jobs:
|
||||||
- name: Load database schema
|
- name: Load database schema
|
||||||
run: './bin/rails db:create db:schema:load db:seed'
|
run: './bin/rails db:create db:schema:load db:seed'
|
||||||
|
|
||||||
- run: bundle exec rake spec:system
|
- run: bin/rspec spec/system --tag streaming --tag js
|
||||||
|
|
||||||
- name: Archive logs
|
- name: Archive logs
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
|
@ -257,8 +264,8 @@ jobs:
|
||||||
ports:
|
ports:
|
||||||
- 6379:6379
|
- 6379:6379
|
||||||
|
|
||||||
search:
|
elasticsearch:
|
||||||
image: ${{ matrix.search-image }}
|
image: ${{ contains(matrix.search-image, 'elasticsearch') && matrix.search-image || '' }}
|
||||||
env:
|
env:
|
||||||
discovery.type: single-node
|
discovery.type: single-node
|
||||||
xpack.security.enabled: false
|
xpack.security.enabled: false
|
||||||
|
@ -270,6 +277,20 @@ jobs:
|
||||||
ports:
|
ports:
|
||||||
- 9200:9200
|
- 9200:9200
|
||||||
|
|
||||||
|
opensearch:
|
||||||
|
image: ${{ contains(matrix.search-image, 'opensearch') && matrix.search-image || '' }}
|
||||||
|
env:
|
||||||
|
discovery.type: single-node
|
||||||
|
DISABLE_INSTALL_DEMO_CONFIG: true
|
||||||
|
DISABLE_SECURITY_PLUGIN: true
|
||||||
|
options: >-
|
||||||
|
--health-cmd "curl http://localhost:9200/_cluster/health"
|
||||||
|
--health-interval 10s
|
||||||
|
--health-timeout 5s
|
||||||
|
--health-retries 10
|
||||||
|
ports:
|
||||||
|
- 9200:9200
|
||||||
|
|
||||||
env:
|
env:
|
||||||
DB_HOST: localhost
|
DB_HOST: localhost
|
||||||
DB_USER: postgres
|
DB_USER: postgres
|
||||||
|
@ -285,14 +306,16 @@ jobs:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
ruby-version:
|
ruby-version:
|
||||||
- '3.0'
|
|
||||||
- '3.1'
|
- '3.1'
|
||||||
|
- '3.2'
|
||||||
- '.ruby-version'
|
- '.ruby-version'
|
||||||
search-image:
|
search-image:
|
||||||
- docker.elastic.co/elasticsearch/elasticsearch:7.17.13
|
- docker.elastic.co/elasticsearch/elasticsearch:7.17.13
|
||||||
include:
|
include:
|
||||||
- ruby-version: '.ruby-version'
|
- ruby-version: '.ruby-version'
|
||||||
search-image: docker.elastic.co/elasticsearch/elasticsearch:8.10.2
|
search-image: docker.elastic.co/elasticsearch/elasticsearch:8.10.2
|
||||||
|
- ruby-version: '.ruby-version'
|
||||||
|
search-image: opensearchproject/opensearch:2
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -24,7 +24,6 @@
|
||||||
/public/packs-test
|
/public/packs-test
|
||||||
.env
|
.env
|
||||||
.env.production
|
.env.production
|
||||||
.env.development
|
|
||||||
/node_modules/
|
/node_modules/
|
||||||
/build/
|
/build/
|
||||||
|
|
||||||
|
@ -69,3 +68,6 @@ yarn-debug.log
|
||||||
|
|
||||||
# Ignore Docker option files
|
# Ignore Docker option files
|
||||||
docker-compose.override.yml
|
docker-compose.override.yml
|
||||||
|
|
||||||
|
# Ignore dotenv .local files
|
||||||
|
.env*.local
|
||||||
|
|
|
@ -1,8 +1,5 @@
|
||||||
inherits_from: .haml-lint_todo.yml
|
|
||||||
|
|
||||||
exclude:
|
exclude:
|
||||||
- 'vendor/**/*'
|
- 'vendor/**/*'
|
||||||
- lib/templates/haml/scaffold/_form.html.haml
|
|
||||||
|
|
||||||
require:
|
require:
|
||||||
- ./lib/linter/haml_middle_dot.rb
|
- ./lib/linter/haml_middle_dot.rb
|
||||||
|
@ -13,6 +10,6 @@ linters:
|
||||||
MiddleDot:
|
MiddleDot:
|
||||||
enabled: true
|
enabled: true
|
||||||
LineLength:
|
LineLength:
|
||||||
max: 320
|
max: 300
|
||||||
ViewLength:
|
ViewLength:
|
||||||
max: 200 # Override default value of 100 inherited from rubocop
|
max: 200 # Override default value of 100 inherited from rubocop
|
||||||
|
|
2
.nvmrc
2
.nvmrc
|
@ -1 +1 @@
|
||||||
20.11
|
20.13
|
||||||
|
|
37
.rubocop.yml
37
.rubocop.yml
|
@ -9,12 +9,13 @@ inherit_mode:
|
||||||
require:
|
require:
|
||||||
- rubocop-rails
|
- rubocop-rails
|
||||||
- rubocop-rspec
|
- rubocop-rspec
|
||||||
|
- rubocop-rspec_rails
|
||||||
- rubocop-performance
|
- rubocop-performance
|
||||||
- rubocop-capybara
|
- rubocop-capybara
|
||||||
- ./lib/linter/rubocop_middle_dot
|
- ./lib/linter/rubocop_middle_dot
|
||||||
|
|
||||||
AllCops:
|
AllCops:
|
||||||
TargetRubyVersion: 3.0 # Set to minimum supported version of CI
|
TargetRubyVersion: 3.1 # Set to minimum supported version of CI
|
||||||
DisplayCopNames: true
|
DisplayCopNames: true
|
||||||
DisplayStyleGuide: true
|
DisplayStyleGuide: true
|
||||||
ExtraDetails: true
|
ExtraDetails: true
|
||||||
|
@ -39,13 +40,7 @@ Layout/FirstHashElementIndentation:
|
||||||
# Reason: Currently disabled in .rubocop_todo.yml
|
# Reason: Currently disabled in .rubocop_todo.yml
|
||||||
# https://docs.rubocop.org/rubocop/cops_layout.html#layoutlinelength
|
# https://docs.rubocop.org/rubocop/cops_layout.html#layoutlinelength
|
||||||
Layout/LineLength:
|
Layout/LineLength:
|
||||||
Max: 320 # Default of 120 causes a duplicate entry in generated todo file
|
Max: 300 # Default of 120 causes a duplicate entry in generated todo file
|
||||||
|
|
||||||
# Reason:
|
|
||||||
# https://docs.rubocop.org/rubocop/cops_lint.html#lintuselessaccessmodifier
|
|
||||||
Lint/UselessAccessModifier:
|
|
||||||
ContextCreatingMethods:
|
|
||||||
- class_methods
|
|
||||||
|
|
||||||
## Disable most Metrics/*Length cops
|
## Disable most Metrics/*Length cops
|
||||||
# Reason: those are often triggered and force significant refactors when this happend
|
# Reason: those are often triggered and force significant refactors when this happend
|
||||||
|
@ -86,6 +81,11 @@ Metrics/CyclomaticComplexity:
|
||||||
Metrics/ParameterLists:
|
Metrics/ParameterLists:
|
||||||
CountKeywordArgs: false
|
CountKeywordArgs: false
|
||||||
|
|
||||||
|
# Reason: Prefer seeing a variable name
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_naming.html#namingblockforwarding
|
||||||
|
Naming/BlockForwarding:
|
||||||
|
EnforcedStyle: explicit
|
||||||
|
|
||||||
# Reason: Prevailing style is argument file paths
|
# Reason: Prevailing style is argument file paths
|
||||||
# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsfilepath
|
# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsfilepath
|
||||||
Rails/FilePath:
|
Rails/FilePath:
|
||||||
|
@ -148,11 +148,6 @@ RSpec/NamedSubject:
|
||||||
RSpec/NotToNot:
|
RSpec/NotToNot:
|
||||||
EnforcedStyle: to_not
|
EnforcedStyle: to_not
|
||||||
|
|
||||||
# Reason: Prevailing style uses numeric status codes, matches Rails/HttpStatus
|
|
||||||
# https://docs.rubocop.org/rubocop-rspec/cops_rspec_rails.html#rspecrailshttpstatus
|
|
||||||
RSpec/Rails/HttpStatus:
|
|
||||||
EnforcedStyle: numeric
|
|
||||||
|
|
||||||
# Reason: Match overrides from Rspec/FilePath rule above
|
# Reason: Match overrides from Rspec/FilePath rule above
|
||||||
# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecspecfilepathformat
|
# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecspecfilepathformat
|
||||||
RSpec/SpecFilePathFormat:
|
RSpec/SpecFilePathFormat:
|
||||||
|
@ -163,6 +158,11 @@ RSpec/SpecFilePathFormat:
|
||||||
OEmbedController: oembed_controller
|
OEmbedController: oembed_controller
|
||||||
OStatus: ostatus
|
OStatus: ostatus
|
||||||
|
|
||||||
|
# Reason: Prevailing style uses numeric status codes, matches Rails/HttpStatus
|
||||||
|
# https://docs.rubocop.org/rubocop-rspec/cops_rspec_rails.html#rspecrailshttpstatus
|
||||||
|
RSpecRails/HttpStatus:
|
||||||
|
EnforcedStyle: numeric
|
||||||
|
|
||||||
# Reason:
|
# Reason:
|
||||||
# https://docs.rubocop.org/rubocop/cops_style.html#styleclassandmodulechildren
|
# https://docs.rubocop.org/rubocop/cops_style.html#styleclassandmodulechildren
|
||||||
Style/ClassAndModuleChildren:
|
Style/ClassAndModuleChildren:
|
||||||
|
@ -182,10 +182,16 @@ Style/FormatStringToken:
|
||||||
AllowedMethods:
|
AllowedMethods:
|
||||||
- redirect_with_vary
|
- redirect_with_vary
|
||||||
|
|
||||||
|
# Reason: Prevailing style choice
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#stylehashaslastarrayitem
|
||||||
|
Style/HashAsLastArrayItem:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
# Reason: Enforce modern Ruby style
|
# Reason: Enforce modern Ruby style
|
||||||
# https://docs.rubocop.org/rubocop/cops_style.html#stylehashsyntax
|
# https://docs.rubocop.org/rubocop/cops_style.html#stylehashsyntax
|
||||||
Style/HashSyntax:
|
Style/HashSyntax:
|
||||||
EnforcedStyle: ruby19_no_mixed_keys
|
EnforcedStyle: ruby19_no_mixed_keys
|
||||||
|
EnforcedShorthandSyntax: either
|
||||||
|
|
||||||
# Reason:
|
# Reason:
|
||||||
# https://docs.rubocop.org/rubocop/cops_style.html#stylenumericliterals
|
# https://docs.rubocop.org/rubocop/cops_style.html#stylenumericliterals
|
||||||
|
@ -205,6 +211,11 @@ Style/PercentLiteralDelimiters:
|
||||||
Style/RedundantBegin:
|
Style/RedundantBegin:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
# Reason: Prevailing style choice
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#styleredundantfetchblock
|
||||||
|
Style/RedundantFetchBlock:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
# Reason: Overridden to reduce implicit StandardError rescues
|
# Reason: Overridden to reduce implicit StandardError rescues
|
||||||
# https://docs.rubocop.org/rubocop/cops_style.html#stylerescuestandarderror
|
# https://docs.rubocop.org/rubocop/cops_style.html#stylerescuestandarderror
|
||||||
Style/RescueStandardError:
|
Style/RescueStandardError:
|
||||||
|
|
|
@ -1,18 +1,11 @@
|
||||||
# This configuration was generated by
|
# This configuration was generated by
|
||||||
# `rubocop --auto-gen-config --auto-gen-only-exclude --no-exclude-limit --no-offense-counts --no-auto-gen-timestamp`
|
# `rubocop --auto-gen-config --auto-gen-only-exclude --no-exclude-limit --no-offense-counts --no-auto-gen-timestamp`
|
||||||
# using RuboCop version 1.60.2.
|
# using RuboCop version 1.63.5.
|
||||||
# The point is for the user to remove these configuration records
|
# The point is for the user to remove these configuration records
|
||||||
# one by one as the offenses are removed from the code base.
|
# one by one as the offenses are removed from the code base.
|
||||||
# Note that changes in the inspected code, or installation of new
|
# Note that changes in the inspected code, or installation of new
|
||||||
# versions of RuboCop, may require this file to be generated again.
|
# versions of RuboCop, may require this file to be generated again.
|
||||||
|
|
||||||
# This cop supports safe autocorrection (--autocorrect).
|
|
||||||
# Configuration parameters: TreatCommentsAsGroupSeparators, ConsiderPunctuation, Include.
|
|
||||||
# Include: **/*.gemfile, **/Gemfile, **/gems.rb
|
|
||||||
Bundler/OrderedGems:
|
|
||||||
Exclude:
|
|
||||||
- 'Gemfile'
|
|
||||||
|
|
||||||
Lint/NonLocalExitFromIterator:
|
Lint/NonLocalExitFromIterator:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'app/helpers/jsonld_helper.rb'
|
- 'app/helpers/jsonld_helper.rb'
|
||||||
|
@ -36,7 +29,7 @@ Metrics/PerceivedComplexity:
|
||||||
|
|
||||||
# Configuration parameters: CountAsOne.
|
# Configuration parameters: CountAsOne.
|
||||||
RSpec/ExampleLength:
|
RSpec/ExampleLength:
|
||||||
Max: 20 # Override default of 5
|
Max: 18
|
||||||
|
|
||||||
RSpec/MultipleExpectations:
|
RSpec/MultipleExpectations:
|
||||||
Max: 7
|
Max: 7
|
||||||
|
@ -49,27 +42,10 @@ RSpec/MultipleMemoizedHelpers:
|
||||||
RSpec/NestedGroups:
|
RSpec/NestedGroups:
|
||||||
Max: 6
|
Max: 6
|
||||||
|
|
||||||
# Configuration parameters: Include.
|
|
||||||
# Include: app/models/**/*.rb
|
|
||||||
Rails/HasAndBelongsToMany:
|
|
||||||
Exclude:
|
|
||||||
- 'app/models/concerns/account/associations.rb'
|
|
||||||
- 'app/models/status.rb'
|
|
||||||
- 'app/models/tag.rb'
|
|
||||||
|
|
||||||
Rails/OutputSafety:
|
Rails/OutputSafety:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'config/initializers/simple_form.rb'
|
- 'config/initializers/simple_form.rb'
|
||||||
|
|
||||||
# Configuration parameters: Include.
|
|
||||||
# Include: app/models/**/*.rb
|
|
||||||
Rails/UniqueValidationWithoutIndex:
|
|
||||||
Exclude:
|
|
||||||
- 'app/models/account_alias.rb'
|
|
||||||
- 'app/models/custom_filter_status.rb'
|
|
||||||
- 'app/models/identity.rb'
|
|
||||||
- 'app/models/webauthn_credential.rb'
|
|
||||||
|
|
||||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
# Configuration parameters: AllowedMethods, AllowedPatterns.
|
# Configuration parameters: AllowedMethods, AllowedPatterns.
|
||||||
# AllowedMethods: ==, equal?, eql?
|
# AllowedMethods: ==, equal?, eql?
|
||||||
|
@ -78,17 +54,12 @@ Style/ClassEqualityComparison:
|
||||||
- 'app/helpers/jsonld_helper.rb'
|
- 'app/helpers/jsonld_helper.rb'
|
||||||
- 'app/serializers/activitypub/outbox_serializer.rb'
|
- 'app/serializers/activitypub/outbox_serializer.rb'
|
||||||
|
|
||||||
Style/ClassVars:
|
|
||||||
Exclude:
|
|
||||||
- 'config/initializers/devise.rb'
|
|
||||||
|
|
||||||
# This cop supports safe autocorrection (--autocorrect).
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
# Configuration parameters: AllowedVars.
|
# Configuration parameters: AllowedVars.
|
||||||
Style/FetchEnvVar:
|
Style/FetchEnvVar:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'app/lib/redis_configuration.rb'
|
- 'app/lib/redis_configuration.rb'
|
||||||
- 'app/lib/translation_service.rb'
|
- 'app/lib/translation_service.rb'
|
||||||
- 'config/environments/development.rb'
|
|
||||||
- 'config/environments/production.rb'
|
- 'config/environments/production.rb'
|
||||||
- 'config/initializers/2_limited_federation_mode.rb'
|
- 'config/initializers/2_limited_federation_mode.rb'
|
||||||
- 'config/initializers/3_omniauth.rb'
|
- 'config/initializers/3_omniauth.rb'
|
||||||
|
@ -98,9 +69,8 @@ Style/FetchEnvVar:
|
||||||
- 'config/initializers/paperclip.rb'
|
- 'config/initializers/paperclip.rb'
|
||||||
- 'config/initializers/vapid.rb'
|
- 'config/initializers/vapid.rb'
|
||||||
- 'lib/mastodon/redis_config.rb'
|
- 'lib/mastodon/redis_config.rb'
|
||||||
- 'lib/premailer_webpack_strategy.rb'
|
|
||||||
- 'lib/tasks/repo.rake'
|
- 'lib/tasks/repo.rake'
|
||||||
- 'spec/features/profile_spec.rb'
|
- 'spec/system/profile_spec.rb'
|
||||||
|
|
||||||
# This cop supports safe autocorrection (--autocorrect).
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
# Configuration parameters: EnforcedStyle, MaxUnannotatedPlaceholdersAllowed, AllowedMethods, AllowedPatterns.
|
# Configuration parameters: EnforcedStyle, MaxUnannotatedPlaceholdersAllowed, AllowedMethods, AllowedPatterns.
|
||||||
|
@ -144,35 +114,14 @@ Style/GuardClause:
|
||||||
- 'lib/mastodon/cli/accounts.rb'
|
- 'lib/mastodon/cli/accounts.rb'
|
||||||
- 'lib/mastodon/cli/maintenance.rb'
|
- 'lib/mastodon/cli/maintenance.rb'
|
||||||
- 'lib/mastodon/cli/media.rb'
|
- 'lib/mastodon/cli/media.rb'
|
||||||
- 'lib/paperclip/attachment_extensions.rb'
|
|
||||||
- 'lib/tasks/repo.rake'
|
- 'lib/tasks/repo.rake'
|
||||||
|
|
||||||
# This cop supports safe autocorrection (--autocorrect).
|
|
||||||
# Configuration parameters: EnforcedStyle.
|
|
||||||
# SupportedStyles: braces, no_braces
|
|
||||||
Style/HashAsLastArrayItem:
|
|
||||||
Exclude:
|
|
||||||
- 'app/controllers/admin/statuses_controller.rb'
|
|
||||||
- 'app/controllers/api/v1/statuses_controller.rb'
|
|
||||||
- 'app/models/concerns/account/counters.rb'
|
|
||||||
- 'app/models/concerns/status/threading_concern.rb'
|
|
||||||
- 'app/models/status.rb'
|
|
||||||
- 'app/services/batched_remove_status_service.rb'
|
|
||||||
- 'app/services/notify_service.rb'
|
|
||||||
|
|
||||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
Style/HashTransformValues:
|
Style/HashTransformValues:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'app/serializers/rest/web_push_subscription_serializer.rb'
|
- 'app/serializers/rest/web_push_subscription_serializer.rb'
|
||||||
- 'app/services/import_service.rb'
|
- 'app/services/import_service.rb'
|
||||||
|
|
||||||
# This cop supports safe autocorrection (--autocorrect).
|
|
||||||
Style/IfUnlessModifier:
|
|
||||||
Exclude:
|
|
||||||
- 'config/environments/production.rb'
|
|
||||||
- 'config/initializers/devise.rb'
|
|
||||||
- 'config/initializers/ffmpeg.rb'
|
|
||||||
|
|
||||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
Style/MapToHash:
|
Style/MapToHash:
|
||||||
Exclude:
|
Exclude:
|
||||||
|
@ -207,13 +156,6 @@ Style/OptionalBooleanParameter:
|
||||||
- 'app/workers/unfollow_follow_worker.rb'
|
- 'app/workers/unfollow_follow_worker.rb'
|
||||||
- 'lib/mastodon/redis_config.rb'
|
- 'lib/mastodon/redis_config.rb'
|
||||||
|
|
||||||
# This cop supports safe autocorrection (--autocorrect).
|
|
||||||
# Configuration parameters: PreferredDelimiters.
|
|
||||||
Style/PercentLiteralDelimiters:
|
|
||||||
Exclude:
|
|
||||||
- 'config/deploy.rb'
|
|
||||||
- 'config/initializers/doorkeeper.rb'
|
|
||||||
|
|
||||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
# Configuration parameters: EnforcedStyle.
|
# Configuration parameters: EnforcedStyle.
|
||||||
# SupportedStyles: short, verbose
|
# SupportedStyles: short, verbose
|
||||||
|
@ -227,16 +169,6 @@ Style/RedundantConstantBase:
|
||||||
- 'config/environments/production.rb'
|
- 'config/environments/production.rb'
|
||||||
- 'config/initializers/sidekiq.rb'
|
- 'config/initializers/sidekiq.rb'
|
||||||
|
|
||||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
|
||||||
# Configuration parameters: SafeForConstants.
|
|
||||||
Style/RedundantFetchBlock:
|
|
||||||
Exclude:
|
|
||||||
- 'config/initializers/1_hosts.rb'
|
|
||||||
- 'config/initializers/chewy.rb'
|
|
||||||
- 'config/initializers/devise.rb'
|
|
||||||
- 'config/initializers/paperclip.rb'
|
|
||||||
- 'config/puma.rb'
|
|
||||||
|
|
||||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
# Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods, MaxChainLength.
|
# Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods, MaxChainLength.
|
||||||
# AllowedMethods: present?, blank?, presence, try, try!
|
# AllowedMethods: present?, blank?, presence, try, try!
|
||||||
|
@ -244,52 +176,12 @@ Style/SafeNavigation:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'app/models/concerns/account/finder_concern.rb'
|
- 'app/models/concerns/account/finder_concern.rb'
|
||||||
|
|
||||||
# This cop supports safe autocorrection (--autocorrect).
|
|
||||||
# Configuration parameters: EnforcedStyle.
|
|
||||||
# SupportedStyles: only_raise, only_fail, semantic
|
|
||||||
Style/SignalException:
|
|
||||||
Exclude:
|
|
||||||
- 'lib/devise/strategies/two_factor_ldap_authenticatable.rb'
|
|
||||||
- 'lib/devise/strategies/two_factor_pam_authenticatable.rb'
|
|
||||||
|
|
||||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
|
||||||
Style/SingleArgumentDig:
|
|
||||||
Exclude:
|
|
||||||
- 'lib/webpacker/manifest_extensions.rb'
|
|
||||||
|
|
||||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
# This cop supports unsafe autocorrection (--autocorrect-all).
|
||||||
# Configuration parameters: Mode.
|
# Configuration parameters: Mode.
|
||||||
Style/StringConcatenation:
|
Style/StringConcatenation:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'config/initializers/paperclip.rb'
|
- 'config/initializers/paperclip.rb'
|
||||||
|
|
||||||
# This cop supports safe autocorrection (--autocorrect).
|
|
||||||
# Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline.
|
|
||||||
# SupportedStyles: single_quotes, double_quotes
|
|
||||||
Style/StringLiterals:
|
|
||||||
Exclude:
|
|
||||||
- 'config/environments/production.rb'
|
|
||||||
- 'config/initializers/backtrace_silencers.rb'
|
|
||||||
- 'config/initializers/http_client_proxy.rb'
|
|
||||||
- 'config/initializers/rack_attack.rb'
|
|
||||||
- 'config/initializers/webauthn.rb'
|
|
||||||
- 'config/routes.rb'
|
|
||||||
|
|
||||||
# This cop supports safe autocorrection (--autocorrect).
|
|
||||||
# Configuration parameters: EnforcedStyleForMultiline.
|
|
||||||
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
|
|
||||||
Style/TrailingCommaInArguments:
|
|
||||||
Exclude:
|
|
||||||
- 'config/initializers/paperclip.rb'
|
|
||||||
|
|
||||||
# This cop supports safe autocorrection (--autocorrect).
|
|
||||||
# Configuration parameters: EnforcedStyleForMultiline.
|
|
||||||
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
|
|
||||||
Style/TrailingCommaInHashLiteral:
|
|
||||||
Exclude:
|
|
||||||
- 'config/environments/production.rb'
|
|
||||||
- 'config/environments/test.rb'
|
|
||||||
|
|
||||||
# This cop supports safe autocorrection (--autocorrect).
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
# Configuration parameters: WordRegex.
|
# Configuration parameters: WordRegex.
|
||||||
# SupportedStyles: percent, brackets
|
# SupportedStyles: percent, brackets
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
3.2.3
|
3.3.1
|
||||||
|
|
22
.simplecov
22
.simplecov
|
@ -1,22 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
if ENV['CI']
|
|
||||||
require 'simplecov-lcov'
|
|
||||||
SimpleCov::Formatter::LcovFormatter.config.report_with_single_file = true
|
|
||||||
SimpleCov.formatter = SimpleCov::Formatter::LcovFormatter
|
|
||||||
else
|
|
||||||
SimpleCov.formatter = SimpleCov::Formatter::HTMLFormatter
|
|
||||||
end
|
|
||||||
|
|
||||||
SimpleCov.start 'rails' do
|
|
||||||
enable_coverage :branch
|
|
||||||
|
|
||||||
add_filter 'lib/linter'
|
|
||||||
|
|
||||||
add_group 'Libraries', 'lib'
|
|
||||||
add_group 'Policies', 'app/policies'
|
|
||||||
add_group 'Presenters', 'app/presenters'
|
|
||||||
add_group 'Serializers', 'app/serializers'
|
|
||||||
add_group 'Services', 'app/services'
|
|
||||||
add_group 'Validators', 'app/validators'
|
|
||||||
end
|
|
19
Dockerfile
19
Dockerfile
|
@ -1,4 +1,4 @@
|
||||||
# syntax=docker/dockerfile:1.4
|
# syntax=docker/dockerfile:1.7
|
||||||
|
|
||||||
# Please see https://docs.docker.com/engine/reference/builder for information about
|
# Please see https://docs.docker.com/engine/reference/builder for information about
|
||||||
# the extended buildx capabilities used in this file.
|
# the extended buildx capabilities used in this file.
|
||||||
|
@ -7,15 +7,15 @@
|
||||||
ARG TARGETPLATFORM=${TARGETPLATFORM}
|
ARG TARGETPLATFORM=${TARGETPLATFORM}
|
||||||
ARG BUILDPLATFORM=${BUILDPLATFORM}
|
ARG BUILDPLATFORM=${BUILDPLATFORM}
|
||||||
|
|
||||||
# Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.2.3"]
|
# Ruby image to use for base image, change with [--build-arg RUBY_VERSION="3.3.1"]
|
||||||
ARG RUBY_VERSION="3.2.3"
|
ARG RUBY_VERSION="3.3.1"
|
||||||
# # Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
|
# # Node version to use in base image, change with [--build-arg NODE_MAJOR_VERSION="20"]
|
||||||
ARG NODE_MAJOR_VERSION="20"
|
ARG NODE_MAJOR_VERSION="20"
|
||||||
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="bookworm"]
|
# Debian image to use for base image, change with [--build-arg DEBIAN_VERSION="bookworm"]
|
||||||
ARG DEBIAN_VERSION="bookworm"
|
ARG DEBIAN_VERSION="bookworm"
|
||||||
# Node image to use for base image based on combined variables (ex: 20-bookworm-slim)
|
# Node image to use for base image based on combined variables (ex: 20-bookworm-slim)
|
||||||
FROM docker.io/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim as node
|
FROM docker.io/node:${NODE_MAJOR_VERSION}-${DEBIAN_VERSION}-slim as node
|
||||||
# Ruby image to use for base image based on combined variables (ex: 3.2.3-slim-bookworm)
|
# Ruby image to use for base image based on combined variables (ex: 3.3.1-slim-bookworm)
|
||||||
FROM docker.io/ruby:${RUBY_VERSION}-slim-${DEBIAN_VERSION} as ruby
|
FROM docker.io/ruby:${RUBY_VERSION}-slim-${DEBIAN_VERSION} as ruby
|
||||||
|
|
||||||
# Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA
|
# Resulting version string is vX.X.X-MASTODON_VERSION_PRERELEASE+MASTODON_VERSION_METADATA
|
||||||
|
@ -29,7 +29,7 @@ ARG MASTODON_VERSION_METADATA=""
|
||||||
# See: https://docs.joinmastodon.org/admin/config/#rails_serve_static_files
|
# See: https://docs.joinmastodon.org/admin/config/#rails_serve_static_files
|
||||||
ARG RAILS_SERVE_STATIC_FILES="true"
|
ARG RAILS_SERVE_STATIC_FILES="true"
|
||||||
# Allow to use YJIT compiler
|
# Allow to use YJIT compiler
|
||||||
# See: https://github.com/ruby/ruby/blob/v3_2_3/doc/yjit/yjit.md
|
# See: https://github.com/ruby/ruby/blob/v3_2_4/doc/yjit/yjit.md
|
||||||
ARG RUBY_YJIT_ENABLE="1"
|
ARG RUBY_YJIT_ENABLE="1"
|
||||||
# Timezone used by the Docker container and runtime, change with [--build-arg TZ=Europe/Berlin]
|
# Timezone used by the Docker container and runtime, change with [--build-arg TZ=Europe/Berlin]
|
||||||
ARG TZ="Etc/UTC"
|
ARG TZ="Etc/UTC"
|
||||||
|
@ -205,7 +205,12 @@ ARG TARGETPLATFORM
|
||||||
|
|
||||||
RUN \
|
RUN \
|
||||||
# Use Ruby on Rails to create Mastodon assets
|
# Use Ruby on Rails to create Mastodon assets
|
||||||
OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder bundle exec rails assets:precompile; \
|
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=precompile_placeholder \
|
||||||
|
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=precompile_placeholder \
|
||||||
|
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=precompile_placeholder \
|
||||||
|
OTP_SECRET=precompile_placeholder \
|
||||||
|
SECRET_KEY_BASE=precompile_placeholder \
|
||||||
|
bundle exec rails assets:precompile; \
|
||||||
# Cleanup temporary files
|
# Cleanup temporary files
|
||||||
rm -fr /opt/mastodon/tmp;
|
rm -fr /opt/mastodon/tmp;
|
||||||
|
|
||||||
|
@ -257,4 +262,4 @@ USER mastodon
|
||||||
# Expose default Puma ports
|
# Expose default Puma ports
|
||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
# Set container tini as default entry point
|
# Set container tini as default entry point
|
||||||
ENTRYPOINT ["/usr/bin/tini", "--"]
|
ENTRYPOINT ["/usr/bin/tini", "--"]
|
||||||
|
|
69
Gemfile
69
Gemfile
|
@ -1,37 +1,37 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
ruby '>= 3.0.0'
|
ruby '>= 3.1.0'
|
||||||
|
|
||||||
gem 'puma', '~> 6.3'
|
|
||||||
gem 'rails', '~> 7.1.1'
|
|
||||||
gem 'propshaft'
|
gem 'propshaft'
|
||||||
gem 'thor', '~> 1.2'
|
gem 'puma', '~> 6.3'
|
||||||
gem 'rack', '~> 2.2.7'
|
gem 'rack', '~> 2.2.7'
|
||||||
|
gem 'rails', '~> 7.1.1'
|
||||||
|
gem 'thor', '~> 1.2'
|
||||||
|
|
||||||
# For why irb is in the Gemfile, see: https://ruby.social/@st0012/111444685161478182
|
# For why irb is in the Gemfile, see: https://ruby.social/@st0012/111444685161478182
|
||||||
gem 'irb', '~> 1.8'
|
gem 'irb', '~> 1.8'
|
||||||
|
|
||||||
|
gem 'dotenv'
|
||||||
gem 'haml-rails', '~>2.0'
|
gem 'haml-rails', '~>2.0'
|
||||||
gem 'pg', '~> 1.5'
|
gem 'pg', '~> 1.5'
|
||||||
gem 'pghero'
|
gem 'pghero'
|
||||||
gem 'dotenv-rails', '~> 2.8'
|
|
||||||
|
|
||||||
gem 'aws-sdk-s3', '~> 1.123', require: false
|
gem 'aws-sdk-s3', '~> 1.123', require: false
|
||||||
|
gem 'blurhash', '~> 0.1'
|
||||||
gem 'fog-core', '<= 2.4.0'
|
gem 'fog-core', '<= 2.4.0'
|
||||||
gem 'fog-openstack', '~> 1.0', require: false
|
gem 'fog-openstack', '~> 1.0', require: false
|
||||||
gem 'kt-paperclip', '~> 7.2'
|
gem 'kt-paperclip', '~> 7.2'
|
||||||
gem 'md-paperclip-azure', '~> 2.2', require: false
|
gem 'md-paperclip-azure', '~> 2.2', require: false
|
||||||
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.18.0', require: false
|
gem 'bootsnap', '~> 1.18.0', require: false
|
||||||
gem 'browser'
|
gem 'browser'
|
||||||
gem 'charlock_holmes', '~> 0.7.7'
|
gem 'charlock_holmes', github: 'TheEssem/charlock_holmes', ref: '226932af4b03eb60d2e31d58b6c3efd72a3ace68'
|
||||||
gem 'chewy', '~> 7.3'
|
gem 'chewy', '~> 7.3'
|
||||||
gem 'devise', '~> 4.9'
|
gem 'devise', '~> 4.9'
|
||||||
gem 'devise-two-factor', '~> 4.1'
|
gem 'devise-two-factor'
|
||||||
|
|
||||||
group :pam_authentication, optional: true do
|
group :pam_authentication, optional: true do
|
||||||
gem 'devise_pam_authenticatable2', '~> 9.2'
|
gem 'devise_pam_authenticatable2', '~> 9.2'
|
||||||
|
@ -39,11 +39,11 @@ end
|
||||||
|
|
||||||
gem 'net-ldap', '~> 0.18'
|
gem 'net-ldap', '~> 0.18'
|
||||||
|
|
||||||
gem 'omniauth-cas', '~> 3.0.0.beta.1'
|
|
||||||
gem 'omniauth-saml', '~> 2.0'
|
|
||||||
gem 'omniauth_openid_connect', '~> 0.6.1'
|
|
||||||
gem 'omniauth', '~> 2.0'
|
gem 'omniauth', '~> 2.0'
|
||||||
|
gem 'omniauth-cas', '~> 3.0.0.beta.1'
|
||||||
|
gem 'omniauth_openid_connect', '~> 0.6.1'
|
||||||
gem 'omniauth-rails_csrf_protection', '~> 1.0'
|
gem 'omniauth-rails_csrf_protection', '~> 1.0'
|
||||||
|
gem 'omniauth-saml', '~> 2.0'
|
||||||
|
|
||||||
gem 'color_diff', '~> 0.1'
|
gem 'color_diff', '~> 0.1'
|
||||||
gem 'csv', '~> 3.2'
|
gem 'csv', '~> 3.2'
|
||||||
|
@ -53,49 +53,49 @@ 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.10'
|
|
||||||
gem 'htmlentities', '~> 4.3'
|
gem 'htmlentities', '~> 4.3'
|
||||||
gem 'http', '~> 5.1'
|
gem 'http', '~> 5.2.0'
|
||||||
gem 'http_accept_language', '~> 2.1'
|
gem 'http_accept_language', '~> 2.1'
|
||||||
gem 'httplog', '~> 1.6.2'
|
gem 'httplog', '~> 1.6.2'
|
||||||
|
gem 'i18n'
|
||||||
gem 'idn-ruby', require: 'idn'
|
gem 'idn-ruby', require: 'idn'
|
||||||
gem 'inline_svg'
|
gem 'inline_svg'
|
||||||
gem 'kaminari', '~> 1.2'
|
gem 'kaminari', '~> 1.2'
|
||||||
gem 'link_header', '~> 0.0'
|
gem 'link_header', '~> 0.0'
|
||||||
|
gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
|
||||||
gem 'mime-types', '~> 3.5.0', require: 'mime/types/columnar'
|
gem 'mime-types', '~> 3.5.0', require: 'mime/types/columnar'
|
||||||
gem 'nokogiri', '~> 1.15'
|
gem 'nokogiri', '~> 1.15'
|
||||||
gem 'nsa'
|
gem 'nsa'
|
||||||
gem 'oj', '~> 3.14'
|
gem 'oj', '~> 3.14'
|
||||||
gem 'ox', '~> 2.14'
|
gem 'ox', '~> 2.14'
|
||||||
gem 'parslet'
|
gem 'parslet'
|
||||||
gem 'posix-spawn'
|
gem 'premailer-rails'
|
||||||
gem 'public_suffix', '~> 5.0'
|
gem 'public_suffix', '~> 5.0'
|
||||||
gem 'pundit', '~> 2.3'
|
gem 'pundit', '~> 2.3'
|
||||||
gem 'premailer-rails'
|
|
||||||
gem 'rack-attack', '~> 6.6'
|
gem 'rack-attack', '~> 6.6'
|
||||||
gem 'rack-cors', '~> 2.0', require: 'rack/cors'
|
gem 'rack-cors', '~> 2.0', require: 'rack/cors'
|
||||||
gem 'rails-i18n', '~> 7.0'
|
gem 'rails-i18n', '~> 7.0'
|
||||||
gem 'redcarpet', '~> 3.6'
|
gem 'redcarpet', '~> 3.6'
|
||||||
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 'redis-namespace', '~> 1.10'
|
||||||
gem 'rqrcode', '~> 2.2'
|
gem 'rqrcode', '~> 2.2'
|
||||||
gem 'ruby-progressbar', '~> 1.13'
|
gem 'ruby-progressbar', '~> 1.13'
|
||||||
gem 'sanitize', '~> 6.0'
|
gem 'sanitize', '~> 6.0'
|
||||||
gem 'scenic', '~> 1.7'
|
gem 'scenic', '~> 1.7'
|
||||||
gem 'sidekiq', '~> 6.5'
|
gem 'sidekiq', '~> 6.5'
|
||||||
|
gem 'sidekiq-bulk', '~> 0.2.0'
|
||||||
gem 'sidekiq-scheduler', '~> 5.0'
|
gem 'sidekiq-scheduler', '~> 5.0'
|
||||||
gem 'sidekiq-unique-jobs', '~> 7.1'
|
gem 'sidekiq-unique-jobs', '~> 7.1'
|
||||||
gem 'sidekiq-bulk', '~> 0.2.0'
|
|
||||||
gem 'simple-navigation', '~> 4.4'
|
|
||||||
gem 'simple_form', '~> 5.2'
|
gem 'simple_form', '~> 5.2'
|
||||||
gem 'stoplight', '~> 3.0.1'
|
gem 'simple-navigation', '~> 4.4'
|
||||||
gem 'strong_migrations', '1.7.0'
|
gem 'stoplight', '~> 4.1'
|
||||||
|
gem 'strong_migrations', '1.8.0'
|
||||||
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.2023'
|
gem 'tzinfo-data', '~> 1.2023'
|
||||||
|
gem 'webauthn', '~> 3.0'
|
||||||
gem 'webpacker', '~> 5.4'
|
gem 'webpacker', '~> 5.4'
|
||||||
gem 'webpush', github: 'ClearlyClaire/webpush', ref: 'f14a4d52e201128b1b00245d11b6de80d6cfdcd9'
|
gem 'webpush', github: 'ClearlyClaire/webpush', ref: 'f14a4d52e201128b1b00245d11b6de80d6cfdcd9'
|
||||||
gem 'webauthn', '~> 3.0'
|
|
||||||
|
|
||||||
gem 'json-ld'
|
gem 'json-ld'
|
||||||
gem 'json-ld-preloaded', '~> 3.2'
|
gem 'json-ld-preloaded', '~> 3.2'
|
||||||
|
@ -103,6 +103,24 @@ gem 'rdf-normalize', '~> 0.5'
|
||||||
|
|
||||||
gem 'private_address_check', '~> 0.5'
|
gem 'private_address_check', '~> 0.5'
|
||||||
|
|
||||||
|
group :opentelemetry do
|
||||||
|
gem 'opentelemetry-exporter-otlp', '~> 0.26.3', require: false
|
||||||
|
gem 'opentelemetry-instrumentation-active_job', '~> 0.7.1', require: false
|
||||||
|
gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.20.1', require: false
|
||||||
|
gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.21.2', require: false
|
||||||
|
gem 'opentelemetry-instrumentation-excon', '~> 0.22.0', require: false
|
||||||
|
gem 'opentelemetry-instrumentation-faraday', '~> 0.24.1', require: false
|
||||||
|
gem 'opentelemetry-instrumentation-http', '~> 0.23.2', require: false
|
||||||
|
gem 'opentelemetry-instrumentation-http_client', '~> 0.22.3', require: false
|
||||||
|
gem 'opentelemetry-instrumentation-net_http', '~> 0.22.4', require: false
|
||||||
|
gem 'opentelemetry-instrumentation-pg', '~> 0.27.1', require: false
|
||||||
|
gem 'opentelemetry-instrumentation-rack', '~> 0.24.1', require: false
|
||||||
|
gem 'opentelemetry-instrumentation-rails', '~> 0.30.0', require: false
|
||||||
|
gem 'opentelemetry-instrumentation-redis', '~> 0.25.3', require: false
|
||||||
|
gem 'opentelemetry-instrumentation-sidekiq', '~> 0.25.2', require: false
|
||||||
|
gem 'opentelemetry-sdk', '~> 1.4', require: false
|
||||||
|
end
|
||||||
|
|
||||||
group :test do
|
group :test do
|
||||||
# Adds RSpec Error/Warning annotations to GitHub PRs on the Files tab
|
# Adds RSpec Error/Warning annotations to GitHub PRs on the Files tab
|
||||||
gem 'rspec-github', '~> 2.4', require: false
|
gem 'rspec-github', '~> 2.4', require: false
|
||||||
|
@ -114,7 +132,7 @@ group :test do
|
||||||
gem 'email_spec'
|
gem 'email_spec'
|
||||||
|
|
||||||
# Extra RSpec extension methods and helpers for sidekiq
|
# Extra RSpec extension methods and helpers for sidekiq
|
||||||
gem 'rspec-sidekiq', '~> 4.0'
|
gem 'rspec-sidekiq', '~> 5.0'
|
||||||
|
|
||||||
# Browser integration testing
|
# Browser integration testing
|
||||||
gem 'capybara', '~> 3.39'
|
gem 'capybara', '~> 3.39'
|
||||||
|
@ -160,7 +178,7 @@ group :development do
|
||||||
|
|
||||||
# Preview mail in the browser
|
# Preview mail in the browser
|
||||||
gem 'letter_opener', '~> 1.8'
|
gem 'letter_opener', '~> 1.8'
|
||||||
gem 'letter_opener_web', '~> 2.0'
|
gem 'letter_opener_web', '~> 3.0'
|
||||||
|
|
||||||
# Security analysis CLI tools
|
# Security analysis CLI tools
|
||||||
gem 'brakeman', '~> 6.0', require: false
|
gem 'brakeman', '~> 6.0', require: false
|
||||||
|
@ -197,13 +215,14 @@ group :production do
|
||||||
gem 'lograge', '~> 0.12'
|
gem 'lograge', '~> 0.12'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
gem 'cocoon', '~> 1.2'
|
||||||
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'
|
|
||||||
|
|
||||||
gem 'net-http', '~> 0.4.0'
|
gem 'net-http', '~> 0.4.0'
|
||||||
gem 'rubyzip', '~> 2.3'
|
gem 'rubyzip', '~> 2.3'
|
||||||
|
|
||||||
gem 'hcaptcha', '~> 7.1'
|
gem 'hcaptcha', '~> 7.1'
|
||||||
|
|
||||||
|
gem 'mail', '~> 2.8'
|
||||||
|
|
488
Gemfile.lock
488
Gemfile.lock
|
@ -7,38 +7,45 @@ GIT
|
||||||
hkdf (~> 0.2)
|
hkdf (~> 0.2)
|
||||||
jwt (~> 2.0)
|
jwt (~> 2.0)
|
||||||
|
|
||||||
|
GIT
|
||||||
|
remote: https://github.com/TheEssem/charlock_holmes.git
|
||||||
|
revision: 226932af4b03eb60d2e31d58b6c3efd72a3ace68
|
||||||
|
ref: 226932af4b03eb60d2e31d58b6c3efd72a3ace68
|
||||||
|
specs:
|
||||||
|
charlock_holmes (0.7.7)
|
||||||
|
|
||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
actioncable (7.1.3.2)
|
actioncable (7.1.3.3)
|
||||||
actionpack (= 7.1.3.2)
|
actionpack (= 7.1.3.3)
|
||||||
activesupport (= 7.1.3.2)
|
activesupport (= 7.1.3.3)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
websocket-driver (>= 0.6.1)
|
websocket-driver (>= 0.6.1)
|
||||||
zeitwerk (~> 2.6)
|
zeitwerk (~> 2.6)
|
||||||
actionmailbox (7.1.3.2)
|
actionmailbox (7.1.3.3)
|
||||||
actionpack (= 7.1.3.2)
|
actionpack (= 7.1.3.3)
|
||||||
activejob (= 7.1.3.2)
|
activejob (= 7.1.3.3)
|
||||||
activerecord (= 7.1.3.2)
|
activerecord (= 7.1.3.3)
|
||||||
activestorage (= 7.1.3.2)
|
activestorage (= 7.1.3.3)
|
||||||
activesupport (= 7.1.3.2)
|
activesupport (= 7.1.3.3)
|
||||||
mail (>= 2.7.1)
|
mail (>= 2.7.1)
|
||||||
net-imap
|
net-imap
|
||||||
net-pop
|
net-pop
|
||||||
net-smtp
|
net-smtp
|
||||||
actionmailer (7.1.3.2)
|
actionmailer (7.1.3.3)
|
||||||
actionpack (= 7.1.3.2)
|
actionpack (= 7.1.3.3)
|
||||||
actionview (= 7.1.3.2)
|
actionview (= 7.1.3.3)
|
||||||
activejob (= 7.1.3.2)
|
activejob (= 7.1.3.3)
|
||||||
activesupport (= 7.1.3.2)
|
activesupport (= 7.1.3.3)
|
||||||
mail (~> 2.5, >= 2.5.4)
|
mail (~> 2.5, >= 2.5.4)
|
||||||
net-imap
|
net-imap
|
||||||
net-pop
|
net-pop
|
||||||
net-smtp
|
net-smtp
|
||||||
rails-dom-testing (~> 2.2)
|
rails-dom-testing (~> 2.2)
|
||||||
actionpack (7.1.3.2)
|
actionpack (7.1.3.3)
|
||||||
actionview (= 7.1.3.2)
|
actionview (= 7.1.3.3)
|
||||||
activesupport (= 7.1.3.2)
|
activesupport (= 7.1.3.3)
|
||||||
nokogiri (>= 1.8.5)
|
nokogiri (>= 1.8.5)
|
||||||
racc
|
racc
|
||||||
rack (>= 2.2.4)
|
rack (>= 2.2.4)
|
||||||
|
@ -46,15 +53,15 @@ GEM
|
||||||
rack-test (>= 0.6.3)
|
rack-test (>= 0.6.3)
|
||||||
rails-dom-testing (~> 2.2)
|
rails-dom-testing (~> 2.2)
|
||||||
rails-html-sanitizer (~> 1.6)
|
rails-html-sanitizer (~> 1.6)
|
||||||
actiontext (7.1.3.2)
|
actiontext (7.1.3.3)
|
||||||
actionpack (= 7.1.3.2)
|
actionpack (= 7.1.3.3)
|
||||||
activerecord (= 7.1.3.2)
|
activerecord (= 7.1.3.3)
|
||||||
activestorage (= 7.1.3.2)
|
activestorage (= 7.1.3.3)
|
||||||
activesupport (= 7.1.3.2)
|
activesupport (= 7.1.3.3)
|
||||||
globalid (>= 0.6.0)
|
globalid (>= 0.6.0)
|
||||||
nokogiri (>= 1.8.5)
|
nokogiri (>= 1.8.5)
|
||||||
actionview (7.1.3.2)
|
actionview (7.1.3.3)
|
||||||
activesupport (= 7.1.3.2)
|
activesupport (= 7.1.3.3)
|
||||||
builder (~> 3.1)
|
builder (~> 3.1)
|
||||||
erubi (~> 1.11)
|
erubi (~> 1.11)
|
||||||
rails-dom-testing (~> 2.2)
|
rails-dom-testing (~> 2.2)
|
||||||
|
@ -64,22 +71,22 @@ GEM
|
||||||
activemodel (>= 4.1)
|
activemodel (>= 4.1)
|
||||||
case_transform (>= 0.2)
|
case_transform (>= 0.2)
|
||||||
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
|
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
|
||||||
activejob (7.1.3.2)
|
activejob (7.1.3.3)
|
||||||
activesupport (= 7.1.3.2)
|
activesupport (= 7.1.3.3)
|
||||||
globalid (>= 0.3.6)
|
globalid (>= 0.3.6)
|
||||||
activemodel (7.1.3.2)
|
activemodel (7.1.3.3)
|
||||||
activesupport (= 7.1.3.2)
|
activesupport (= 7.1.3.3)
|
||||||
activerecord (7.1.3.2)
|
activerecord (7.1.3.3)
|
||||||
activemodel (= 7.1.3.2)
|
activemodel (= 7.1.3.3)
|
||||||
activesupport (= 7.1.3.2)
|
activesupport (= 7.1.3.3)
|
||||||
timeout (>= 0.4.0)
|
timeout (>= 0.4.0)
|
||||||
activestorage (7.1.3.2)
|
activestorage (7.1.3.3)
|
||||||
actionpack (= 7.1.3.2)
|
actionpack (= 7.1.3.3)
|
||||||
activejob (= 7.1.3.2)
|
activejob (= 7.1.3.3)
|
||||||
activerecord (= 7.1.3.2)
|
activerecord (= 7.1.3.3)
|
||||||
activesupport (= 7.1.3.2)
|
activesupport (= 7.1.3.3)
|
||||||
marcel (~> 1.0)
|
marcel (~> 1.0)
|
||||||
activesupport (7.1.3.2)
|
activesupport (7.1.3.3)
|
||||||
base64
|
base64
|
||||||
bigdecimal
|
bigdecimal
|
||||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||||
|
@ -97,22 +104,20 @@ GEM
|
||||||
activerecord (>= 3.2, < 8.0)
|
activerecord (>= 3.2, < 8.0)
|
||||||
rake (>= 10.4, < 14.0)
|
rake (>= 10.4, < 14.0)
|
||||||
ast (2.4.2)
|
ast (2.4.2)
|
||||||
attr_encrypted (4.0.0)
|
attr_required (1.0.2)
|
||||||
encryptor (~> 3.0.0)
|
|
||||||
attr_required (1.0.1)
|
|
||||||
awrence (1.2.1)
|
awrence (1.2.1)
|
||||||
aws-eventstream (1.3.0)
|
aws-eventstream (1.3.0)
|
||||||
aws-partitions (1.873.0)
|
aws-partitions (1.929.0)
|
||||||
aws-sdk-core (3.190.1)
|
aws-sdk-core (3.196.1)
|
||||||
aws-eventstream (~> 1, >= 1.3.0)
|
aws-eventstream (~> 1, >= 1.3.0)
|
||||||
aws-partitions (~> 1, >= 1.651.0)
|
aws-partitions (~> 1, >= 1.651.0)
|
||||||
aws-sigv4 (~> 1.8)
|
aws-sigv4 (~> 1.8)
|
||||||
jmespath (~> 1, >= 1.6.1)
|
jmespath (~> 1, >= 1.6.1)
|
||||||
aws-sdk-kms (1.75.0)
|
aws-sdk-kms (1.81.0)
|
||||||
aws-sdk-core (~> 3, >= 3.188.0)
|
aws-sdk-core (~> 3, >= 3.193.0)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.1)
|
||||||
aws-sdk-s3 (1.142.0)
|
aws-sdk-s3 (1.151.0)
|
||||||
aws-sdk-core (~> 3, >= 3.189.0)
|
aws-sdk-core (~> 3, >= 3.194.0)
|
||||||
aws-sdk-kms (~> 1)
|
aws-sdk-kms (~> 1)
|
||||||
aws-sigv4 (~> 1.8)
|
aws-sigv4 (~> 1.8)
|
||||||
aws-sigv4 (1.8.0)
|
aws-sigv4 (1.8.0)
|
||||||
|
@ -132,17 +137,10 @@ GEM
|
||||||
erubi (>= 1.0.0)
|
erubi (>= 1.0.0)
|
||||||
rack (>= 0.9.0)
|
rack (>= 0.9.0)
|
||||||
rouge (>= 1.0.0)
|
rouge (>= 1.0.0)
|
||||||
better_html (2.0.2)
|
bigdecimal (3.1.8)
|
||||||
actionview (>= 6.0)
|
bindata (2.5.0)
|
||||||
activesupport (>= 6.0)
|
binding_of_caller (1.0.1)
|
||||||
ast (~> 2.0)
|
debug_inspector (>= 1.2.0)
|
||||||
erubi (~> 1.4)
|
|
||||||
parser (>= 2.4)
|
|
||||||
smart_properties
|
|
||||||
bigdecimal (3.1.6)
|
|
||||||
bindata (2.4.15)
|
|
||||||
binding_of_caller (1.0.0)
|
|
||||||
debug_inspector (>= 0.0.1)
|
|
||||||
blurhash (0.1.7)
|
blurhash (0.1.7)
|
||||||
bootsnap (1.18.3)
|
bootsnap (1.18.3)
|
||||||
msgpack (~> 1.2)
|
msgpack (~> 1.2)
|
||||||
|
@ -167,11 +165,10 @@ GEM
|
||||||
xpath (~> 3.2)
|
xpath (~> 3.2)
|
||||||
case_transform (0.2)
|
case_transform (0.2)
|
||||||
activesupport
|
activesupport
|
||||||
cbor (0.5.9.6)
|
cbor (0.5.9.8)
|
||||||
charlock_holmes (0.7.7)
|
chewy (7.6.0)
|
||||||
chewy (7.5.1)
|
|
||||||
activesupport (>= 5.2)
|
activesupport (>= 5.2)
|
||||||
elasticsearch (>= 7.12.0, < 7.14.0)
|
elasticsearch (>= 7.14.0, < 8)
|
||||||
elasticsearch-dsl
|
elasticsearch-dsl
|
||||||
chunky_png (1.4.0)
|
chunky_png (1.4.0)
|
||||||
climate_control (1.2.0)
|
climate_control (1.2.0)
|
||||||
|
@ -182,72 +179,65 @@ GEM
|
||||||
cose (1.3.0)
|
cose (1.3.0)
|
||||||
cbor (~> 0.5.9)
|
cbor (~> 0.5.9)
|
||||||
openssl-signature_algorithm (~> 1.0)
|
openssl-signature_algorithm (~> 1.0)
|
||||||
crack (0.4.6)
|
crack (1.0.0)
|
||||||
bigdecimal
|
bigdecimal
|
||||||
rexml
|
rexml
|
||||||
crass (1.0.6)
|
crass (1.0.6)
|
||||||
css_parser (1.14.0)
|
css_parser (1.17.1)
|
||||||
addressable
|
addressable
|
||||||
csv (3.2.8)
|
csv (3.3.0)
|
||||||
database_cleaner-active_record (2.1.0)
|
database_cleaner-active_record (2.1.0)
|
||||||
activerecord (>= 5.a)
|
activerecord (>= 5.a)
|
||||||
database_cleaner-core (~> 2.0.0)
|
database_cleaner-core (~> 2.0.0)
|
||||||
database_cleaner-core (2.0.1)
|
database_cleaner-core (2.0.1)
|
||||||
date (3.3.4)
|
date (3.3.4)
|
||||||
debug (1.9.1)
|
debug (1.9.2)
|
||||||
irb (~> 1.10)
|
irb (~> 1.10)
|
||||||
reline (>= 0.3.8)
|
reline (>= 0.3.8)
|
||||||
debug_inspector (1.1.0)
|
debug_inspector (1.2.0)
|
||||||
devise (4.9.3)
|
devise (4.9.4)
|
||||||
bcrypt (~> 3.0)
|
bcrypt (~> 3.0)
|
||||||
orm_adapter (~> 0.1)
|
orm_adapter (~> 0.1)
|
||||||
railties (>= 4.1.0)
|
railties (>= 4.1.0)
|
||||||
responders
|
responders
|
||||||
warden (~> 1.2.3)
|
warden (~> 1.2.3)
|
||||||
devise-two-factor (4.1.1)
|
devise-two-factor (5.0.0)
|
||||||
activesupport (~> 7.0)
|
activesupport (~> 7.0)
|
||||||
attr_encrypted (>= 1.3, < 5, != 2)
|
|
||||||
devise (~> 4.0)
|
devise (~> 4.0)
|
||||||
railties (~> 7.0)
|
railties (~> 7.0)
|
||||||
rotp (~> 6.0)
|
rotp (~> 6.0)
|
||||||
devise_pam_authenticatable2 (9.2.0)
|
devise_pam_authenticatable2 (9.2.0)
|
||||||
devise (>= 4.0.0)
|
devise (>= 4.0.0)
|
||||||
rpam2 (~> 4.0)
|
rpam2 (~> 4.0)
|
||||||
diff-lcs (1.5.0)
|
diff-lcs (1.5.1)
|
||||||
discard (1.3.0)
|
discard (1.3.0)
|
||||||
activerecord (>= 4.2, < 8)
|
activerecord (>= 4.2, < 8)
|
||||||
docile (1.4.0)
|
docile (1.4.0)
|
||||||
domain_name (0.5.20190701)
|
domain_name (0.6.20240107)
|
||||||
unf (>= 0.0.5, < 1.0.0)
|
|
||||||
doorkeeper (5.6.9)
|
doorkeeper (5.6.9)
|
||||||
railties (>= 5)
|
railties (>= 5)
|
||||||
dotenv (2.8.1)
|
dotenv (3.1.2)
|
||||||
dotenv-rails (2.8.1)
|
drb (2.2.1)
|
||||||
dotenv (= 2.8.1)
|
|
||||||
railties (>= 3.2)
|
|
||||||
drb (2.2.0)
|
|
||||||
ruby2_keywords
|
|
||||||
ed25519 (1.3.0)
|
ed25519 (1.3.0)
|
||||||
elasticsearch (7.13.3)
|
elasticsearch (7.17.10)
|
||||||
elasticsearch-api (= 7.13.3)
|
elasticsearch-api (= 7.17.10)
|
||||||
elasticsearch-transport (= 7.13.3)
|
elasticsearch-transport (= 7.17.10)
|
||||||
elasticsearch-api (7.13.3)
|
elasticsearch-api (7.17.10)
|
||||||
multi_json
|
multi_json
|
||||||
elasticsearch-dsl (0.1.10)
|
elasticsearch-dsl (0.1.10)
|
||||||
elasticsearch-transport (7.13.3)
|
elasticsearch-transport (7.17.10)
|
||||||
faraday (~> 1)
|
faraday (>= 1, < 3)
|
||||||
multi_json
|
multi_json
|
||||||
email_spec (2.2.2)
|
email_spec (2.2.2)
|
||||||
htmlentities (~> 4.3.3)
|
htmlentities (~> 4.3.3)
|
||||||
launchy (~> 2.1)
|
launchy (~> 2.1)
|
||||||
mail (~> 2.7)
|
mail (~> 2.7)
|
||||||
encryptor (3.0.0)
|
|
||||||
erubi (1.12.0)
|
erubi (1.12.0)
|
||||||
et-orbi (1.2.7)
|
et-orbi (1.2.11)
|
||||||
tzinfo
|
tzinfo
|
||||||
excon (0.109.0)
|
excon (0.110.0)
|
||||||
fabrication (2.31.0)
|
fabrication (2.31.0)
|
||||||
faker (3.2.3)
|
faker (3.3.1)
|
||||||
i18n (>= 1.8.11, < 2)
|
i18n (>= 1.8.11, < 2)
|
||||||
faraday (1.10.3)
|
faraday (1.10.3)
|
||||||
faraday-em_http (~> 1.0)
|
faraday-em_http (~> 1.0)
|
||||||
|
@ -275,10 +265,10 @@ GEM
|
||||||
faraday_middleware (1.2.0)
|
faraday_middleware (1.2.0)
|
||||||
faraday (~> 1.0)
|
faraday (~> 1.0)
|
||||||
fast_blank (1.0.1)
|
fast_blank (1.0.1)
|
||||||
fastimage (2.3.0)
|
fastimage (2.3.1)
|
||||||
ffi (1.15.5)
|
ffi (1.16.3)
|
||||||
ffi-compiler (1.0.1)
|
ffi-compiler (1.3.2)
|
||||||
ffi (>= 1.0.0)
|
ffi (>= 1.15.5)
|
||||||
rake
|
rake
|
||||||
fog-core (2.4.0)
|
fog-core (2.4.0)
|
||||||
builder
|
builder
|
||||||
|
@ -288,11 +278,11 @@ GEM
|
||||||
fog-json (1.2.0)
|
fog-json (1.2.0)
|
||||||
fog-core
|
fog-core
|
||||||
multi_json (~> 1.10)
|
multi_json (~> 1.10)
|
||||||
fog-openstack (1.1.0)
|
fog-openstack (1.1.1)
|
||||||
fog-core (~> 2.1)
|
fog-core (~> 2.1)
|
||||||
fog-json (>= 1.0)
|
fog-json (>= 1.0)
|
||||||
formatador (1.1.0)
|
formatador (1.1.0)
|
||||||
fugit (1.8.1)
|
fugit (1.10.1)
|
||||||
et-orbi (~> 1, >= 1.2.7)
|
et-orbi (~> 1, >= 1.2.7)
|
||||||
raabro (~> 1.4)
|
raabro (~> 1.4)
|
||||||
fuubar (2.5.1)
|
fuubar (2.5.1)
|
||||||
|
@ -300,6 +290,9 @@ GEM
|
||||||
ruby-progressbar (~> 1.4)
|
ruby-progressbar (~> 1.4)
|
||||||
globalid (1.2.1)
|
globalid (1.2.1)
|
||||||
activesupport (>= 6.1)
|
activesupport (>= 6.1)
|
||||||
|
google-protobuf (3.25.3)
|
||||||
|
googleapis-common-protos-types (1.14.0)
|
||||||
|
google-protobuf (~> 3.18)
|
||||||
haml (6.3.0)
|
haml (6.3.0)
|
||||||
temple (>= 0.8.2)
|
temple (>= 0.8.2)
|
||||||
thor
|
thor
|
||||||
|
@ -309,7 +302,7 @@ GEM
|
||||||
activesupport (>= 5.1)
|
activesupport (>= 5.1)
|
||||||
haml (>= 4.0.6)
|
haml (>= 4.0.6)
|
||||||
railties (>= 5.1)
|
railties (>= 5.1)
|
||||||
haml_lint (0.57.0)
|
haml_lint (0.58.0)
|
||||||
haml (>= 5.0)
|
haml (>= 5.0)
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
rainbow
|
rainbow
|
||||||
|
@ -319,15 +312,16 @@ GEM
|
||||||
hashie (5.0.0)
|
hashie (5.0.0)
|
||||||
hcaptcha (7.1.0)
|
hcaptcha (7.1.0)
|
||||||
json
|
json
|
||||||
highline (2.1.0)
|
highline (3.0.1)
|
||||||
hiredis (0.6.3)
|
hiredis (0.6.3)
|
||||||
hkdf (0.3.0)
|
hkdf (0.3.0)
|
||||||
htmlentities (4.3.4)
|
htmlentities (4.3.4)
|
||||||
http (5.1.1)
|
http (5.2.0)
|
||||||
addressable (~> 2.8)
|
addressable (~> 2.8)
|
||||||
|
base64 (~> 0.1)
|
||||||
http-cookie (~> 1.0)
|
http-cookie (~> 1.0)
|
||||||
http-form_data (~> 2.2)
|
http-form_data (~> 2.2)
|
||||||
llhttp-ffi (~> 0.4.0)
|
llhttp-ffi (~> 0.5.0)
|
||||||
http-cookie (1.0.5)
|
http-cookie (1.0.5)
|
||||||
domain_name (~> 0.5)
|
domain_name (~> 0.5)
|
||||||
http-form_data (2.3.0)
|
http-form_data (2.3.0)
|
||||||
|
@ -336,12 +330,11 @@ GEM
|
||||||
httplog (1.6.3)
|
httplog (1.6.3)
|
||||||
rack (>= 2.0)
|
rack (>= 2.0)
|
||||||
rainbow (>= 2.0.0)
|
rainbow (>= 2.0.0)
|
||||||
i18n (1.14.1)
|
i18n (1.14.5)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
i18n-tasks (1.0.13)
|
i18n-tasks (1.0.14)
|
||||||
activesupport (>= 4.0.2)
|
activesupport (>= 4.0.2)
|
||||||
ast (>= 2.1.0)
|
ast (>= 2.1.0)
|
||||||
better_html (>= 1.0, < 3.0)
|
|
||||||
erubi
|
erubi
|
||||||
highline (>= 2.0.0)
|
highline (>= 2.0.0)
|
||||||
i18n
|
i18n
|
||||||
|
@ -354,11 +347,11 @@ GEM
|
||||||
activesupport (>= 3.0)
|
activesupport (>= 3.0)
|
||||||
nokogiri (>= 1.6)
|
nokogiri (>= 1.6)
|
||||||
io-console (0.7.2)
|
io-console (0.7.2)
|
||||||
irb (1.12.0)
|
irb (1.13.1)
|
||||||
rdoc
|
rdoc (>= 4.0.0)
|
||||||
reline (>= 0.4.2)
|
reline (>= 0.4.2)
|
||||||
jmespath (1.6.2)
|
jmespath (1.6.2)
|
||||||
json (2.7.1)
|
json (2.7.2)
|
||||||
json-canonicalization (1.0.0)
|
json-canonicalization (1.0.0)
|
||||||
json-jwt (1.15.3.1)
|
json-jwt (1.15.3.1)
|
||||||
activesupport (>= 4.2)
|
activesupport (>= 4.2)
|
||||||
|
@ -375,7 +368,7 @@ GEM
|
||||||
json-ld-preloaded (3.3.0)
|
json-ld-preloaded (3.3.0)
|
||||||
json-ld (~> 3.3)
|
json-ld (~> 3.3)
|
||||||
rdf (~> 3.3)
|
rdf (~> 3.3)
|
||||||
json-schema (4.2.0)
|
json-schema (4.3.0)
|
||||||
addressable (>= 2.8)
|
addressable (>= 2.8)
|
||||||
jsonapi-renderer (0.2.2)
|
jsonapi-renderer (0.2.2)
|
||||||
jwt (2.7.1)
|
jwt (2.7.1)
|
||||||
|
@ -400,15 +393,15 @@ GEM
|
||||||
language_server-protocol (3.17.0.3)
|
language_server-protocol (3.17.0.3)
|
||||||
launchy (2.5.2)
|
launchy (2.5.2)
|
||||||
addressable (~> 2.8)
|
addressable (~> 2.8)
|
||||||
letter_opener (1.8.1)
|
letter_opener (1.10.0)
|
||||||
launchy (>= 2.2, < 3)
|
launchy (>= 2.2, < 4)
|
||||||
letter_opener_web (2.0.0)
|
letter_opener_web (3.0.0)
|
||||||
actionmailer (>= 5.2)
|
actionmailer (>= 6.1)
|
||||||
letter_opener (~> 1.7)
|
letter_opener (~> 1.9)
|
||||||
railties (>= 5.2)
|
railties (>= 6.1)
|
||||||
rexml
|
rexml
|
||||||
link_header (0.0.8)
|
link_header (0.0.8)
|
||||||
llhttp-ffi (0.4.0)
|
llhttp-ffi (0.5.0)
|
||||||
ffi-compiler (~> 1.0)
|
ffi-compiler (~> 1.0)
|
||||||
rake (~> 13.0)
|
rake (~> 13.0)
|
||||||
lograge (0.14.0)
|
lograge (0.14.0)
|
||||||
|
@ -424,7 +417,7 @@ GEM
|
||||||
net-imap
|
net-imap
|
||||||
net-pop
|
net-pop
|
||||||
net-smtp
|
net-smtp
|
||||||
marcel (1.0.2)
|
marcel (1.0.4)
|
||||||
mario-redis-lock (1.2.1)
|
mario-redis-lock (1.2.1)
|
||||||
redis (>= 3.0.5)
|
redis (>= 3.0.5)
|
||||||
matrix (0.4.2)
|
matrix (0.4.2)
|
||||||
|
@ -435,19 +428,19 @@ GEM
|
||||||
memory_profiler (1.0.1)
|
memory_profiler (1.0.1)
|
||||||
mime-types (3.5.2)
|
mime-types (3.5.2)
|
||||||
mime-types-data (~> 3.2015)
|
mime-types-data (~> 3.2015)
|
||||||
mime-types-data (3.2023.1205)
|
mime-types-data (3.2024.0507)
|
||||||
mini_mime (1.1.5)
|
mini_mime (1.1.5)
|
||||||
mini_portile2 (2.8.5)
|
mini_portile2 (2.8.6)
|
||||||
minitest (5.21.2)
|
minitest (5.22.3)
|
||||||
msgpack (1.7.2)
|
msgpack (1.7.2)
|
||||||
multi_json (1.15.0)
|
multi_json (1.15.0)
|
||||||
multipart-post (2.3.0)
|
multipart-post (2.4.0)
|
||||||
mutex_m (0.2.0)
|
mutex_m (0.2.0)
|
||||||
net-http (0.4.1)
|
net-http (0.4.1)
|
||||||
uri
|
uri
|
||||||
net-http-persistent (4.0.2)
|
net-http-persistent (4.0.2)
|
||||||
connection_pool (~> 2.2)
|
connection_pool (~> 2.2)
|
||||||
net-imap (0.4.10)
|
net-imap (0.4.11)
|
||||||
date
|
date
|
||||||
net-protocol
|
net-protocol
|
||||||
net-ldap (0.19.0)
|
net-ldap (0.19.0)
|
||||||
|
@ -455,10 +448,10 @@ GEM
|
||||||
net-protocol
|
net-protocol
|
||||||
net-protocol (0.2.2)
|
net-protocol (0.2.2)
|
||||||
timeout
|
timeout
|
||||||
net-smtp (0.4.0.1)
|
net-smtp (0.5.0)
|
||||||
net-protocol
|
net-protocol
|
||||||
nio4r (2.5.9)
|
nio4r (2.7.3)
|
||||||
nokogiri (1.16.3)
|
nokogiri (1.16.5)
|
||||||
mini_portile2 (~> 2.8.2)
|
mini_portile2 (~> 2.8.2)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
nsa (0.3.0)
|
nsa (0.3.0)
|
||||||
|
@ -499,10 +492,100 @@ GEM
|
||||||
openssl (3.2.0)
|
openssl (3.2.0)
|
||||||
openssl-signature_algorithm (1.3.0)
|
openssl-signature_algorithm (1.3.0)
|
||||||
openssl (> 2.0)
|
openssl (> 2.0)
|
||||||
|
opentelemetry-api (1.2.5)
|
||||||
|
opentelemetry-common (0.20.1)
|
||||||
|
opentelemetry-api (~> 1.0)
|
||||||
|
opentelemetry-exporter-otlp (0.26.3)
|
||||||
|
google-protobuf (~> 3.14)
|
||||||
|
googleapis-common-protos-types (~> 1.3)
|
||||||
|
opentelemetry-api (~> 1.1)
|
||||||
|
opentelemetry-common (~> 0.20)
|
||||||
|
opentelemetry-sdk (~> 1.2)
|
||||||
|
opentelemetry-semantic_conventions
|
||||||
|
opentelemetry-helpers-sql-obfuscation (0.1.0)
|
||||||
|
opentelemetry-common (~> 0.20)
|
||||||
|
opentelemetry-instrumentation-action_pack (0.9.0)
|
||||||
|
opentelemetry-api (~> 1.0)
|
||||||
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
|
opentelemetry-instrumentation-rack (~> 0.21)
|
||||||
|
opentelemetry-instrumentation-action_view (0.7.0)
|
||||||
|
opentelemetry-api (~> 1.0)
|
||||||
|
opentelemetry-instrumentation-active_support (~> 0.1)
|
||||||
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
|
opentelemetry-instrumentation-active_job (0.7.1)
|
||||||
|
opentelemetry-api (~> 1.0)
|
||||||
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
|
opentelemetry-instrumentation-active_model_serializers (0.20.1)
|
||||||
|
opentelemetry-api (~> 1.0)
|
||||||
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
|
opentelemetry-instrumentation-active_record (0.7.2)
|
||||||
|
opentelemetry-api (~> 1.0)
|
||||||
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
|
opentelemetry-instrumentation-active_support (0.5.1)
|
||||||
|
opentelemetry-api (~> 1.0)
|
||||||
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
|
opentelemetry-instrumentation-base (0.22.3)
|
||||||
|
opentelemetry-api (~> 1.0)
|
||||||
|
opentelemetry-registry (~> 0.1)
|
||||||
|
opentelemetry-instrumentation-concurrent_ruby (0.21.3)
|
||||||
|
opentelemetry-api (~> 1.0)
|
||||||
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
|
opentelemetry-instrumentation-excon (0.22.1)
|
||||||
|
opentelemetry-api (~> 1.0)
|
||||||
|
opentelemetry-common (~> 0.20.0)
|
||||||
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
|
opentelemetry-instrumentation-faraday (0.24.2)
|
||||||
|
opentelemetry-api (~> 1.0)
|
||||||
|
opentelemetry-common (~> 0.20.0)
|
||||||
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
|
opentelemetry-instrumentation-http (0.23.3)
|
||||||
|
opentelemetry-api (~> 1.0)
|
||||||
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
|
opentelemetry-instrumentation-http_client (0.22.4)
|
||||||
|
opentelemetry-api (~> 1.0)
|
||||||
|
opentelemetry-common (~> 0.20.0)
|
||||||
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
|
opentelemetry-instrumentation-net_http (0.22.4)
|
||||||
|
opentelemetry-api (~> 1.0)
|
||||||
|
opentelemetry-common (~> 0.20.0)
|
||||||
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
|
opentelemetry-instrumentation-pg (0.27.3)
|
||||||
|
opentelemetry-api (~> 1.0)
|
||||||
|
opentelemetry-helpers-sql-obfuscation
|
||||||
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
|
opentelemetry-instrumentation-rack (0.24.3)
|
||||||
|
opentelemetry-api (~> 1.0)
|
||||||
|
opentelemetry-common (~> 0.20.0)
|
||||||
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
|
opentelemetry-instrumentation-rails (0.30.1)
|
||||||
|
opentelemetry-api (~> 1.0)
|
||||||
|
opentelemetry-instrumentation-action_pack (~> 0.9.0)
|
||||||
|
opentelemetry-instrumentation-action_view (~> 0.7.0)
|
||||||
|
opentelemetry-instrumentation-active_job (~> 0.7.0)
|
||||||
|
opentelemetry-instrumentation-active_record (~> 0.7.0)
|
||||||
|
opentelemetry-instrumentation-active_support (~> 0.5.0)
|
||||||
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
|
opentelemetry-instrumentation-redis (0.25.4)
|
||||||
|
opentelemetry-api (~> 1.0)
|
||||||
|
opentelemetry-common (~> 0.20.0)
|
||||||
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
|
opentelemetry-instrumentation-sidekiq (0.25.3)
|
||||||
|
opentelemetry-api (~> 1.0)
|
||||||
|
opentelemetry-common (~> 0.20.0)
|
||||||
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
||||||
|
opentelemetry-registry (0.3.1)
|
||||||
|
opentelemetry-api (~> 1.1)
|
||||||
|
opentelemetry-sdk (1.4.1)
|
||||||
|
opentelemetry-api (~> 1.1)
|
||||||
|
opentelemetry-common (~> 0.20)
|
||||||
|
opentelemetry-registry (~> 0.2)
|
||||||
|
opentelemetry-semantic_conventions
|
||||||
|
opentelemetry-semantic_conventions (1.10.0)
|
||||||
|
opentelemetry-api (~> 1.0)
|
||||||
orm_adapter (0.5.0)
|
orm_adapter (0.5.0)
|
||||||
ox (2.14.17)
|
ox (2.14.18)
|
||||||
parallel (1.24.0)
|
parallel (1.24.0)
|
||||||
parser (3.3.0.5)
|
parser (3.3.1.0)
|
||||||
ast (~> 2.4.1)
|
ast (~> 2.4.1)
|
||||||
racc
|
racc
|
||||||
parslet (2.0.0)
|
parslet (2.0.0)
|
||||||
|
@ -511,8 +594,7 @@ GEM
|
||||||
pg (1.5.6)
|
pg (1.5.6)
|
||||||
pghero (3.4.1)
|
pghero (3.4.1)
|
||||||
activerecord (>= 6)
|
activerecord (>= 6)
|
||||||
posix-spawn (0.3.15)
|
premailer (1.23.0)
|
||||||
premailer (1.21.0)
|
|
||||||
addressable
|
addressable
|
||||||
css_parser (>= 1.12.0)
|
css_parser (>= 1.12.0)
|
||||||
htmlentities (>= 4.0.0)
|
htmlentities (>= 4.0.0)
|
||||||
|
@ -528,14 +610,14 @@ GEM
|
||||||
railties (>= 7.0.0)
|
railties (>= 7.0.0)
|
||||||
psych (5.1.2)
|
psych (5.1.2)
|
||||||
stringio
|
stringio
|
||||||
public_suffix (5.0.4)
|
public_suffix (5.0.5)
|
||||||
puma (6.4.2)
|
puma (6.4.2)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
pundit (2.3.1)
|
pundit (2.3.2)
|
||||||
activesupport (>= 3.0.0)
|
activesupport (>= 3.0.0)
|
||||||
raabro (1.4.0)
|
raabro (1.4.0)
|
||||||
racc (1.7.3)
|
racc (1.7.3)
|
||||||
rack (2.2.8.1)
|
rack (2.2.9)
|
||||||
rack-attack (6.7.0)
|
rack-attack (6.7.0)
|
||||||
rack (>= 1.0, < 4)
|
rack (>= 1.0, < 4)
|
||||||
rack-cors (2.0.2)
|
rack-cors (2.0.2)
|
||||||
|
@ -549,7 +631,7 @@ GEM
|
||||||
rack-protection (3.2.0)
|
rack-protection (3.2.0)
|
||||||
base64 (>= 0.1.0)
|
base64 (>= 0.1.0)
|
||||||
rack (~> 2.2, >= 2.2.4)
|
rack (~> 2.2, >= 2.2.4)
|
||||||
rack-proxy (0.7.6)
|
rack-proxy (0.7.7)
|
||||||
rack
|
rack
|
||||||
rack-session (1.0.2)
|
rack-session (1.0.2)
|
||||||
rack (< 3)
|
rack (< 3)
|
||||||
|
@ -558,20 +640,20 @@ GEM
|
||||||
rackup (1.0.0)
|
rackup (1.0.0)
|
||||||
rack (< 3)
|
rack (< 3)
|
||||||
webrick
|
webrick
|
||||||
rails (7.1.3.2)
|
rails (7.1.3.3)
|
||||||
actioncable (= 7.1.3.2)
|
actioncable (= 7.1.3.3)
|
||||||
actionmailbox (= 7.1.3.2)
|
actionmailbox (= 7.1.3.3)
|
||||||
actionmailer (= 7.1.3.2)
|
actionmailer (= 7.1.3.3)
|
||||||
actionpack (= 7.1.3.2)
|
actionpack (= 7.1.3.3)
|
||||||
actiontext (= 7.1.3.2)
|
actiontext (= 7.1.3.3)
|
||||||
actionview (= 7.1.3.2)
|
actionview (= 7.1.3.3)
|
||||||
activejob (= 7.1.3.2)
|
activejob (= 7.1.3.3)
|
||||||
activemodel (= 7.1.3.2)
|
activemodel (= 7.1.3.3)
|
||||||
activerecord (= 7.1.3.2)
|
activerecord (= 7.1.3.3)
|
||||||
activestorage (= 7.1.3.2)
|
activestorage (= 7.1.3.3)
|
||||||
activesupport (= 7.1.3.2)
|
activesupport (= 7.1.3.3)
|
||||||
bundler (>= 1.15.0)
|
bundler (>= 1.15.0)
|
||||||
railties (= 7.1.3.2)
|
railties (= 7.1.3.3)
|
||||||
rails-controller-testing (1.0.5)
|
rails-controller-testing (1.0.5)
|
||||||
actionpack (>= 5.0.1.rc1)
|
actionpack (>= 5.0.1.rc1)
|
||||||
actionview (>= 5.0.1.rc1)
|
actionview (>= 5.0.1.rc1)
|
||||||
|
@ -583,25 +665,25 @@ GEM
|
||||||
rails-html-sanitizer (1.6.0)
|
rails-html-sanitizer (1.6.0)
|
||||||
loofah (~> 2.21)
|
loofah (~> 2.21)
|
||||||
nokogiri (~> 1.14)
|
nokogiri (~> 1.14)
|
||||||
rails-i18n (7.0.8)
|
rails-i18n (7.0.9)
|
||||||
i18n (>= 0.7, < 2)
|
i18n (>= 0.7, < 2)
|
||||||
railties (>= 6.0.0, < 8)
|
railties (>= 6.0.0, < 8)
|
||||||
railties (7.1.3.2)
|
railties (7.1.3.3)
|
||||||
actionpack (= 7.1.3.2)
|
actionpack (= 7.1.3.3)
|
||||||
activesupport (= 7.1.3.2)
|
activesupport (= 7.1.3.3)
|
||||||
irb
|
irb
|
||||||
rackup (>= 1.0.0)
|
rackup (>= 1.0.0)
|
||||||
rake (>= 12.2)
|
rake (>= 12.2)
|
||||||
thor (~> 1.0, >= 1.2.2)
|
thor (~> 1.0, >= 1.2.2)
|
||||||
zeitwerk (~> 2.6)
|
zeitwerk (~> 2.6)
|
||||||
rainbow (3.1.1)
|
rainbow (3.1.1)
|
||||||
rake (13.1.0)
|
rake (13.2.1)
|
||||||
rdf (3.3.1)
|
rdf (3.3.1)
|
||||||
bcp47_spec (~> 0.2)
|
bcp47_spec (~> 0.2)
|
||||||
link_header (~> 0.0, >= 0.0.8)
|
link_header (~> 0.0, >= 0.0.8)
|
||||||
rdf-normalize (0.7.0)
|
rdf-normalize (0.7.0)
|
||||||
rdf (~> 3.3)
|
rdf (~> 3.3)
|
||||||
rdoc (6.6.2)
|
rdoc (6.6.3.1)
|
||||||
psych (>= 4.0.0)
|
psych (>= 4.0.0)
|
||||||
redcarpet (3.6.0)
|
redcarpet (3.6.0)
|
||||||
redis (4.8.1)
|
redis (4.8.1)
|
||||||
|
@ -610,16 +692,17 @@ GEM
|
||||||
redlock (1.3.2)
|
redlock (1.3.2)
|
||||||
redis (>= 3.0.0, < 6.0)
|
redis (>= 3.0.0, < 6.0)
|
||||||
regexp_parser (2.9.0)
|
regexp_parser (2.9.0)
|
||||||
reline (0.4.3)
|
reline (0.5.7)
|
||||||
io-console (~> 0.5)
|
io-console (~> 0.5)
|
||||||
request_store (1.5.1)
|
request_store (1.6.0)
|
||||||
rack (>= 1.4)
|
rack (>= 1.4)
|
||||||
responders (3.1.1)
|
responders (3.1.1)
|
||||||
actionpack (>= 5.2)
|
actionpack (>= 5.2)
|
||||||
railties (>= 5.2)
|
railties (>= 5.2)
|
||||||
rexml (3.2.6)
|
rexml (3.2.8)
|
||||||
|
strscan (>= 3.0.9)
|
||||||
rotp (6.3.0)
|
rotp (6.3.0)
|
||||||
rouge (4.1.2)
|
rouge (4.2.1)
|
||||||
rpam2 (4.0.2)
|
rpam2 (4.0.2)
|
||||||
rqrcode (2.2.0)
|
rqrcode (2.2.0)
|
||||||
chunky_png (~> 1.0)
|
chunky_png (~> 1.0)
|
||||||
|
@ -632,24 +715,24 @@ GEM
|
||||||
rspec-support (~> 3.13.0)
|
rspec-support (~> 3.13.0)
|
||||||
rspec-github (2.4.0)
|
rspec-github (2.4.0)
|
||||||
rspec-core (~> 3.0)
|
rspec-core (~> 3.0)
|
||||||
rspec-mocks (3.13.0)
|
rspec-mocks (3.13.1)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.13.0)
|
rspec-support (~> 3.13.0)
|
||||||
rspec-rails (6.1.1)
|
rspec-rails (6.1.2)
|
||||||
actionpack (>= 6.1)
|
actionpack (>= 6.1)
|
||||||
activesupport (>= 6.1)
|
activesupport (>= 6.1)
|
||||||
railties (>= 6.1)
|
railties (>= 6.1)
|
||||||
rspec-core (~> 3.12)
|
rspec-core (~> 3.13)
|
||||||
rspec-expectations (~> 3.12)
|
rspec-expectations (~> 3.13)
|
||||||
rspec-mocks (~> 3.12)
|
rspec-mocks (~> 3.13)
|
||||||
rspec-support (~> 3.12)
|
rspec-support (~> 3.13)
|
||||||
rspec-sidekiq (4.1.0)
|
rspec-sidekiq (5.0.0)
|
||||||
rspec-core (~> 3.0)
|
rspec-core (~> 3.0)
|
||||||
rspec-expectations (~> 3.0)
|
rspec-expectations (~> 3.0)
|
||||||
rspec-mocks (~> 3.0)
|
rspec-mocks (~> 3.0)
|
||||||
sidekiq (>= 5, < 8)
|
sidekiq (>= 5, < 8)
|
||||||
rspec-support (3.13.1)
|
rspec-support (3.13.1)
|
||||||
rubocop (1.60.2)
|
rubocop (1.63.5)
|
||||||
json (~> 2.3)
|
json (~> 2.3)
|
||||||
language_server-protocol (>= 3.17.0)
|
language_server-protocol (>= 3.17.0)
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
|
@ -657,30 +740,33 @@ GEM
|
||||||
rainbow (>= 2.2.2, < 4.0)
|
rainbow (>= 2.2.2, < 4.0)
|
||||||
regexp_parser (>= 1.8, < 3.0)
|
regexp_parser (>= 1.8, < 3.0)
|
||||||
rexml (>= 3.2.5, < 4.0)
|
rexml (>= 3.2.5, < 4.0)
|
||||||
rubocop-ast (>= 1.30.0, < 2.0)
|
rubocop-ast (>= 1.31.1, < 2.0)
|
||||||
ruby-progressbar (~> 1.7)
|
ruby-progressbar (~> 1.7)
|
||||||
unicode-display_width (>= 2.4.0, < 3.0)
|
unicode-display_width (>= 2.4.0, < 3.0)
|
||||||
rubocop-ast (1.30.0)
|
rubocop-ast (1.31.3)
|
||||||
parser (>= 3.2.1.0)
|
parser (>= 3.3.1.0)
|
||||||
rubocop-capybara (2.20.0)
|
rubocop-capybara (2.20.0)
|
||||||
rubocop (~> 1.41)
|
rubocop (~> 1.41)
|
||||||
rubocop-factory_bot (2.25.0)
|
rubocop-factory_bot (2.25.1)
|
||||||
rubocop (~> 1.33)
|
rubocop (~> 1.41)
|
||||||
rubocop-performance (1.20.2)
|
rubocop-performance (1.21.0)
|
||||||
rubocop (>= 1.48.1, < 2.0)
|
rubocop (>= 1.48.1, < 2.0)
|
||||||
rubocop-ast (>= 1.30.0, < 2.0)
|
rubocop-ast (>= 1.31.1, < 2.0)
|
||||||
rubocop-rails (2.23.1)
|
rubocop-rails (2.24.1)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
rack (>= 1.1)
|
rack (>= 1.1)
|
||||||
rubocop (>= 1.33.0, < 2.0)
|
rubocop (>= 1.33.0, < 2.0)
|
||||||
rubocop-ast (>= 1.30.0, < 2.0)
|
rubocop-ast (>= 1.31.1, < 2.0)
|
||||||
rubocop-rspec (2.26.1)
|
rubocop-rspec (2.29.2)
|
||||||
rubocop (~> 1.40)
|
rubocop (~> 1.40)
|
||||||
rubocop-capybara (~> 2.17)
|
rubocop-capybara (~> 2.17)
|
||||||
rubocop-factory_bot (~> 2.22)
|
rubocop-factory_bot (~> 2.22)
|
||||||
|
rubocop-rspec_rails (~> 2.28)
|
||||||
|
rubocop-rspec_rails (2.28.3)
|
||||||
|
rubocop (~> 1.40)
|
||||||
ruby-prof (1.7.0)
|
ruby-prof (1.7.0)
|
||||||
ruby-progressbar (1.13.0)
|
ruby-progressbar (1.13.0)
|
||||||
ruby-saml (1.15.0)
|
ruby-saml (1.16.0)
|
||||||
nokogiri (>= 1.13.10)
|
nokogiri (>= 1.13.10)
|
||||||
rexml
|
rexml
|
||||||
ruby2_keywords (0.0.5)
|
ruby2_keywords (0.0.5)
|
||||||
|
@ -692,10 +778,10 @@ GEM
|
||||||
sanitize (6.1.0)
|
sanitize (6.1.0)
|
||||||
crass (~> 1.0.2)
|
crass (~> 1.0.2)
|
||||||
nokogiri (>= 1.12.0)
|
nokogiri (>= 1.12.0)
|
||||||
scenic (1.7.0)
|
scenic (1.8.0)
|
||||||
activerecord (>= 4.0.0)
|
activerecord (>= 4.0.0)
|
||||||
railties (>= 4.0.0)
|
railties (>= 4.0.0)
|
||||||
selenium-webdriver (4.18.1)
|
selenium-webdriver (4.21.1)
|
||||||
base64 (~> 0.2)
|
base64 (~> 0.2)
|
||||||
rexml (~> 3.2, >= 3.2.5)
|
rexml (~> 3.2, >= 3.2.5)
|
||||||
rubyzip (>= 1.2.2, < 3.0)
|
rubyzip (>= 1.2.2, < 3.0)
|
||||||
|
@ -729,14 +815,14 @@ GEM
|
||||||
simplecov-html (0.12.3)
|
simplecov-html (0.12.3)
|
||||||
simplecov-lcov (0.8.0)
|
simplecov-lcov (0.8.0)
|
||||||
simplecov_json_formatter (0.1.4)
|
simplecov_json_formatter (0.1.4)
|
||||||
smart_properties (1.17.0)
|
|
||||||
stackprof (0.2.26)
|
stackprof (0.2.26)
|
||||||
statsd-ruby (1.5.0)
|
statsd-ruby (1.5.0)
|
||||||
stoplight (3.0.2)
|
stoplight (4.1.0)
|
||||||
redlock (~> 1.0)
|
redlock (~> 1.0)
|
||||||
stringio (3.1.0)
|
stringio (3.1.0)
|
||||||
strong_migrations (1.7.0)
|
strong_migrations (1.8.0)
|
||||||
activerecord (>= 5.2)
|
activerecord (>= 5.2)
|
||||||
|
strscan (3.1.0)
|
||||||
swd (1.3.0)
|
swd (1.3.0)
|
||||||
activesupport (>= 3)
|
activesupport (>= 3)
|
||||||
attr_required (>= 0.0.5)
|
attr_required (>= 0.0.5)
|
||||||
|
@ -747,7 +833,7 @@ GEM
|
||||||
unicode-display_width (>= 1.1.1, < 3)
|
unicode-display_width (>= 1.1.1, < 3)
|
||||||
terrapin (1.0.1)
|
terrapin (1.0.1)
|
||||||
climate_control
|
climate_control
|
||||||
test-prof (1.3.2)
|
test-prof (1.3.3)
|
||||||
thor (1.3.1)
|
thor (1.3.1)
|
||||||
tilt (2.3.0)
|
tilt (2.3.0)
|
||||||
timeout (0.4.1)
|
timeout (0.4.1)
|
||||||
|
@ -764,7 +850,7 @@ GEM
|
||||||
tty-cursor (~> 0.7)
|
tty-cursor (~> 0.7)
|
||||||
tty-screen (~> 0.8)
|
tty-screen (~> 0.8)
|
||||||
wisper (~> 2.0)
|
wisper (~> 2.0)
|
||||||
tty-screen (0.8.1)
|
tty-screen (0.8.2)
|
||||||
twitter-text (3.1.0)
|
twitter-text (3.1.0)
|
||||||
idn-ruby
|
idn-ruby
|
||||||
unf (~> 0.1.0)
|
unf (~> 0.1.0)
|
||||||
|
@ -774,9 +860,9 @@ GEM
|
||||||
tzinfo (>= 1.0.0)
|
tzinfo (>= 1.0.0)
|
||||||
unf (0.1.4)
|
unf (0.1.4)
|
||||||
unf_ext
|
unf_ext
|
||||||
unf_ext (0.0.8.2)
|
unf_ext (0.0.9.1)
|
||||||
unicode-display_width (2.5.0)
|
unicode-display_width (2.5.0)
|
||||||
uri (0.12.2)
|
uri (0.13.0)
|
||||||
validate_email (0.1.6)
|
validate_email (0.1.6)
|
||||||
activemodel (>= 3.0)
|
activemodel (>= 3.0)
|
||||||
mail (>= 2.2.5)
|
mail (>= 2.2.5)
|
||||||
|
@ -797,7 +883,7 @@ GEM
|
||||||
webfinger (1.2.0)
|
webfinger (1.2.0)
|
||||||
activesupport
|
activesupport
|
||||||
httpclient (>= 2.4)
|
httpclient (>= 2.4)
|
||||||
webmock (3.22.0)
|
webmock (3.23.0)
|
||||||
addressable (>= 2.8.0)
|
addressable (>= 2.8.0)
|
||||||
crack (>= 0.3.2)
|
crack (>= 0.3.2)
|
||||||
hashdiff (>= 0.4.0, < 2.0.0)
|
hashdiff (>= 0.4.0, < 2.0.0)
|
||||||
|
@ -815,7 +901,7 @@ GEM
|
||||||
xorcist (1.1.3)
|
xorcist (1.1.3)
|
||||||
xpath (3.2.0)
|
xpath (3.2.0)
|
||||||
nokogiri (~> 1.8)
|
nokogiri (~> 1.8)
|
||||||
zeitwerk (2.6.13)
|
zeitwerk (2.6.14)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
|
@ -833,7 +919,7 @@ DEPENDENCIES
|
||||||
browser
|
browser
|
||||||
bundler-audit (~> 0.9)
|
bundler-audit (~> 0.9)
|
||||||
capybara (~> 3.39)
|
capybara (~> 3.39)
|
||||||
charlock_holmes (~> 0.7.7)
|
charlock_holmes!
|
||||||
chewy (~> 7.3)
|
chewy (~> 7.3)
|
||||||
climate_control
|
climate_control
|
||||||
cocoon (~> 1.2)
|
cocoon (~> 1.2)
|
||||||
|
@ -844,11 +930,11 @@ DEPENDENCIES
|
||||||
database_cleaner-active_record
|
database_cleaner-active_record
|
||||||
debug (~> 1.8)
|
debug (~> 1.8)
|
||||||
devise (~> 4.9)
|
devise (~> 4.9)
|
||||||
devise-two-factor (~> 4.1)
|
devise-two-factor
|
||||||
devise_pam_authenticatable2 (~> 9.2)
|
devise_pam_authenticatable2 (~> 9.2)
|
||||||
discard (~> 1.2)
|
discard (~> 1.2)
|
||||||
doorkeeper (~> 5.6)
|
doorkeeper (~> 5.6)
|
||||||
dotenv-rails (~> 2.8)
|
dotenv
|
||||||
ed25519 (~> 1.3)
|
ed25519 (~> 1.3)
|
||||||
email_spec
|
email_spec
|
||||||
fabrication (~> 2.30)
|
fabrication (~> 2.30)
|
||||||
|
@ -863,9 +949,10 @@ DEPENDENCIES
|
||||||
hcaptcha (~> 7.1)
|
hcaptcha (~> 7.1)
|
||||||
hiredis (~> 0.6)
|
hiredis (~> 0.6)
|
||||||
htmlentities (~> 4.3)
|
htmlentities (~> 4.3)
|
||||||
http (~> 5.1)
|
http (~> 5.2.0)
|
||||||
http_accept_language (~> 2.1)
|
http_accept_language (~> 2.1)
|
||||||
httplog (~> 1.6.2)
|
httplog (~> 1.6.2)
|
||||||
|
i18n
|
||||||
i18n-tasks (~> 1.0)
|
i18n-tasks (~> 1.0)
|
||||||
idn-ruby
|
idn-ruby
|
||||||
inline_svg
|
inline_svg
|
||||||
|
@ -876,9 +963,10 @@ DEPENDENCIES
|
||||||
kaminari (~> 1.2)
|
kaminari (~> 1.2)
|
||||||
kt-paperclip (~> 7.2)
|
kt-paperclip (~> 7.2)
|
||||||
letter_opener (~> 1.8)
|
letter_opener (~> 1.8)
|
||||||
letter_opener_web (~> 2.0)
|
letter_opener_web (~> 3.0)
|
||||||
link_header (~> 0.0)
|
link_header (~> 0.0)
|
||||||
lograge (~> 0.12)
|
lograge (~> 0.12)
|
||||||
|
mail (~> 2.8)
|
||||||
mario-redis-lock (~> 1.2)
|
mario-redis-lock (~> 1.2)
|
||||||
md-paperclip-azure (~> 2.2)
|
md-paperclip-azure (~> 2.2)
|
||||||
memory_profiler
|
memory_profiler
|
||||||
|
@ -893,11 +981,25 @@ DEPENDENCIES
|
||||||
omniauth-rails_csrf_protection (~> 1.0)
|
omniauth-rails_csrf_protection (~> 1.0)
|
||||||
omniauth-saml (~> 2.0)
|
omniauth-saml (~> 2.0)
|
||||||
omniauth_openid_connect (~> 0.6.1)
|
omniauth_openid_connect (~> 0.6.1)
|
||||||
|
opentelemetry-exporter-otlp (~> 0.26.3)
|
||||||
|
opentelemetry-instrumentation-active_job (~> 0.7.1)
|
||||||
|
opentelemetry-instrumentation-active_model_serializers (~> 0.20.1)
|
||||||
|
opentelemetry-instrumentation-concurrent_ruby (~> 0.21.2)
|
||||||
|
opentelemetry-instrumentation-excon (~> 0.22.0)
|
||||||
|
opentelemetry-instrumentation-faraday (~> 0.24.1)
|
||||||
|
opentelemetry-instrumentation-http (~> 0.23.2)
|
||||||
|
opentelemetry-instrumentation-http_client (~> 0.22.3)
|
||||||
|
opentelemetry-instrumentation-net_http (~> 0.22.4)
|
||||||
|
opentelemetry-instrumentation-pg (~> 0.27.1)
|
||||||
|
opentelemetry-instrumentation-rack (~> 0.24.1)
|
||||||
|
opentelemetry-instrumentation-rails (~> 0.30.0)
|
||||||
|
opentelemetry-instrumentation-redis (~> 0.25.3)
|
||||||
|
opentelemetry-instrumentation-sidekiq (~> 0.25.2)
|
||||||
|
opentelemetry-sdk (~> 1.4)
|
||||||
ox (~> 2.14)
|
ox (~> 2.14)
|
||||||
parslet
|
parslet
|
||||||
pg (~> 1.5)
|
pg (~> 1.5)
|
||||||
pghero
|
pghero
|
||||||
posix-spawn
|
|
||||||
premailer-rails
|
premailer-rails
|
||||||
private_address_check (~> 0.5)
|
private_address_check (~> 0.5)
|
||||||
propshaft
|
propshaft
|
||||||
|
@ -918,7 +1020,7 @@ DEPENDENCIES
|
||||||
rqrcode (~> 2.2)
|
rqrcode (~> 2.2)
|
||||||
rspec-github (~> 2.4)
|
rspec-github (~> 2.4)
|
||||||
rspec-rails (~> 6.0)
|
rspec-rails (~> 6.0)
|
||||||
rspec-sidekiq (~> 4.0)
|
rspec-sidekiq (~> 5.0)
|
||||||
rubocop
|
rubocop
|
||||||
rubocop-capybara
|
rubocop-capybara
|
||||||
rubocop-performance
|
rubocop-performance
|
||||||
|
@ -939,8 +1041,8 @@ DEPENDENCIES
|
||||||
simplecov (~> 0.22)
|
simplecov (~> 0.22)
|
||||||
simplecov-lcov (~> 0.8)
|
simplecov-lcov (~> 0.8)
|
||||||
stackprof
|
stackprof
|
||||||
stoplight (~> 3.0.1)
|
stoplight (~> 4.1)
|
||||||
strong_migrations (= 1.7.0)
|
strong_migrations (= 1.8.0)
|
||||||
test-prof
|
test-prof
|
||||||
thor (~> 1.2)
|
thor (~> 1.2)
|
||||||
tty-prompt (~> 0.23)
|
tty-prompt (~> 0.23)
|
||||||
|
@ -953,7 +1055,7 @@ DEPENDENCIES
|
||||||
xorcist (~> 1.1)
|
xorcist (~> 1.1)
|
||||||
|
|
||||||
RUBY VERSION
|
RUBY VERSION
|
||||||
ruby 3.2.2p53
|
ruby 3.3.1p55
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
2.5.4
|
2.5.9
|
||||||
|
|
11
README.md
11
README.md
|
@ -1,4 +1,4 @@
|
||||||
# <img src="https://github.com/TheEssem/mastodon/raw/main/app/javascript/icons/android-chrome-256x256.png" width="128"> Chuckya
|
# <img src="https://github.com/TheEssem/mastodon/raw/main/public/chuckya.png" width="128"> Chuckya
|
||||||
|
|
||||||
Chuckya is a close-to-upstream soft fork of Mastodon Glitch Edition (more commonly known as glitch-soc) that aims to introduce more experimental features/fixes with the goal of making the overall experience more enjoyable. Although it's mainly developed for and used on the [wetdry.world](https://wetdry.world) instance, it can be deployed by any server admin as a drop-in, backwards-compatible replacement for Mastodon.
|
Chuckya is a close-to-upstream soft fork of Mastodon Glitch Edition (more commonly known as glitch-soc) that aims to introduce more experimental features/fixes with the goal of making the overall experience more enjoyable. Although it's mainly developed for and used on the [wetdry.world](https://wetdry.world) instance, it can be deployed by any server admin as a drop-in, backwards-compatible replacement for Mastodon.
|
||||||
|
|
||||||
|
@ -15,7 +15,6 @@ Here are some of the changes compared to glitch-soc:
|
||||||
- Allows dashes in custom emote names
|
- Allows dashes in custom emote names
|
||||||
- Emojis can be put side-by-side
|
- Emojis can be put side-by-side
|
||||||
- Minor media attachment tweaks
|
- Minor media attachment tweaks
|
||||||
- Custom favicon
|
|
||||||
|
|
||||||
Changes previously in Chuckya that made their way into vanilla Mastodon:
|
Changes previously in Chuckya that made their way into vanilla Mastodon:
|
||||||
|
|
||||||
|
@ -112,8 +111,8 @@ Mastodon acts as an OAuth2 provider, so 3rd party apps can use the REST and Stre
|
||||||
|
|
||||||
- **PostgreSQL** 12+
|
- **PostgreSQL** 12+
|
||||||
- **Redis** 4+
|
- **Redis** 4+
|
||||||
- **Ruby** 3.0+
|
- **Ruby** 3.1+
|
||||||
- **Node.js** 16+
|
- **Node.js** 18+
|
||||||
|
|
||||||
The repository includes deployment configurations for **Docker and docker-compose** as well as specific platforms like **Heroku**, **Scalingo**, and **Nanobox**. For Helm charts, reference the [mastodon/chart repository](https://github.com/mastodon/chart). 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**. For Helm charts, reference the [mastodon/chart repository](https://github.com/mastodon/chart). The [**standalone** installation guide](https://docs.joinmastodon.org/admin/install/) is available in the documentation.
|
||||||
|
|
||||||
|
@ -134,10 +133,12 @@ A **Vagrant** configuration is included for development purposes. To use it, com
|
||||||
To set up **MacOS** for native development, complete the following steps:
|
To set up **MacOS** for native development, complete the following steps:
|
||||||
|
|
||||||
- Use a Ruby version manager to install the specified version from `.ruby-version`
|
- Use a Ruby version manager to install the specified version from `.ruby-version`
|
||||||
|
- Run `bundle` to install required gems
|
||||||
- Run `brew install postgresql@14 redis imagemagick libidn` to install required dependencies
|
- Run `brew install postgresql@14 redis imagemagick libidn` to install required dependencies
|
||||||
- Navigate to Mastodon's root directory and run `brew install nvm` then `nvm use` to use the version from `.nvmrc`
|
- Navigate to Mastodon's root directory and run `brew install nvm` then `nvm use` to use the version from `.nvmrc`
|
||||||
|
- Run `yarn` to install required packages
|
||||||
- Run `corepack enable && corepack prepare`
|
- Run `corepack enable && corepack prepare`
|
||||||
- Run `bundle exec rails db:setup` (optionally prepend `RAILS_ENV=development` to target the dev environment)
|
- Run `RAILS_ENV=development bundle exec rails db:setup`
|
||||||
- Finally, run `bin/dev` which will launch the local services via `overmind` (if installed) or `foreman`
|
- Finally, run `bin/dev` which will launch the local services via `overmind` (if installed) or `foreman`
|
||||||
|
|
||||||
### Docker
|
### Docker
|
||||||
|
|
1
Vagrantfile
vendored
1
Vagrantfile
vendored
|
@ -173,6 +173,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
||||||
|
|
||||||
# Otherwise, you can access the site at http://localhost:3000 and http://localhost:4000 , http://localhost:8080
|
# Otherwise, you can access the site at http://localhost:3000 and http://localhost:4000 , http://localhost:8080
|
||||||
config.vm.network :forwarded_port, guest: 3000, host: 3000
|
config.vm.network :forwarded_port, guest: 3000, host: 3000
|
||||||
|
config.vm.network :forwarded_port, guest: 3035, host: 3035
|
||||||
config.vm.network :forwarded_port, guest: 4000, host: 4000
|
config.vm.network :forwarded_port, guest: 4000, host: 4000
|
||||||
config.vm.network :forwarded_port, guest: 8080, host: 8080
|
config.vm.network :forwarded_port, guest: 8080, host: 8080
|
||||||
config.vm.network :forwarded_port, guest: 9200, host: 9200
|
config.vm.network :forwarded_port, guest: 9200, host: 9200
|
||||||
|
|
|
@ -25,7 +25,7 @@ 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 = preload_collection(@statuses, Status)
|
||||||
end
|
end
|
||||||
|
|
||||||
format.json do
|
format.json do
|
||||||
|
@ -46,7 +46,7 @@ class AccountsController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def default_statuses
|
def default_statuses
|
||||||
@account.statuses.not_local_only.where(visibility: [:public, :unlisted])
|
@account.statuses.not_local_only.distributable_visibility
|
||||||
end
|
end
|
||||||
|
|
||||||
def only_media_scope
|
def only_media_scope
|
||||||
|
|
|
@ -18,7 +18,7 @@ class ActivityPub::CollectionsController < ActivityPub::BaseController
|
||||||
def set_items
|
def set_items
|
||||||
case params[:id]
|
case params[:id]
|
||||||
when 'featured'
|
when 'featured'
|
||||||
@items = for_signed_account { cache_collection(@account.pinned_statuses.not_local_only, Status) }
|
@items = for_signed_account { preload_collection(@account.pinned_statuses.not_local_only, Status) }
|
||||||
@items = @items.map { |item| item.distributable? ? item : ActivityPub::TagManager.instance.uri_for(item) }
|
@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 }
|
||||||
|
|
|
@ -60,7 +60,7 @@ class ActivityPub::OutboxesController < ActivityPub::BaseController
|
||||||
def set_statuses
|
def set_statuses
|
||||||
return unless page_requested?
|
return unless page_requested?
|
||||||
|
|
||||||
@statuses = cache_collection_paginated_by_id(
|
@statuses = preload_collection_paginated_by_id(
|
||||||
AccountStatusesFilter.new(@account, signed_request_account).results,
|
AccountStatusesFilter.new(@account, signed_request_account).results,
|
||||||
Status,
|
Status,
|
||||||
LIMIT,
|
LIMIT,
|
||||||
|
|
|
@ -31,7 +31,7 @@ class ActivityPub::RepliesController < ActivityPub::BaseController
|
||||||
|
|
||||||
def set_replies
|
def set_replies
|
||||||
@replies = only_other_accounts? ? Status.where.not(account_id: @account.id).joins(:account).merge(Account.without_suspended) : @account.statuses
|
@replies = only_other_accounts? ? Status.where.not(account_id: @account.id).joins(:account).merge(Account.without_suspended) : @account.statuses
|
||||||
@replies = @replies.where(in_reply_to_id: @status.id, visibility: [:public, :unlisted])
|
@replies = @replies.distributable_visibility.where(in_reply_to_id: @status.id)
|
||||||
@replies = @replies.paginate_by_min_id(DESCENDANTS_LIMIT, params[:min_id])
|
@replies = @replies.paginate_by_min_id(DESCENDANTS_LIMIT, params[:min_id])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,6 @@ module Admin
|
||||||
|
|
||||||
layout 'admin'
|
layout 'admin'
|
||||||
|
|
||||||
before_action :set_pack
|
|
||||||
before_action :set_body_classes
|
before_action :set_body_classes
|
||||||
before_action :set_cache_headers
|
before_action :set_cache_headers
|
||||||
|
|
||||||
|
@ -19,10 +18,6 @@ module Admin
|
||||||
@body_classes = 'admin'
|
@body_classes = 'admin'
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'admin'
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_cache_headers
|
def set_cache_headers
|
||||||
response.cache_control.replace(private: true, no_store: true)
|
response.cache_control.replace(private: true, no_store: true)
|
||||||
end
|
end
|
||||||
|
|
|
@ -25,6 +25,8 @@ class Admin::DomainAllowsController < Admin::BaseController
|
||||||
def destroy
|
def destroy
|
||||||
authorize @domain_allow, :destroy?
|
authorize @domain_allow, :destroy?
|
||||||
UnallowDomainService.new.call(@domain_allow)
|
UnallowDomainService.new.call(@domain_allow)
|
||||||
|
log_action :destroy, @domain_allow
|
||||||
|
|
||||||
redirect_to admin_instances_path, notice: I18n.t('admin.domain_allows.destroyed_msg')
|
redirect_to admin_instances_path, notice: I18n.t('admin.domain_allows.destroyed_msg')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ module Admin
|
||||||
|
|
||||||
@site_upload.destroy!
|
@site_upload.destroy!
|
||||||
|
|
||||||
redirect_to admin_settings_path, notice: I18n.t('admin.site_uploads.destroyed_msg')
|
redirect_back fallback_location: admin_settings_path, notice: I18n.t('admin.site_uploads.destroyed_msg')
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -9,6 +9,7 @@ class Api::BaseController < ApplicationController
|
||||||
include Api::CachingConcern
|
include Api::CachingConcern
|
||||||
include Api::ContentSecurityPolicy
|
include Api::ContentSecurityPolicy
|
||||||
include Api::ErrorHandling
|
include Api::ErrorHandling
|
||||||
|
include Api::Pagination
|
||||||
|
|
||||||
skip_before_action :require_functional!, unless: :limited_federation_mode?
|
skip_before_action :require_functional!, unless: :limited_federation_mode?
|
||||||
|
|
||||||
|
@ -29,21 +30,6 @@ class Api::BaseController < ApplicationController
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def pagination_max_id
|
|
||||||
pagination_collection.last.id
|
|
||||||
end
|
|
||||||
|
|
||||||
def pagination_since_id
|
|
||||||
pagination_collection.first.id
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_pagination_headers(next_path = nil, prev_path = nil)
|
|
||||||
links = []
|
|
||||||
links << [next_path, [%w(rel next)]] if next_path
|
|
||||||
links << [prev_path, [%w(rel prev)]] if prev_path
|
|
||||||
response.headers['Link'] = LinkHeader.new(links) unless links.empty?
|
|
||||||
end
|
|
||||||
|
|
||||||
def limit_param(default_limit)
|
def limit_param(default_limit)
|
||||||
return default_limit unless params[:limit]
|
return default_limit unless params[:limit]
|
||||||
|
|
||||||
|
@ -72,10 +58,6 @@ class Api::BaseController < ApplicationController
|
||||||
render json: { error: 'Your login is currently disabled' }, status: 403 if current_user&.account&.unavailable?
|
render json: { error: 'Your login is currently disabled' }, status: 403 if current_user&.account&.unavailable?
|
||||||
end
|
end
|
||||||
|
|
||||||
def require_valid_pagination_options!
|
|
||||||
render json: { error: 'Pagination values for `offset` and `limit` must be positive' }, status: 400 if pagination_options_invalid?
|
|
||||||
end
|
|
||||||
|
|
||||||
def require_user!
|
def require_user!
|
||||||
if !current_user
|
if !current_user
|
||||||
render json: { error: 'This method requires an authenticated user' }, status: 422
|
render json: { error: 'This method requires an authenticated user' }, status: 422
|
||||||
|
@ -104,14 +86,6 @@ class Api::BaseController < ApplicationController
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def insert_pagination_headers
|
|
||||||
set_pagination_headers(next_path, prev_path)
|
|
||||||
end
|
|
||||||
|
|
||||||
def pagination_options_invalid?
|
|
||||||
params.slice(:limit, :offset).values.map(&:to_i).any?(&:negative?)
|
|
||||||
end
|
|
||||||
|
|
||||||
def respond_with_error(code)
|
def respond_with_error(code)
|
||||||
render json: { error: Rack::Utils::HTTP_STATUS_CODES[code] }, status: code
|
render json: { error: Rack::Utils::HTTP_STATUS_CODES[code] }, status: code
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class Api::V1::Accounts::CredentialsController < Api::BaseController
|
class Api::V1::Accounts::CredentialsController < Api::BaseController
|
||||||
before_action -> { doorkeeper_authorize! :read, :'read:accounts' }, except: [:update]
|
before_action -> { doorkeeper_authorize! :read, :'read:accounts', :'read:me' }, except: [:update]
|
||||||
before_action -> { doorkeeper_authorize! :write, :'write:accounts' }, only: [:update]
|
before_action -> { doorkeeper_authorize! :write, :'write:accounts' }, only: [:update]
|
||||||
before_action :require_user!
|
before_action :require_user!
|
||||||
|
|
||||||
|
|
|
@ -19,11 +19,11 @@ class Api::V1::Accounts::StatusesController < Api::BaseController
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_statuses
|
def load_statuses
|
||||||
@account.unavailable? ? [] : cached_account_statuses
|
@account.unavailable? ? [] : preloaded_account_statuses
|
||||||
end
|
end
|
||||||
|
|
||||||
def cached_account_statuses
|
def preloaded_account_statuses
|
||||||
cache_collection_paginated_by_id(
|
preload_collection_paginated_by_id(
|
||||||
AccountStatusesFilter.new(@account, current_account, params).results,
|
AccountStatusesFilter.new(@account, current_account, params).results,
|
||||||
Status,
|
Status,
|
||||||
limit_param(DEFAULT_STATUSES_LIMIT),
|
limit_param(DEFAULT_STATUSES_LIMIT),
|
||||||
|
|
|
@ -9,16 +9,22 @@ class Api::V1::AccountsController < Api::BaseController
|
||||||
before_action -> { doorkeeper_authorize! :follow, :write, :'write:blocks' }, only: [:block, :unblock]
|
before_action -> { doorkeeper_authorize! :follow, :write, :'write:blocks' }, only: [:block, :unblock]
|
||||||
before_action -> { doorkeeper_authorize! :write, :'write:accounts' }, only: [:create]
|
before_action -> { doorkeeper_authorize! :write, :'write:accounts' }, only: [:create]
|
||||||
|
|
||||||
before_action :require_user!, except: [:show, :create]
|
before_action :require_user!, except: [:index, :show, :create]
|
||||||
before_action :set_account, except: [:create]
|
before_action :set_account, except: [:index, :create]
|
||||||
before_action :check_account_approval, except: [:create]
|
before_action :set_accounts, only: [:index]
|
||||||
before_action :check_account_confirmation, except: [:create]
|
before_action :check_account_approval, except: [:index, :create]
|
||||||
|
before_action :check_account_confirmation, except: [:index, :create]
|
||||||
before_action :check_enabled_registrations, only: [:create]
|
before_action :check_enabled_registrations, only: [:create]
|
||||||
|
before_action :check_accounts_limit, only: [:index]
|
||||||
|
|
||||||
skip_before_action :require_authenticated_user!, only: :create
|
skip_before_action :require_authenticated_user!, only: :create
|
||||||
|
|
||||||
override_rate_limit_headers :follow, family: :follows
|
override_rate_limit_headers :follow, family: :follows
|
||||||
|
|
||||||
|
def index
|
||||||
|
render json: @accounts, each_serializer: REST::AccountSerializer
|
||||||
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
cache_if_unauthenticated!
|
cache_if_unauthenticated!
|
||||||
render json: @account, serializer: REST::AccountSerializer
|
render json: @account, serializer: REST::AccountSerializer
|
||||||
|
@ -79,6 +85,10 @@ class Api::V1::AccountsController < Api::BaseController
|
||||||
@account = Account.find(params[:id])
|
@account = Account.find(params[:id])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def set_accounts
|
||||||
|
@accounts = Account.where(id: account_ids).without_unapproved
|
||||||
|
end
|
||||||
|
|
||||||
def check_account_approval
|
def check_account_approval
|
||||||
raise(ActiveRecord::RecordNotFound) if @account.local? && @account.user_pending?
|
raise(ActiveRecord::RecordNotFound) if @account.local? && @account.user_pending?
|
||||||
end
|
end
|
||||||
|
@ -87,10 +97,22 @@ class Api::V1::AccountsController < Api::BaseController
|
||||||
raise(ActiveRecord::RecordNotFound) if @account.local? && !@account.user_confirmed?
|
raise(ActiveRecord::RecordNotFound) if @account.local? && !@account.user_confirmed?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def check_accounts_limit
|
||||||
|
raise(Mastodon::ValidationError) if account_ids.size > DEFAULT_ACCOUNTS_LIMIT
|
||||||
|
end
|
||||||
|
|
||||||
def relationships(**options)
|
def relationships(**options)
|
||||||
AccountRelationshipsPresenter.new([@account], current_user.account_id, **options)
|
AccountRelationshipsPresenter.new([@account], current_user.account_id, **options)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def account_ids
|
||||||
|
Array(accounts_params[:ids]).uniq.map(&:to_i)
|
||||||
|
end
|
||||||
|
|
||||||
|
def accounts_params
|
||||||
|
params.permit(ids: [])
|
||||||
|
end
|
||||||
|
|
||||||
def account_params
|
def account_params
|
||||||
params.permit(:username, :email, :password, :agreement, :locale, :reason, :time_zone, :invite_code)
|
params.permit(:username, :email, :password, :agreement, :locale, :reason, :time_zone, :invite_code)
|
||||||
end
|
end
|
||||||
|
|
|
@ -29,10 +29,11 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController
|
||||||
def create
|
def create
|
||||||
authorize :domain_block, :create?
|
authorize :domain_block, :create?
|
||||||
|
|
||||||
|
@domain_block = DomainBlock.new(resource_params)
|
||||||
existing_domain_block = resource_params[:domain].present? ? DomainBlock.rule_for(resource_params[:domain]) : nil
|
existing_domain_block = resource_params[:domain].present? ? DomainBlock.rule_for(resource_params[:domain]) : nil
|
||||||
return render json: existing_domain_block, serializer: REST::Admin::ExistingDomainBlockErrorSerializer, status: 422 if existing_domain_block.present?
|
return render json: existing_domain_block, serializer: REST::Admin::ExistingDomainBlockErrorSerializer, status: 422 if conflicts_with_existing_block?(@domain_block, existing_domain_block)
|
||||||
|
|
||||||
@domain_block = DomainBlock.create!(resource_params)
|
@domain_block.save!
|
||||||
DomainBlockWorker.perform_async(@domain_block.id)
|
DomainBlockWorker.perform_async(@domain_block.id)
|
||||||
log_action :create, @domain_block
|
log_action :create, @domain_block
|
||||||
render json: @domain_block, serializer: REST::Admin::DomainBlockSerializer
|
render json: @domain_block, serializer: REST::Admin::DomainBlockSerializer
|
||||||
|
@ -55,6 +56,10 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def conflicts_with_existing_block?(domain_block, existing_domain_block)
|
||||||
|
existing_domain_block.present? && (existing_domain_block.domain == TagManager.instance.normalize_domain(domain_block.domain) || !domain_block.stricter_than?(existing_domain_block))
|
||||||
|
end
|
||||||
|
|
||||||
def set_domain_blocks
|
def set_domain_blocks
|
||||||
@domain_blocks = filtered_domain_blocks.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id))
|
@domain_blocks = filtered_domain_blocks.order(id: :desc).to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id))
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,6 +4,6 @@ class Api::V1::Apps::CredentialsController < Api::BaseController
|
||||||
def show
|
def show
|
||||||
return doorkeeper_render_error unless valid_doorkeeper_token?
|
return doorkeeper_render_error unless valid_doorkeeper_token?
|
||||||
|
|
||||||
render json: doorkeeper_token.application, serializer: REST::ApplicationSerializer, fields: %i(name website vapid_key client_id scopes)
|
render json: doorkeeper_token.application, serializer: REST::ApplicationSerializer
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,7 +5,7 @@ class Api::V1::AppsController < Api::BaseController
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@app = Doorkeeper::Application.create!(application_options)
|
@app = Doorkeeper::Application.create!(application_options)
|
||||||
render json: @app, serializer: REST::ApplicationSerializer
|
render json: @app, serializer: REST::CredentialApplicationSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
@ -24,6 +24,6 @@ class Api::V1::AppsController < Api::BaseController
|
||||||
end
|
end
|
||||||
|
|
||||||
def app_params
|
def app_params
|
||||||
params.permit(:client_name, :redirect_uris, :scopes, :website)
|
params.permit(:client_name, :scopes, :website, :redirect_uris, redirect_uris: [])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -13,11 +13,11 @@ class Api::V1::BookmarksController < Api::BaseController
|
||||||
private
|
private
|
||||||
|
|
||||||
def load_statuses
|
def load_statuses
|
||||||
cached_bookmarks
|
preloaded_bookmarks
|
||||||
end
|
end
|
||||||
|
|
||||||
def cached_bookmarks
|
def preloaded_bookmarks
|
||||||
cache_collection(results.map(&:status), Status)
|
preload_collection(results.map(&:status), Status)
|
||||||
end
|
end
|
||||||
|
|
||||||
def results
|
def results
|
||||||
|
|
|
@ -13,11 +13,11 @@ class Api::V1::FavouritesController < Api::BaseController
|
||||||
private
|
private
|
||||||
|
|
||||||
def load_statuses
|
def load_statuses
|
||||||
cached_favourites
|
preloaded_favourites
|
||||||
end
|
end
|
||||||
|
|
||||||
def cached_favourites
|
def preloaded_favourites
|
||||||
cache_collection(results.map(&:status), Status)
|
preload_collection(results.map(&:status), Status)
|
||||||
end
|
end
|
||||||
|
|
||||||
def results
|
def results
|
||||||
|
|
|
@ -12,6 +12,6 @@ class Api::V1::FeaturedTags::SuggestionsController < Api::BaseController
|
||||||
private
|
private
|
||||||
|
|
||||||
def set_recently_used_tags
|
def set_recently_used_tags
|
||||||
@recently_used_tags = Tag.recently_used(current_account).where.not(id: current_account.featured_tags).limit(10)
|
@recently_used_tags = Tag.suggestions_for_account(current_account).limit(10)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -41,7 +41,7 @@ class Api::V1::Notifications::RequestsController < Api::BaseController
|
||||||
)
|
)
|
||||||
|
|
||||||
NotificationRequest.preload_cache_collection(requests) do |statuses|
|
NotificationRequest.preload_cache_collection(requests) do |statuses|
|
||||||
cache_collection(statuses, Status)
|
preload_collection(statuses, Status)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ class Api::V1::NotificationsController < Api::BaseController
|
||||||
)
|
)
|
||||||
|
|
||||||
Notification.preload_cache_collection_target_statuses(notifications) do |target_statuses|
|
Notification.preload_cache_collection_target_statuses(notifications) do |target_statuses|
|
||||||
cache_collection(target_statuses, Status)
|
preload_collection(target_statuses, Status)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class Api::V1::Push::SubscriptionsController < Api::BaseController
|
class Api::V1::Push::SubscriptionsController < Api::BaseController
|
||||||
|
include Redisable
|
||||||
|
include Lockable
|
||||||
|
|
||||||
before_action -> { doorkeeper_authorize! :push }
|
before_action -> { doorkeeper_authorize! :push }
|
||||||
before_action :require_user!
|
before_action :require_user!
|
||||||
before_action :set_push_subscription
|
before_action :set_push_subscription, only: [:show, :update]
|
||||||
before_action :check_push_subscription, only: [:show, :update]
|
before_action :check_push_subscription, only: [:show, :update]
|
||||||
|
|
||||||
def show
|
def show
|
||||||
|
@ -11,16 +14,18 @@ class Api::V1::Push::SubscriptionsController < Api::BaseController
|
||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@push_subscription&.destroy!
|
with_redis_lock("push_subscription:#{current_user.id}") do
|
||||||
|
destroy_web_push_subscriptions!
|
||||||
|
|
||||||
@push_subscription = Web::PushSubscription.create!(
|
@push_subscription = Web::PushSubscription.create!(
|
||||||
endpoint: subscription_params[:endpoint],
|
endpoint: subscription_params[:endpoint],
|
||||||
key_p256dh: subscription_params[:keys][:p256dh],
|
key_p256dh: subscription_params[:keys][:p256dh],
|
||||||
key_auth: subscription_params[:keys][:auth],
|
key_auth: subscription_params[:keys][:auth],
|
||||||
data: data_params,
|
data: data_params,
|
||||||
user_id: current_user.id,
|
user_id: current_user.id,
|
||||||
access_token_id: doorkeeper_token.id
|
access_token_id: doorkeeper_token.id
|
||||||
)
|
)
|
||||||
|
end
|
||||||
|
|
||||||
render json: @push_subscription, serializer: REST::WebPushSubscriptionSerializer
|
render json: @push_subscription, serializer: REST::WebPushSubscriptionSerializer
|
||||||
end
|
end
|
||||||
|
@ -31,14 +36,18 @@ class Api::V1::Push::SubscriptionsController < Api::BaseController
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
@push_subscription&.destroy!
|
destroy_web_push_subscriptions!
|
||||||
render_empty
|
render_empty
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def destroy_web_push_subscriptions!
|
||||||
|
doorkeeper_token.web_push_subscriptions.destroy_all
|
||||||
|
end
|
||||||
|
|
||||||
def set_push_subscription
|
def set_push_subscription
|
||||||
@push_subscription = Web::PushSubscription.find_by(access_token_id: doorkeeper_token.id)
|
@push_subscription = doorkeeper_token.web_push_subscriptions.first
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_push_subscription
|
def check_push_subscription
|
||||||
|
|
|
@ -1,18 +1,8 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class Api::V1::Statuses::ReactionsController < Api::V1::Statuses::BaseController
|
class Api::V1::Statuses::ReactionsController < Api::V1::Statuses::BaseController
|
||||||
REACTIONS_LIMIT = 30
|
before_action -> { doorkeeper_authorize! :write, :'write:favourites' }
|
||||||
|
before_action :require_user!
|
||||||
before_action -> { doorkeeper_authorize! :write, :'write:favourites' }, only: [:create, :destroy]
|
|
||||||
before_action -> { authorize_if_got_token! :read, :'read:accounts' }, only: [:index]
|
|
||||||
before_action :require_user!, only: [:create, :destroy]
|
|
||||||
before_action :set_reactions, only: [:index]
|
|
||||||
after_action :insert_pagination_headers, only: [:index]
|
|
||||||
|
|
||||||
def index
|
|
||||||
cache_if_unauthenticated!
|
|
||||||
render json: @reactions, each_serializer: REST::StatusReactionSerializer
|
|
||||||
end
|
|
||||||
|
|
||||||
def create
|
def create
|
||||||
ReactService.new.call(current_account, @status, params[:id])
|
ReactService.new.call(current_account, @status, params[:id])
|
||||||
|
@ -26,83 +16,4 @@ class Api::V1::Statuses::ReactionsController < Api::V1::Statuses::BaseController
|
||||||
rescue Mastodon::NotPermittedError
|
rescue Mastodon::NotPermittedError
|
||||||
not_found
|
not_found
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def set_reactions
|
|
||||||
@reactions = ordered_reactions.select(
|
|
||||||
[:id, :account_id, :name, :custom_emoji_id].tap do |values|
|
|
||||||
values << value_for_reaction_me_column(current_account)
|
|
||||||
end
|
|
||||||
).to_a_paginated_by_id(
|
|
||||||
limit_param(REACTIONS_LIMIT),
|
|
||||||
params_slice(:max_id, :since_id, :min_id)
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
def ordered_reactions
|
|
||||||
filtered_reactions.group(:status_id, :id, :account_id, :name, :custom_emoji_id)
|
|
||||||
end
|
|
||||||
|
|
||||||
def filtered_reactions
|
|
||||||
initial_reactions = StatusReaction.where(status: @status)
|
|
||||||
if filtered?
|
|
||||||
initial_reactions.where(name: params[:emoji])
|
|
||||||
else
|
|
||||||
initial_reactions
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def filtered?
|
|
||||||
params[:emoji].present?
|
|
||||||
end
|
|
||||||
|
|
||||||
def value_for_reaction_me_column(account)
|
|
||||||
if account.nil?
|
|
||||||
'FALSE AS me'
|
|
||||||
else
|
|
||||||
<<~SQL.squish
|
|
||||||
EXISTS(
|
|
||||||
SELECT 1
|
|
||||||
FROM status_reactions inner_reactions
|
|
||||||
WHERE inner_reactions.account_id = #{account.id}
|
|
||||||
AND inner_reactions.status_id = status_reactions.status_id
|
|
||||||
AND inner_reactions.name = status_reactions.name
|
|
||||||
AND (
|
|
||||||
inner_reactions.custom_emoji_id = status_reactions.custom_emoji_id
|
|
||||||
OR inner_reactions.custom_emoji_id IS NULL
|
|
||||||
AND status_reactions.custom_emoji_id IS NULL
|
|
||||||
)
|
|
||||||
) AS me
|
|
||||||
SQL
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def insert_pagination_headers
|
|
||||||
set_pagination_headers(next_path, prev_path)
|
|
||||||
end
|
|
||||||
|
|
||||||
def next_path
|
|
||||||
api_v1_status_reactions_url pagination_params(max_id: pagination_max_id) if records_continue?
|
|
||||||
end
|
|
||||||
|
|
||||||
def prev_path
|
|
||||||
api_v1_status_reactions_url pagination_params(since_id: pagination_since_id) unless @reactions.empty?
|
|
||||||
end
|
|
||||||
|
|
||||||
def pagination_max_id
|
|
||||||
@reactions.last.id
|
|
||||||
end
|
|
||||||
|
|
||||||
def pagination_since_id
|
|
||||||
@reactions.first.id
|
|
||||||
end
|
|
||||||
|
|
||||||
def records_continue?
|
|
||||||
@reactions.size == limit_param(REACTIONS_LIMIT)
|
|
||||||
end
|
|
||||||
|
|
||||||
def pagination_params(core_params)
|
|
||||||
params_slice(:limit, :emoji).merge(core_params)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -23,7 +23,7 @@ class Api::V1::Statuses::RebloggedByAccountsController < Api::V1::Statuses::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def paginated_statuses
|
def paginated_statuses
|
||||||
Status.where(reblog_of_id: @status.id).where(visibility: [:public, :unlisted]).paginate_by_max_id(
|
Status.where(reblog_of_id: @status.id).distributable_visibility.paginate_by_max_id(
|
||||||
limit_param(DEFAULT_ACCOUNTS_LIMIT),
|
limit_param(DEFAULT_ACCOUNTS_LIMIT),
|
||||||
params[:max_id],
|
params[:max_id],
|
||||||
params[:since_id]
|
params[:since_id]
|
||||||
|
|
|
@ -5,9 +5,11 @@ class Api::V1::StatusesController < Api::BaseController
|
||||||
|
|
||||||
before_action -> { authorize_if_got_token! :read, :'read:statuses' }, except: [:create, :update, :destroy]
|
before_action -> { authorize_if_got_token! :read, :'read:statuses' }, except: [:create, :update, :destroy]
|
||||||
before_action -> { doorkeeper_authorize! :write, :'write:statuses' }, only: [:create, :update, :destroy]
|
before_action -> { doorkeeper_authorize! :write, :'write:statuses' }, only: [:create, :update, :destroy]
|
||||||
before_action :require_user!, except: [:show, :context]
|
before_action :require_user!, except: [:index, :show, :context]
|
||||||
before_action :set_status, only: [:show, :context]
|
before_action :set_statuses, only: [:index]
|
||||||
before_action :set_thread, only: [:create]
|
before_action :set_status, only: [:show, :context]
|
||||||
|
before_action :set_thread, only: [:create]
|
||||||
|
before_action :check_statuses_limit, only: [:index]
|
||||||
|
|
||||||
override_rate_limit_headers :create, family: :statuses
|
override_rate_limit_headers :create, family: :statuses
|
||||||
override_rate_limit_headers :update, family: :statuses
|
override_rate_limit_headers :update, family: :statuses
|
||||||
|
@ -23,9 +25,14 @@ class Api::V1::StatusesController < Api::BaseController
|
||||||
DESCENDANTS_LIMIT = 60
|
DESCENDANTS_LIMIT = 60
|
||||||
DESCENDANTS_DEPTH_LIMIT = 20
|
DESCENDANTS_DEPTH_LIMIT = 20
|
||||||
|
|
||||||
|
def index
|
||||||
|
@statuses = preload_collection(@statuses, Status)
|
||||||
|
render json: @statuses, each_serializer: REST::StatusSerializer
|
||||||
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
cache_if_unauthenticated!
|
cache_if_unauthenticated!
|
||||||
@status = cache_collection([@status], Status).first
|
@status = preload_collection([@status], Status).first
|
||||||
render json: @status, serializer: REST::StatusSerializer
|
render json: @status, serializer: REST::StatusSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -44,8 +51,8 @@ class Api::V1::StatusesController < Api::BaseController
|
||||||
|
|
||||||
ancestors_results = @status.in_reply_to_id.nil? ? [] : @status.ancestors(ancestors_limit, current_account)
|
ancestors_results = @status.in_reply_to_id.nil? ? [] : @status.ancestors(ancestors_limit, current_account)
|
||||||
descendants_results = @status.descendants(descendants_limit, current_account, descendants_depth_limit)
|
descendants_results = @status.descendants(descendants_limit, current_account, descendants_depth_limit)
|
||||||
loaded_ancestors = cache_collection(ancestors_results, Status)
|
loaded_ancestors = preload_collection(ancestors_results, Status)
|
||||||
loaded_descendants = cache_collection(descendants_results, Status)
|
loaded_descendants = preload_collection(descendants_results, Status)
|
||||||
|
|
||||||
@context = Context.new(ancestors: loaded_ancestors, descendants: loaded_descendants)
|
@context = Context.new(ancestors: loaded_ancestors, descendants: loaded_descendants)
|
||||||
statuses = [@status] + @context.ancestors + @context.descendants
|
statuses = [@status] + @context.ancestors + @context.descendants
|
||||||
|
@ -113,6 +120,10 @@ class Api::V1::StatusesController < Api::BaseController
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def set_statuses
|
||||||
|
@statuses = Status.permitted_statuses_from_ids(status_ids, current_account)
|
||||||
|
end
|
||||||
|
|
||||||
def set_status
|
def set_status
|
||||||
@status = Status.find(params[:id])
|
@status = Status.find(params[:id])
|
||||||
authorize @status, :show?
|
authorize @status, :show?
|
||||||
|
@ -127,6 +138,18 @@ class Api::V1::StatusesController < Api::BaseController
|
||||||
render json: { error: I18n.t('statuses.errors.in_reply_not_found') }, status: 404
|
render json: { error: I18n.t('statuses.errors.in_reply_not_found') }, status: 404
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def check_statuses_limit
|
||||||
|
raise(Mastodon::ValidationError) if status_ids.size > DEFAULT_STATUSES_LIMIT
|
||||||
|
end
|
||||||
|
|
||||||
|
def status_ids
|
||||||
|
Array(statuses_params[:ids]).uniq.map(&:to_i)
|
||||||
|
end
|
||||||
|
|
||||||
|
def statuses_params
|
||||||
|
params.permit(ids: [])
|
||||||
|
end
|
||||||
|
|
||||||
def status_params
|
def status_params
|
||||||
params.permit(
|
params.permit(
|
||||||
:status,
|
:status,
|
||||||
|
|
|
@ -15,11 +15,11 @@ class Api::V1::Timelines::DirectController < Api::BaseController
|
||||||
private
|
private
|
||||||
|
|
||||||
def load_statuses
|
def load_statuses
|
||||||
cached_direct_statuses
|
preloaded_direct_statuses
|
||||||
end
|
end
|
||||||
|
|
||||||
def cached_direct_statuses
|
def preloaded_direct_statuses
|
||||||
cache_collection direct_statuses, Status
|
preload_collection direct_statuses, Status
|
||||||
end
|
end
|
||||||
|
|
||||||
def direct_statuses
|
def direct_statuses
|
||||||
|
|
|
@ -21,11 +21,11 @@ class Api::V1::Timelines::HomeController < Api::V1::Timelines::BaseController
|
||||||
private
|
private
|
||||||
|
|
||||||
def load_statuses
|
def load_statuses
|
||||||
cached_home_statuses
|
preloaded_home_statuses
|
||||||
end
|
end
|
||||||
|
|
||||||
def cached_home_statuses
|
def preloaded_home_statuses
|
||||||
cache_collection home_statuses, Status
|
preload_collection home_statuses, Status
|
||||||
end
|
end
|
||||||
|
|
||||||
def home_statuses
|
def home_statuses
|
||||||
|
|
|
@ -21,11 +21,11 @@ class Api::V1::Timelines::ListController < Api::V1::Timelines::BaseController
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_statuses
|
def set_statuses
|
||||||
@statuses = cached_list_statuses
|
@statuses = preloaded_list_statuses
|
||||||
end
|
end
|
||||||
|
|
||||||
def cached_list_statuses
|
def preloaded_list_statuses
|
||||||
cache_collection list_statuses, Status
|
preload_collection list_statuses, Status
|
||||||
end
|
end
|
||||||
|
|
||||||
def list_statuses
|
def list_statuses
|
||||||
|
|
|
@ -18,11 +18,11 @@ class Api::V1::Timelines::PublicController < Api::V1::Timelines::BaseController
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_statuses
|
def load_statuses
|
||||||
cached_public_statuses_page
|
preloaded_public_statuses_page
|
||||||
end
|
end
|
||||||
|
|
||||||
def cached_public_statuses_page
|
def preloaded_public_statuses_page
|
||||||
cache_collection(public_statuses, Status)
|
preload_collection(public_statuses, Status)
|
||||||
end
|
end
|
||||||
|
|
||||||
def public_statuses
|
def public_statuses
|
||||||
|
|
|
@ -23,11 +23,11 @@ class Api::V1::Timelines::TagController < Api::V1::Timelines::BaseController
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_statuses
|
def load_statuses
|
||||||
cached_tagged_statuses
|
preloaded_tagged_statuses
|
||||||
end
|
end
|
||||||
|
|
||||||
def cached_tagged_statuses
|
def preloaded_tagged_statuses
|
||||||
@tag.nil? ? [] : cache_collection(tag_timeline_statuses, Status)
|
@tag.nil? ? [] : preload_collection(tag_timeline_statuses, Status)
|
||||||
end
|
end
|
||||||
|
|
||||||
def tag_timeline_statuses
|
def tag_timeline_statuses
|
||||||
|
|
|
@ -20,7 +20,7 @@ class Api::V1::Trends::StatusesController < Api::BaseController
|
||||||
|
|
||||||
def set_statuses
|
def set_statuses
|
||||||
@statuses = if enabled?
|
@statuses = if enabled?
|
||||||
cache_collection(statuses_from_trends.offset(offset_param).limit(limit_param(DEFAULT_STATUSES_LIMIT)), Status)
|
preload_collection(statuses_from_trends.offset(offset_param).limit(limit_param(DEFAULT_STATUSES_LIMIT)), Status)
|
||||||
else
|
else
|
||||||
[]
|
[]
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,6 +9,7 @@ class ApplicationController < ActionController::Base
|
||||||
include UserTrackingConcern
|
include UserTrackingConcern
|
||||||
include SessionTrackingConcern
|
include SessionTrackingConcern
|
||||||
include CacheConcern
|
include CacheConcern
|
||||||
|
include PreloadingConcern
|
||||||
include DomainControlHelper
|
include DomainControlHelper
|
||||||
include ThemingConcern
|
include ThemingConcern
|
||||||
include DatabaseHelper
|
include DatabaseHelper
|
||||||
|
@ -19,6 +20,7 @@ class ApplicationController < ActionController::Base
|
||||||
helper_method :current_session
|
helper_method :current_session
|
||||||
helper_method :current_flavour
|
helper_method :current_flavour
|
||||||
helper_method :current_skin
|
helper_method :current_skin
|
||||||
|
helper_method :current_theme
|
||||||
helper_method :single_user_mode?
|
helper_method :single_user_mode?
|
||||||
helper_method :use_seamless_external_login?
|
helper_method :use_seamless_external_login?
|
||||||
helper_method :omniauth_only?
|
helper_method :omniauth_only?
|
||||||
|
@ -164,10 +166,7 @@ class ApplicationController < ActionController::Base
|
||||||
|
|
||||||
def respond_with_error(code)
|
def respond_with_error(code)
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.any do
|
format.any { render "errors/#{code}", layout: 'error', status: code, formats: [:html] }
|
||||||
use_pack 'error'
|
|
||||||
render "errors/#{code}", layout: 'error', status: code, formats: [:html]
|
|
||||||
end
|
|
||||||
format.json { render json: { error: Rack::Utils::HTTP_STATUS_CODES[code] }, status: code }
|
format.json { render json: { error: Rack::Utils::HTTP_STATUS_CODES[code] }, status: code }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -176,10 +175,7 @@ class ApplicationController < ActionController::Base
|
||||||
return unless self_destruct?
|
return unless self_destruct?
|
||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.any do
|
format.any { render 'errors/self_destruct', layout: 'auth', status: 410, formats: [:html] }
|
||||||
use_pack 'error'
|
|
||||||
render 'errors/self_destruct', layout: 'auth', status: 410, formats: [:html]
|
|
||||||
end
|
|
||||||
format.json { render json: { error: Rack::Utils::HTTP_STATUS_CODES[410] }, status: 410 }
|
format.json { render json: { error: Rack::Utils::HTTP_STATUS_CODES[410] }, status: 410 }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,7 +5,6 @@ class Auth::ChallengesController < ApplicationController
|
||||||
|
|
||||||
layout 'auth'
|
layout 'auth'
|
||||||
|
|
||||||
before_action :set_pack
|
|
||||||
before_action :authenticate_user!
|
before_action :authenticate_user!
|
||||||
|
|
||||||
skip_before_action :check_self_destruct!
|
skip_before_action :check_self_destruct!
|
||||||
|
@ -21,10 +20,4 @@ class Auth::ChallengesController < ApplicationController
|
||||||
render_challenge
|
render_challenge
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'auth'
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,7 +6,6 @@ class Auth::ConfirmationsController < Devise::ConfirmationsController
|
||||||
layout 'auth'
|
layout 'auth'
|
||||||
|
|
||||||
before_action :set_body_classes
|
before_action :set_body_classes
|
||||||
before_action :set_pack
|
|
||||||
before_action :set_confirmation_user!, only: [:show, :confirm_captcha]
|
before_action :set_confirmation_user!, only: [:show, :confirm_captcha]
|
||||||
before_action :redirect_confirmed_user, if: :signed_in_confirmed_user?
|
before_action :redirect_confirmed_user, if: :signed_in_confirmed_user?
|
||||||
|
|
||||||
|
@ -66,10 +65,6 @@ class Auth::ConfirmationsController < Devise::ConfirmationsController
|
||||||
@confirmation_user.nil? || @confirmation_user.confirmed?
|
@confirmation_user.nil? || @confirmation_user.confirmed?
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'auth'
|
|
||||||
end
|
|
||||||
|
|
||||||
def redirect_confirmed_user
|
def redirect_confirmed_user
|
||||||
redirect_to(current_user.approved? ? root_path : edit_user_registration_path)
|
redirect_to(current_user.approved? ? root_path : edit_user_registration_path)
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
class Auth::PasswordsController < Devise::PasswordsController
|
class Auth::PasswordsController < Devise::PasswordsController
|
||||||
skip_before_action :check_self_destruct!
|
skip_before_action :check_self_destruct!
|
||||||
before_action :redirect_invalid_reset_token, only: :edit, unless: :reset_password_token_is_valid?
|
before_action :redirect_invalid_reset_token, only: :edit, unless: :reset_password_token_is_valid?
|
||||||
before_action :set_pack
|
|
||||||
before_action :set_body_classes
|
before_action :set_body_classes
|
||||||
|
|
||||||
layout 'auth'
|
layout 'auth'
|
||||||
|
@ -32,8 +31,4 @@ class Auth::PasswordsController < Devise::PasswordsController
|
||||||
def reset_password_token_is_valid?
|
def reset_password_token_is_valid?
|
||||||
resource_class.with_reset_password_token(params[:reset_password_token]).present?
|
resource_class.with_reset_password_token(params[:reset_password_token]).present?
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'auth'
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,7 +9,6 @@ class Auth::RegistrationsController < Devise::RegistrationsController
|
||||||
before_action :set_invite, only: [:new, :create]
|
before_action :set_invite, only: [:new, :create]
|
||||||
before_action :check_enabled_registrations, only: [:new, :create]
|
before_action :check_enabled_registrations, only: [:new, :create]
|
||||||
before_action :configure_sign_up_params, only: [:create]
|
before_action :configure_sign_up_params, only: [:create]
|
||||||
before_action :set_pack
|
|
||||||
before_action :set_sessions, only: [:edit, :update]
|
before_action :set_sessions, only: [:edit, :update]
|
||||||
before_action :set_strikes, only: [:edit, :update]
|
before_action :set_strikes, only: [:edit, :update]
|
||||||
before_action :set_body_classes, only: [:new, :create, :edit, :update]
|
before_action :set_body_classes, only: [:new, :create, :edit, :update]
|
||||||
|
@ -97,10 +96,6 @@ class Auth::RegistrationsController < Devise::RegistrationsController
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack %w(edit update).include?(action_name) ? 'admin' : 'auth'
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_body_classes
|
def set_body_classes
|
||||||
@body_classes = %w(edit update).include?(action_name) ? 'admin' : 'lighter'
|
@body_classes = %w(edit update).include?(action_name) ? 'admin' : 'lighter'
|
||||||
end
|
end
|
||||||
|
|
|
@ -12,7 +12,6 @@ class Auth::SessionsController < Devise::SessionsController
|
||||||
skip_before_action :require_functional!
|
skip_before_action :require_functional!
|
||||||
skip_before_action :update_user_sign_in
|
skip_before_action :update_user_sign_in
|
||||||
|
|
||||||
prepend_before_action :set_pack
|
|
||||||
prepend_before_action :check_suspicious!, only: [:create]
|
prepend_before_action :check_suspicious!, only: [:create]
|
||||||
|
|
||||||
include Auth::TwoFactorAuthenticationConcern
|
include Auth::TwoFactorAuthenticationConcern
|
||||||
|
@ -104,10 +103,6 @@ class Auth::SessionsController < Devise::SessionsController
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'auth'
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_body_classes
|
def set_body_classes
|
||||||
@body_classes = 'lighter'
|
@body_classes = 'lighter'
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
class Auth::SetupController < ApplicationController
|
class Auth::SetupController < ApplicationController
|
||||||
layout 'auth'
|
layout 'auth'
|
||||||
|
|
||||||
before_action :set_pack
|
|
||||||
before_action :authenticate_user!
|
before_action :authenticate_user!
|
||||||
before_action :require_unconfirmed_or_pending!
|
before_action :require_unconfirmed_or_pending!
|
||||||
before_action :set_body_classes
|
before_action :set_body_classes
|
||||||
|
@ -43,8 +42,4 @@ class Auth::SetupController < ApplicationController
|
||||||
def user_params
|
def user_params
|
||||||
params.require(:user).permit(:email)
|
params.require(:user).permit(:email)
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'sign_up'
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
36
app/controllers/concerns/api/pagination.rb
Normal file
36
app/controllers/concerns/api/pagination.rb
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Api::Pagination
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def pagination_max_id
|
||||||
|
pagination_collection.last.id
|
||||||
|
end
|
||||||
|
|
||||||
|
def pagination_since_id
|
||||||
|
pagination_collection.first.id
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_pagination_headers(next_path = nil, prev_path = nil)
|
||||||
|
links = []
|
||||||
|
links << [next_path, [%w(rel next)]] if next_path
|
||||||
|
links << [prev_path, [%w(rel prev)]] if prev_path
|
||||||
|
response.headers['Link'] = LinkHeader.new(links) unless links.empty?
|
||||||
|
end
|
||||||
|
|
||||||
|
def require_valid_pagination_options!
|
||||||
|
render json: { error: 'Pagination values for `offset` and `limit` must be positive' }, status: 400 if pagination_options_invalid?
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def insert_pagination_headers
|
||||||
|
set_pagination_headers(next_path, prev_path)
|
||||||
|
end
|
||||||
|
|
||||||
|
def pagination_options_invalid?
|
||||||
|
params.slice(:limit, :offset).values.map(&:to_i).any?(&:negative?)
|
||||||
|
end
|
||||||
|
end
|
|
@ -83,8 +83,6 @@ module Auth::TwoFactorAuthenticationConcern
|
||||||
def prompt_for_two_factor(user)
|
def prompt_for_two_factor(user)
|
||||||
register_attempt_in_session(user)
|
register_attempt_in_session(user)
|
||||||
|
|
||||||
use_pack 'auth'
|
|
||||||
|
|
||||||
@body_classes = 'lighter'
|
@body_classes = 'lighter'
|
||||||
@webauthn_enabled = user.webauthn_enabled?
|
@webauthn_enabled = user.webauthn_enabled?
|
||||||
@scheme_type = if user.webauthn_enabled? && user_params[:otp_attempt].blank?
|
@scheme_type = if user.webauthn_enabled? && user_params[:otp_attempt].blank?
|
||||||
|
|
|
@ -45,28 +45,4 @@ module CacheConcern
|
||||||
Rails.cache.write(key, response.body, expires_in: expires_in, raw: true)
|
Rails.cache.write(key, response.body, expires_in: expires_in, raw: true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def cache_collection(raw, klass)
|
|
||||||
return raw unless klass.respond_to?(:with_includes)
|
|
||||||
|
|
||||||
raw = raw.cache_ids.to_a if raw.is_a?(ActiveRecord::Relation)
|
|
||||||
return [] if raw.empty?
|
|
||||||
|
|
||||||
cached_keys_with_value = Rails.cache.read_multi(*raw).transform_keys(&:id)
|
|
||||||
|
|
||||||
uncached_ids = raw.map(&:id) - cached_keys_with_value.keys
|
|
||||||
|
|
||||||
klass.reload_stale_associations!(cached_keys_with_value.values) if klass.respond_to?(:reload_stale_associations!)
|
|
||||||
|
|
||||||
unless uncached_ids.empty?
|
|
||||||
uncached = klass.where(id: uncached_ids).with_includes.index_by(&:id)
|
|
||||||
Rails.cache.write_multi(uncached.values.to_h { |i| [i, i] })
|
|
||||||
end
|
|
||||||
|
|
||||||
raw.filter_map { |item| cached_keys_with_value[item.id] || uncached[item.id] }
|
|
||||||
end
|
|
||||||
|
|
||||||
def cache_collection_paginated_by_id(raw, klass, limit, options)
|
|
||||||
cache_collection raw.cache_ids.to_a_paginated_by_id(limit, options), klass
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
17
app/controllers/concerns/preloading_concern.rb
Normal file
17
app/controllers/concerns/preloading_concern.rb
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module PreloadingConcern
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
def preload_collection(scope, klass)
|
||||||
|
return scope unless klass.respond_to?(:preload_cacheable_associations)
|
||||||
|
|
||||||
|
scope.to_a.tap do |records|
|
||||||
|
klass.preload_cacheable_associations(records)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def preload_collection_paginated_by_id(scope, klass, limit, options)
|
||||||
|
preload_collection scope.to_a_paginated_by_id(limit, options), klass
|
||||||
|
end
|
||||||
|
end
|
|
@ -66,7 +66,7 @@ module SignatureVerification
|
||||||
compare_signed_string = build_signed_string(include_query_string: false)
|
compare_signed_string = build_signed_string(include_query_string: false)
|
||||||
return actor unless verify_signature(actor, signature, compare_signed_string).nil?
|
return actor unless verify_signature(actor, signature, compare_signed_string).nil?
|
||||||
|
|
||||||
actor = stoplight_wrap_request { actor_refresh_key!(actor) }
|
actor = stoplight_wrapper.run { actor_refresh_key!(actor) }
|
||||||
|
|
||||||
raise SignatureVerificationError, "Could not refresh public key #{signature_params['keyId']}" if actor.nil?
|
raise SignatureVerificationError, "Could not refresh public key #{signature_params['keyId']}" if actor.nil?
|
||||||
|
|
||||||
|
@ -226,10 +226,10 @@ module SignatureVerification
|
||||||
end
|
end
|
||||||
|
|
||||||
if key_id.start_with?('acct:')
|
if key_id.start_with?('acct:')
|
||||||
stoplight_wrap_request { ResolveAccountService.new.call(key_id.delete_prefix('acct:'), suppress_errors: false) }
|
stoplight_wrapper.run { ResolveAccountService.new.call(key_id.delete_prefix('acct:'), suppress_errors: false) }
|
||||||
elsif !ActivityPub::TagManager.instance.local_uri?(key_id)
|
elsif !ActivityPub::TagManager.instance.local_uri?(key_id)
|
||||||
account = ActivityPub::TagManager.instance.uri_to_actor(key_id)
|
account = ActivityPub::TagManager.instance.uri_to_actor(key_id)
|
||||||
account ||= stoplight_wrap_request { ActivityPub::FetchRemoteKeyService.new.call(key_id, suppress_errors: false) }
|
account ||= stoplight_wrapper.run { ActivityPub::FetchRemoteKeyService.new.call(key_id, suppress_errors: false) }
|
||||||
account
|
account
|
||||||
end
|
end
|
||||||
rescue Mastodon::PrivateNetworkAddressError => e
|
rescue Mastodon::PrivateNetworkAddressError => e
|
||||||
|
@ -238,12 +238,11 @@ module SignatureVerification
|
||||||
raise SignatureVerificationError, e.message
|
raise SignatureVerificationError, e.message
|
||||||
end
|
end
|
||||||
|
|
||||||
def stoplight_wrap_request(&block)
|
def stoplight_wrapper
|
||||||
Stoplight("source:#{request.remote_ip}", &block)
|
Stoplight("source:#{request.remote_ip}")
|
||||||
.with_threshold(1)
|
.with_threshold(1)
|
||||||
.with_cool_off_time(5.minutes.seconds)
|
.with_cool_off_time(5.minutes.seconds)
|
||||||
.with_error_handler { |error, handle| error.is_a?(HTTP::Error) || error.is_a?(OpenSSL::SSL::SSLError) ? handle.call(error) : raise(error) }
|
.with_error_handler { |error, handle| error.is_a?(HTTP::Error) || error.is_a?(OpenSSL::SSL::SSLError) ? handle.call(error) : raise(error) }
|
||||||
.run
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def actor_refresh_key!(actor)
|
def actor_refresh_key!(actor)
|
||||||
|
|
|
@ -3,87 +3,22 @@
|
||||||
module ThemingConcern
|
module ThemingConcern
|
||||||
extend ActiveSupport::Concern
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
def use_pack(pack_name)
|
|
||||||
@core = resolve_pack_with_common(Themes.instance.core, pack_name)
|
|
||||||
@theme = resolve_pack_with_common(Themes.instance.flavour(current_flavour), pack_name, current_skin)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def current_flavour
|
def current_flavour
|
||||||
[current_user&.setting_flavour, Setting.flavour, 'glitch', 'vanilla'].find { |flavour| Themes.instance.flavours.include?(flavour) }
|
@current_flavour ||= [current_user&.setting_flavour, Setting.flavour, 'glitch', 'vanilla'].find { |flavour| Themes.instance.flavours.include?(flavour) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def current_skin
|
def current_skin
|
||||||
skins = Themes.instance.skins_for(current_flavour)
|
@current_skin ||= begin
|
||||||
[current_user&.setting_skin, Setting.skin, 'default'].find { |skin| skins.include?(skin) }
|
skins = Themes.instance.skins_for(current_flavour)
|
||||||
end
|
[current_user&.setting_skin, Setting.skin, 'system', 'default'].find { |skin| skins.include?(skin) }
|
||||||
|
|
||||||
def valid_pack_data?(data, pack_name)
|
|
||||||
data['pack'].is_a?(Hash) && data['pack'][pack_name].present?
|
|
||||||
end
|
|
||||||
|
|
||||||
def nil_pack(data)
|
|
||||||
{
|
|
||||||
use_common: true,
|
|
||||||
flavour: data['name'],
|
|
||||||
pack: nil,
|
|
||||||
preload: nil,
|
|
||||||
skin: nil,
|
|
||||||
supported_locales: data['locales'],
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
def pack(data, pack_name, skin)
|
|
||||||
pack_data = {
|
|
||||||
use_common: true,
|
|
||||||
flavour: data['name'],
|
|
||||||
pack: pack_name,
|
|
||||||
preload: nil,
|
|
||||||
skin: nil,
|
|
||||||
supported_locales: data['locales'],
|
|
||||||
}
|
|
||||||
|
|
||||||
return pack_data unless data['pack'][pack_name].is_a?(Hash)
|
|
||||||
|
|
||||||
pack_data[:use_common] = false if data['pack'][pack_name]['use_common'] == false
|
|
||||||
pack_data[:pack] = nil unless data['pack'][pack_name]['filename']
|
|
||||||
|
|
||||||
preloads = data['pack'][pack_name]['preload']
|
|
||||||
pack_data[:preload] = [preloads] if preloads.is_a?(String)
|
|
||||||
pack_data[:preload] = preloads if preloads.is_a?(Array)
|
|
||||||
|
|
||||||
if skin != 'default' && data['skin'][skin]
|
|
||||||
pack_data[:skin] = skin if data['skin'][skin].include?(pack_name)
|
|
||||||
elsif data['pack'][pack_name]['stylesheet']
|
|
||||||
pack_data[:skin] = 'default'
|
|
||||||
end
|
end
|
||||||
|
|
||||||
pack_data
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def resolve_pack(data, pack_name, skin)
|
def current_theme
|
||||||
return pack(data, pack_name, skin) if valid_pack_data?(data, pack_name)
|
# NOTE: this is slightly different from upstream, as it's a derived value used
|
||||||
return if data['name'].blank?
|
# for the sole purpose of pointing to the appropriate stylesheet pack
|
||||||
|
[current_flavour, current_skin]
|
||||||
fallbacks = []
|
|
||||||
if data.key?('fallback')
|
|
||||||
fallbacks = data['fallback'] if data['fallback'].is_a?(Array)
|
|
||||||
fallbacks = [data['fallback']] if data['fallback'].is_a?(String)
|
|
||||||
elsif data['name'] != Setting.default_settings['flavour']
|
|
||||||
fallbacks = [Setting.default_settings['flavour']]
|
|
||||||
end
|
|
||||||
|
|
||||||
fallbacks.each do |fallback|
|
|
||||||
return resolve_pack(Themes.instance.flavour(fallback), pack_name, skin) if Themes.instance.flavour(fallback)
|
|
||||||
end
|
|
||||||
|
|
||||||
nil
|
|
||||||
end
|
|
||||||
|
|
||||||
def resolve_pack_with_common(data, pack_name, skin = 'default')
|
|
||||||
result = resolve_pack(data, pack_name, skin) || nil_pack(data)
|
|
||||||
result[:common] = resolve_pack(data, 'common', skin) if result.delete(:use_common)
|
|
||||||
result
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,7 +7,6 @@ module WebAppControllerConcern
|
||||||
vary_by 'Accept, Accept-Language, Cookie'
|
vary_by 'Accept, Accept-Language, Cookie'
|
||||||
|
|
||||||
before_action :redirect_unauthenticated_to_permalinks!
|
before_action :redirect_unauthenticated_to_permalinks!
|
||||||
before_action :set_pack
|
|
||||||
before_action :set_app_body_class
|
before_action :set_app_body_class
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -37,8 +36,4 @@ module WebAppControllerConcern
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'home'
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,15 +9,10 @@ class Disputes::BaseController < ApplicationController
|
||||||
|
|
||||||
before_action :set_body_classes
|
before_action :set_body_classes
|
||||||
before_action :authenticate_user!
|
before_action :authenticate_user!
|
||||||
before_action :set_pack
|
|
||||||
before_action :set_cache_headers
|
before_action :set_cache_headers
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'admin'
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_body_classes
|
def set_body_classes
|
||||||
@body_classes = 'admin'
|
@body_classes = 'admin'
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,7 +6,6 @@ class Filters::StatusesController < ApplicationController
|
||||||
before_action :authenticate_user!
|
before_action :authenticate_user!
|
||||||
before_action :set_filter
|
before_action :set_filter
|
||||||
before_action :set_status_filters
|
before_action :set_status_filters
|
||||||
before_action :set_pack
|
|
||||||
before_action :set_body_classes
|
before_action :set_body_classes
|
||||||
before_action :set_cache_headers
|
before_action :set_cache_headers
|
||||||
|
|
||||||
|
@ -27,10 +26,6 @@ class Filters::StatusesController < ApplicationController
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'admin'
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_filter
|
def set_filter
|
||||||
@filter = current_account.custom_filters.find(params[:filter_id])
|
@filter = current_account.custom_filters.find(params[:filter_id])
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,7 +5,6 @@ class FiltersController < ApplicationController
|
||||||
|
|
||||||
before_action :authenticate_user!
|
before_action :authenticate_user!
|
||||||
before_action :set_filter, only: [:edit, :update, :destroy]
|
before_action :set_filter, only: [:edit, :update, :destroy]
|
||||||
before_action :set_pack
|
|
||||||
before_action :set_body_classes
|
before_action :set_body_classes
|
||||||
before_action :set_cache_headers
|
before_action :set_cache_headers
|
||||||
|
|
||||||
|
@ -45,10 +44,6 @@ class FiltersController < ApplicationController
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'settings'
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_filter
|
def set_filter
|
||||||
@filter = current_account.custom_filters.find(params[:id])
|
@filter = current_account.custom_filters.find(params[:id])
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,7 +6,6 @@ class InvitesController < ApplicationController
|
||||||
layout 'admin'
|
layout 'admin'
|
||||||
|
|
||||||
before_action :authenticate_user!
|
before_action :authenticate_user!
|
||||||
before_action :set_pack
|
|
||||||
before_action :set_body_classes
|
before_action :set_body_classes
|
||||||
before_action :set_cache_headers
|
before_action :set_cache_headers
|
||||||
|
|
||||||
|
@ -40,10 +39,6 @@ class InvitesController < ApplicationController
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'settings'
|
|
||||||
end
|
|
||||||
|
|
||||||
def invites
|
def invites
|
||||||
current_user.invites.order(id: :desc)
|
current_user.invites.order(id: :desc)
|
||||||
end
|
end
|
||||||
|
|
|
@ -10,7 +10,6 @@ class MediaController < ApplicationController
|
||||||
before_action :verify_permitted_status!
|
before_action :verify_permitted_status!
|
||||||
before_action :check_playable, only: :player
|
before_action :check_playable, only: :player
|
||||||
before_action :allow_iframing, only: :player
|
before_action :allow_iframing, only: :player
|
||||||
before_action :set_pack, only: :player
|
|
||||||
|
|
||||||
content_security_policy only: :player do |policy|
|
content_security_policy only: :player do |policy|
|
||||||
policy.frame_ancestors(false)
|
policy.frame_ancestors(false)
|
||||||
|
@ -48,8 +47,4 @@ class MediaController < ApplicationController
|
||||||
def allow_iframing
|
def allow_iframing
|
||||||
response.headers.delete('X-Frame-Options')
|
response.headers.delete('X-Frame-Options')
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'public'
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,7 +5,6 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController
|
||||||
|
|
||||||
before_action :store_current_location
|
before_action :store_current_location
|
||||||
before_action :authenticate_resource_owner!
|
before_action :authenticate_resource_owner!
|
||||||
before_action :set_pack
|
|
||||||
before_action :set_cache_headers
|
before_action :set_cache_headers
|
||||||
|
|
||||||
content_security_policy do |p|
|
content_security_policy do |p|
|
||||||
|
@ -20,10 +19,6 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController
|
||||||
store_location_for(:user, request.url)
|
store_location_for(:user, request.url)
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'auth'
|
|
||||||
end
|
|
||||||
|
|
||||||
def render_success
|
def render_success
|
||||||
if skip_authorization? || (matching_token? && !truthy_param?('force_login'))
|
if skip_authorization? || (matching_token? && !truthy_param?('force_login'))
|
||||||
redirect_or_render authorize_response
|
redirect_or_render authorize_response
|
||||||
|
|
|
@ -5,7 +5,6 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio
|
||||||
|
|
||||||
before_action :store_current_location
|
before_action :store_current_location
|
||||||
before_action :authenticate_resource_owner!
|
before_action :authenticate_resource_owner!
|
||||||
before_action :set_pack
|
|
||||||
before_action :require_not_suspended!, only: :destroy
|
before_action :require_not_suspended!, only: :destroy
|
||||||
before_action :set_body_classes
|
before_action :set_body_classes
|
||||||
before_action :set_cache_headers
|
before_action :set_cache_headers
|
||||||
|
@ -31,10 +30,6 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio
|
||||||
store_location_for(:user, request.url)
|
store_location_for(:user, request.url)
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'settings'
|
|
||||||
end
|
|
||||||
|
|
||||||
def require_not_suspended!
|
def require_not_suspended!
|
||||||
forbidden if current_account.unavailable?
|
forbidden if current_account.unavailable?
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
class Redirect::BaseController < ApplicationController
|
class Redirect::BaseController < ApplicationController
|
||||||
vary_by 'Accept-Language'
|
vary_by 'Accept-Language'
|
||||||
|
|
||||||
before_action :set_pack
|
|
||||||
before_action :set_resource
|
before_action :set_resource
|
||||||
before_action :set_app_body_class
|
before_action :set_app_body_class
|
||||||
|
|
||||||
|
@ -22,8 +21,4 @@ class Redirect::BaseController < ApplicationController
|
||||||
def set_resource
|
def set_resource
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'public'
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,7 +5,6 @@ class RelationshipsController < ApplicationController
|
||||||
|
|
||||||
before_action :authenticate_user!
|
before_action :authenticate_user!
|
||||||
before_action :set_accounts, only: :show
|
before_action :set_accounts, only: :show
|
||||||
before_action :set_pack
|
|
||||||
before_action :set_relationships, only: :show
|
before_action :set_relationships, only: :show
|
||||||
before_action :set_body_classes
|
before_action :set_body_classes
|
||||||
before_action :set_cache_headers
|
before_action :set_cache_headers
|
||||||
|
@ -73,10 +72,6 @@ class RelationshipsController < ApplicationController
|
||||||
@body_classes = 'admin'
|
@body_classes = 'admin'
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'admin'
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_cache_headers
|
def set_cache_headers
|
||||||
response.cache_control.replace(private: true, no_store: true)
|
response.cache_control.replace(private: true, no_store: true)
|
||||||
end
|
end
|
||||||
|
|
|
@ -13,7 +13,7 @@ class Settings::ApplicationsController < Settings::BaseController
|
||||||
def new
|
def new
|
||||||
@application = Doorkeeper::Application.new(
|
@application = Doorkeeper::Application.new(
|
||||||
redirect_uri: Doorkeeper.configuration.native_redirect_uri,
|
redirect_uri: Doorkeeper.configuration.native_redirect_uri,
|
||||||
scopes: 'read write follow'
|
scopes: 'read:me'
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class Settings::BaseController < ApplicationController
|
class Settings::BaseController < ApplicationController
|
||||||
before_action :set_pack
|
|
||||||
layout 'admin'
|
layout 'admin'
|
||||||
|
|
||||||
before_action :authenticate_user!
|
before_action :authenticate_user!
|
||||||
|
@ -10,10 +9,6 @@ class Settings::BaseController < ApplicationController
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'settings'
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_body_classes
|
def set_body_classes
|
||||||
@body_classes = 'admin'
|
@body_classes = 'admin'
|
||||||
end
|
end
|
||||||
|
|
|
@ -38,7 +38,7 @@ class Settings::FeaturedTagsController < Settings::BaseController
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_recently_used_tags
|
def set_recently_used_tags
|
||||||
@recently_used_tags = Tag.recently_used(current_account).where.not(id: @featured_tags.map(&:id)).limit(10)
|
@recently_used_tags = Tag.suggestions_for_account(current_account).limit(10)
|
||||||
end
|
end
|
||||||
|
|
||||||
def featured_tag_params
|
def featured_tag_params
|
||||||
|
|
|
@ -31,7 +31,7 @@ class Settings::ImportsController < Settings::BaseController
|
||||||
def show; end
|
def show; end
|
||||||
|
|
||||||
def failures
|
def failures
|
||||||
@bulk_import = current_account.bulk_imports.where(state: :finished).find(params[:id])
|
@bulk_import = current_account.bulk_imports.state_finished.find(params[:id])
|
||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.csv do
|
format.csv do
|
||||||
|
@ -92,7 +92,7 @@ class Settings::ImportsController < Settings::BaseController
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_bulk_import
|
def set_bulk_import
|
||||||
@bulk_import = current_account.bulk_imports.where(state: :unconfirmed).find(params[:id])
|
@bulk_import = current_account.bulk_imports.state_unconfirmed.find(params[:id])
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_recent_imports
|
def set_recent_imports
|
||||||
|
|
|
@ -7,10 +7,4 @@ class Settings::LoginActivitiesController < Settings::BaseController
|
||||||
def index
|
def index
|
||||||
@login_activities = LoginActivity.where(user: current_user).order(id: :desc).page(params[:page])
|
@login_activities = LoginActivity.where(user: current_user).order(id: :desc).page(params[:page])
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'settings'
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -85,10 +85,6 @@ module Settings
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'auth'
|
|
||||||
end
|
|
||||||
|
|
||||||
def redirect_invalid_otp
|
def redirect_invalid_otp
|
||||||
flash[:error] = t('webauthn_credentials.otp_required')
|
flash[:error] = t('webauthn_credentials.otp_required')
|
||||||
redirect_to settings_two_factor_authentication_methods_path
|
redirect_to settings_two_factor_authentication_methods_path
|
||||||
|
|
61
app/controllers/severed_relationships_controller.rb
Normal file
61
app/controllers/severed_relationships_controller.rb
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class SeveredRelationshipsController < ApplicationController
|
||||||
|
layout 'admin'
|
||||||
|
|
||||||
|
before_action :authenticate_user!
|
||||||
|
before_action :set_body_classes
|
||||||
|
before_action :set_cache_headers
|
||||||
|
|
||||||
|
before_action :set_event, only: [:following, :followers]
|
||||||
|
|
||||||
|
def index
|
||||||
|
@events = AccountRelationshipSeveranceEvent.where(account: current_account)
|
||||||
|
end
|
||||||
|
|
||||||
|
def following
|
||||||
|
respond_to do |format|
|
||||||
|
format.csv { send_data following_data, filename: "following-#{@event.target_name}-#{@event.created_at.to_date.iso8601}.csv" }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def followers
|
||||||
|
respond_to do |format|
|
||||||
|
format.csv { send_data followers_data, filename: "followers-#{@event.target_name}-#{@event.created_at.to_date.iso8601}.csv" }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_event
|
||||||
|
@event = AccountRelationshipSeveranceEvent.find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def following_data
|
||||||
|
CSV.generate(headers: ['Account address', 'Show boosts', 'Notify on new posts', 'Languages'], write_headers: true) do |csv|
|
||||||
|
@event.severed_relationships.active.about_local_account(current_account).includes(:remote_account).reorder(id: :desc).each do |follow|
|
||||||
|
csv << [acct(follow.target_account), follow.show_reblogs, follow.notify, follow.languages&.join(', ')]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def followers_data
|
||||||
|
CSV.generate(headers: ['Account address'], write_headers: true) do |csv|
|
||||||
|
@event.severed_relationships.passive.about_local_account(current_account).includes(:remote_account).reorder(id: :desc).each do |follow|
|
||||||
|
csv << [acct(follow.account)]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def acct(account)
|
||||||
|
account.local? ? account.local_username_and_domain : account.acct
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_body_classes
|
||||||
|
@body_classes = 'admin'
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_cache_headers
|
||||||
|
response.cache_control.replace(private: true, no_store: true)
|
||||||
|
end
|
||||||
|
end
|
|
@ -4,17 +4,12 @@ class SharesController < ApplicationController
|
||||||
layout 'modal'
|
layout 'modal'
|
||||||
|
|
||||||
before_action :authenticate_user!
|
before_action :authenticate_user!
|
||||||
before_action :set_pack
|
|
||||||
before_action :set_body_classes
|
before_action :set_body_classes
|
||||||
|
|
||||||
def show; end
|
def show; end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'share'
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_body_classes
|
def set_body_classes
|
||||||
@body_classes = 'modal-layout compose-standalone'
|
@body_classes = 'modal-layout compose-standalone'
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,7 +6,6 @@ class StatusesCleanupController < ApplicationController
|
||||||
before_action :authenticate_user!
|
before_action :authenticate_user!
|
||||||
before_action :set_policy
|
before_action :set_policy
|
||||||
before_action :set_body_classes
|
before_action :set_body_classes
|
||||||
before_action :set_pack
|
|
||||||
before_action :set_cache_headers
|
before_action :set_cache_headers
|
||||||
|
|
||||||
def show; end
|
def show; end
|
||||||
|
@ -27,10 +26,6 @@ class StatusesCleanupController < ApplicationController
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def set_pack
|
|
||||||
use_pack 'settings'
|
|
||||||
end
|
|
||||||
|
|
||||||
def set_policy
|
def set_policy
|
||||||
@policy = current_account.statuses_cleanup_policy || current_account.build_statuses_cleanup_policy(enabled: false)
|
@policy = current_account.statuses_cleanup_policy || current_account.build_statuses_cleanup_policy(enabled: false)
|
||||||
end
|
end
|
||||||
|
|
|
@ -41,7 +41,6 @@ class StatusesController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def embed
|
def embed
|
||||||
use_pack 'embed'
|
|
||||||
return not_found if @status.hidden? || @status.reblog?
|
return not_found if @status.hidden? || @status.reblog?
|
||||||
|
|
||||||
expires_in 180, public: true
|
expires_in 180, public: true
|
||||||
|
|
|
@ -45,7 +45,7 @@ class TagsController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_statuses
|
def set_statuses
|
||||||
@statuses = cache_collection(TagFeed.new(@tag, nil, local: @local).get(limit_param), Status)
|
@statuses = preload_collection(TagFeed.new(@tag, nil, local: @local).get(limit_param), Status)
|
||||||
end
|
end
|
||||||
|
|
||||||
def limit_param
|
def limit_param
|
||||||
|
|
23
app/controllers/well_known/oauth_metadata_controller.rb
Normal file
23
app/controllers/well_known/oauth_metadata_controller.rb
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module WellKnown
|
||||||
|
class OauthMetadataController < ActionController::Base # rubocop:disable Rails/ApplicationController
|
||||||
|
include CacheConcern
|
||||||
|
|
||||||
|
# Prevent `active_model_serializer`'s `ActionController::Serialization` from calling `current_user`
|
||||||
|
# and thus re-issuing session cookies
|
||||||
|
serialization_scope nil
|
||||||
|
|
||||||
|
def show
|
||||||
|
# Due to this document potentially changing between Mastodon versions (as
|
||||||
|
# new OAuth scopes are added), we don't use expires_in to cache upstream,
|
||||||
|
# instead just caching in the rails cache:
|
||||||
|
render_with_cache(
|
||||||
|
json: ::OauthMetadataPresenter.new,
|
||||||
|
serializer: ::OauthMetadataSerializer,
|
||||||
|
content_type: 'application/json',
|
||||||
|
expires_in: 15.minutes
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -113,6 +113,14 @@ module ApplicationHelper
|
||||||
content_tag(:i, nil, attributes.merge(class: class_names.join(' ')))
|
content_tag(:i, nil, attributes.merge(class: class_names.join(' ')))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def material_symbol(icon, attributes = {})
|
||||||
|
inline_svg_tag(
|
||||||
|
"400-24px/#{icon}.svg",
|
||||||
|
class: %w(icon).concat(attributes[:class].to_s.split),
|
||||||
|
role: :img
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
def check_icon
|
def check_icon
|
||||||
inline_svg_tag 'check.svg'
|
inline_svg_tag 'check.svg'
|
||||||
end
|
end
|
||||||
|
@ -233,6 +241,41 @@ module ApplicationHelper
|
||||||
EmojiFormatter.new(html, custom_emojis, other_options.merge(animate: prefers_autoplay?)).to_s
|
EmojiFormatter.new(html, custom_emojis, other_options.merge(animate: prefers_autoplay?)).to_s
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def mascot_url
|
||||||
|
full_asset_url(instance_presenter.mascot&.file&.url || frontend_asset_path('images/elephant_ui_plane.svg'))
|
||||||
|
end
|
||||||
|
|
||||||
|
def instance_presenter
|
||||||
|
@instance_presenter ||= InstancePresenter.new
|
||||||
|
end
|
||||||
|
|
||||||
|
def favicon_path(size = '48')
|
||||||
|
instance_presenter.favicon&.file&.url(size)
|
||||||
|
end
|
||||||
|
|
||||||
|
def app_icon_path(size = '48')
|
||||||
|
instance_presenter.app_icon&.file&.url(size)
|
||||||
|
end
|
||||||
|
|
||||||
|
# glitch-soc addition to handle the multiple flavors
|
||||||
|
def preload_locale_pack
|
||||||
|
supported_locales = Themes.instance.flavour(current_flavour)['locales']
|
||||||
|
preload_pack_asset "locales/#{current_flavour}/#{I18n.locale}-json.js" if supported_locales.include?(I18n.locale.to_s)
|
||||||
|
end
|
||||||
|
|
||||||
|
def flavoured_javascript_pack_tag(pack_name, **options)
|
||||||
|
javascript_pack_tag("flavours/#{current_flavour}/#{pack_name}", **options)
|
||||||
|
end
|
||||||
|
|
||||||
|
def flavoured_stylesheet_pack_tag(pack_name, **options)
|
||||||
|
stylesheet_pack_tag("flavours/#{current_flavour}/#{pack_name}", **options)
|
||||||
|
end
|
||||||
|
|
||||||
|
def preload_signed_in_js_packs
|
||||||
|
preload_files = Themes.instance.flavour(current_flavour)&.fetch('signed_in_preload', nil) || []
|
||||||
|
safe_join(preload_files.map { |entry| preload_pack_asset entry })
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def storage_host_var
|
def storage_host_var
|
||||||
|
|
|
@ -19,6 +19,6 @@ module BrandingHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def render_logo
|
def render_logo
|
||||||
image_pack_tag('logo.svg', alt: 'Mastodon', class: 'logo logo--icon')
|
image_tag(frontend_asset_path('images/logo.svg'), alt: 'Mastodon', class: 'logo logo--icon')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -49,13 +49,11 @@ module ContextHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def serialized_context(named_contexts_map, context_extensions_map)
|
def serialized_context(named_contexts_map, context_extensions_map)
|
||||||
context_array = []
|
|
||||||
|
|
||||||
named_contexts = named_contexts_map.keys
|
named_contexts = named_contexts_map.keys
|
||||||
context_extensions = context_extensions_map.keys
|
context_extensions = context_extensions_map.keys
|
||||||
|
|
||||||
named_contexts.each do |key|
|
context_array = named_contexts.map do |key|
|
||||||
context_array << NAMED_CONTEXT_MAP[key]
|
NAMED_CONTEXT_MAP[key]
|
||||||
end
|
end
|
||||||
|
|
||||||
extensions = context_extensions.each_with_object({}) do |key, h|
|
extensions = context_extensions.each_with_object({}) do |key, h|
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module MascotHelper
|
|
||||||
def mascot_url
|
|
||||||
full_asset_url(instance_presenter.mascot&.file&.url || frontend_asset_path('images/elephant_ui_plane.svg'))
|
|
||||||
end
|
|
||||||
|
|
||||||
def instance_presenter
|
|
||||||
@instance_presenter ||= InstancePresenter.new
|
|
||||||
end
|
|
||||||
end
|
|
31
app/helpers/theme_helper.rb
Normal file
31
app/helpers/theme_helper.rb
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module ThemeHelper
|
||||||
|
def theme_style_tags(flavour_and_skin)
|
||||||
|
flavour, theme = flavour_and_skin
|
||||||
|
|
||||||
|
if theme == 'system'
|
||||||
|
stylesheet_pack_tag("skins/#{flavour}/mastodon-light", media: 'not all and (prefers-color-scheme: dark)', crossorigin: 'anonymous') +
|
||||||
|
stylesheet_pack_tag("skins/#{flavour}/default", media: '(prefers-color-scheme: dark)', crossorigin: 'anonymous')
|
||||||
|
else
|
||||||
|
stylesheet_pack_tag "skins/#{flavour}/#{theme}", media: 'all', crossorigin: 'anonymous'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def theme_color_tags(flavour_and_skin)
|
||||||
|
_, theme = flavour_and_skin
|
||||||
|
|
||||||
|
if theme == 'system'
|
||||||
|
tag.meta(name: 'theme-color', content: Themes::THEME_COLORS[:dark], media: '(prefers-color-scheme: dark)') +
|
||||||
|
tag.meta(name: 'theme-color', content: Themes::THEME_COLORS[:light], media: '(prefers-color-scheme: light)')
|
||||||
|
else
|
||||||
|
tag.meta name: 'theme-color', content: theme_color_for(theme)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def theme_color_for(theme)
|
||||||
|
theme == 'mastodon-light' ? Themes::THEME_COLORS[:light] : Themes::THEME_COLORS[:dark]
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,3 +0,0 @@
|
||||||
import 'packs/public-path';
|
|
||||||
import './settings';
|
|
||||||
import './two_factor_authentication';
|
|
|
@ -1,6 +0,0 @@
|
||||||
// This file will be loaded on all pages, regardless of theme.
|
|
||||||
|
|
||||||
import 'packs/public-path';
|
|
||||||
import 'font-awesome/css/font-awesome.css';
|
|
||||||
|
|
||||||
require.context('../images/', true);
|
|
|
@ -1,41 +0,0 @@
|
||||||
// This file will be loaded on embed pages, regardless of theme.
|
|
||||||
|
|
||||||
import 'packs/public-path';
|
|
||||||
import ready from '../mastodon/ready';
|
|
||||||
|
|
||||||
interface SetHeightMessage {
|
|
||||||
type: 'setHeight';
|
|
||||||
id: string;
|
|
||||||
height: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
function isSetHeightMessage(data: unknown): data is SetHeightMessage {
|
|
||||||
if (
|
|
||||||
data &&
|
|
||||||
typeof data === 'object' &&
|
|
||||||
'type' in data &&
|
|
||||||
data.type === 'setHeight'
|
|
||||||
)
|
|
||||||
return true;
|
|
||||||
else return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
window.addEventListener('message', (e) => {
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- typings are not correct, it can be null in very rare cases
|
|
||||||
if (!e.data || !isSetHeightMessage(e.data) || !window.parent) return;
|
|
||||||
|
|
||||||
const data = e.data;
|
|
||||||
|
|
||||||
ready(() => {
|
|
||||||
window.parent.postMessage(
|
|
||||||
{
|
|
||||||
type: 'setHeight',
|
|
||||||
id: data.id,
|
|
||||||
height: document.getElementsByTagName('html')[0].scrollHeight,
|
|
||||||
},
|
|
||||||
'*',
|
|
||||||
);
|
|
||||||
}).catch((e) => {
|
|
||||||
console.error('Error in setHeightMessage postMessage', e);
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,70 +0,0 @@
|
||||||
// This file will be loaded on settings pages, regardless of theme.
|
|
||||||
|
|
||||||
import 'packs/public-path';
|
|
||||||
import Rails from '@rails/ujs';
|
|
||||||
|
|
||||||
Rails.delegate(
|
|
||||||
document,
|
|
||||||
'#edit_profile input[type=file]',
|
|
||||||
'change',
|
|
||||||
({ target }) => {
|
|
||||||
if (!(target instanceof HTMLInputElement)) return;
|
|
||||||
|
|
||||||
const avatar = document.querySelector<HTMLImageElement>(
|
|
||||||
`img#${target.id}-preview`,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!avatar) return;
|
|
||||||
|
|
||||||
let file: File | undefined;
|
|
||||||
if (target.files) file = target.files[0];
|
|
||||||
|
|
||||||
const url = file ? URL.createObjectURL(file) : avatar.dataset.originalSrc;
|
|
||||||
|
|
||||||
if (url) avatar.src = url;
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
Rails.delegate(document, '.input-copy input', 'click', ({ target }) => {
|
|
||||||
if (!(target instanceof HTMLInputElement)) return;
|
|
||||||
|
|
||||||
target.focus();
|
|
||||||
target.select();
|
|
||||||
target.setSelectionRange(0, target.value.length);
|
|
||||||
});
|
|
||||||
|
|
||||||
Rails.delegate(document, '.input-copy button', 'click', ({ target }) => {
|
|
||||||
if (!(target instanceof HTMLButtonElement)) return;
|
|
||||||
|
|
||||||
const input = target.parentNode?.querySelector<HTMLInputElement>(
|
|
||||||
'.input-copy__wrapper input',
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!input) return;
|
|
||||||
|
|
||||||
const oldReadOnly = input.readOnly;
|
|
||||||
|
|
||||||
input.readOnly = false;
|
|
||||||
input.focus();
|
|
||||||
input.select();
|
|
||||||
input.setSelectionRange(0, input.value.length);
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (document.execCommand('copy')) {
|
|
||||||
input.blur();
|
|
||||||
|
|
||||||
const parent = target.parentElement;
|
|
||||||
|
|
||||||
if (!parent) return;
|
|
||||||
parent.classList.add('copied');
|
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
parent.classList.remove('copied');
|
|
||||||
}, 700);
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
console.error(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
input.readOnly = oldReadOnly;
|
|
||||||
});
|
|
|
@ -1,24 +0,0 @@
|
||||||
# These packs will be loaded on every appropriate page, regardless of
|
|
||||||
# theme.
|
|
||||||
pack:
|
|
||||||
about:
|
|
||||||
admin: admin.ts
|
|
||||||
auth: auth.js
|
|
||||||
common:
|
|
||||||
filename: common.js
|
|
||||||
stylesheet: true
|
|
||||||
embed: embed.ts
|
|
||||||
error:
|
|
||||||
home:
|
|
||||||
inert:
|
|
||||||
filename: inert.js
|
|
||||||
stylesheet: true
|
|
||||||
mailer:
|
|
||||||
filename: mailer.js
|
|
||||||
stylesheet: true
|
|
||||||
modal:
|
|
||||||
public:
|
|
||||||
settings: settings.ts
|
|
||||||
sign_up:
|
|
||||||
share:
|
|
||||||
remote_interaction_helper: remote_interaction_helper.ts
|
|
|
@ -1,121 +0,0 @@
|
||||||
import 'packs/public-path';
|
|
||||||
|
|
||||||
import * as WebAuthnJSON from '@github/webauthn-json';
|
|
||||||
import axios from 'axios';
|
|
||||||
|
|
||||||
import ready from '../mastodon/ready';
|
|
||||||
import 'regenerator-runtime/runtime';
|
|
||||||
|
|
||||||
function getCSRFToken() {
|
|
||||||
var CSRFSelector = document.querySelector('meta[name="csrf-token"]');
|
|
||||||
if (CSRFSelector) {
|
|
||||||
return CSRFSelector.getAttribute('content');
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function hideFlashMessages() {
|
|
||||||
Array.from(document.getElementsByClassName('flash-message')).forEach(function(flashMessage) {
|
|
||||||
flashMessage.classList.add('hidden');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function callback(url, body) {
|
|
||||||
axios.post(url, JSON.stringify(body), {
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'Accept': 'application/json',
|
|
||||||
'X-CSRF-Token': getCSRFToken(),
|
|
||||||
},
|
|
||||||
credentials: 'same-origin',
|
|
||||||
}).then(function(response) {
|
|
||||||
window.location.replace(response.data.redirect_path);
|
|
||||||
}).catch(function(error) {
|
|
||||||
if (error.response.status === 422) {
|
|
||||||
const errorMessage = document.getElementById('security-key-error-message');
|
|
||||||
errorMessage.classList.remove('hidden');
|
|
||||||
console.error(error.response.data.error);
|
|
||||||
} else {
|
|
||||||
console.error(error);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
ready(() => {
|
|
||||||
if (!WebAuthnJSON.supported()) {
|
|
||||||
const unsupported_browser_message = document.getElementById('unsupported-browser-message');
|
|
||||||
if (unsupported_browser_message) {
|
|
||||||
unsupported_browser_message.classList.remove('hidden');
|
|
||||||
document.querySelector('.btn.js-webauthn').disabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const webAuthnCredentialRegistrationForm = document.getElementById('new_webauthn_credential');
|
|
||||||
if (webAuthnCredentialRegistrationForm) {
|
|
||||||
webAuthnCredentialRegistrationForm.addEventListener('submit', (event) => {
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
var nickname = event.target.querySelector('input[name="new_webauthn_credential[nickname]"]');
|
|
||||||
if (nickname.value) {
|
|
||||||
axios.get('/settings/security_keys/options')
|
|
||||||
.then((response) => {
|
|
||||||
const credentialOptions = response.data;
|
|
||||||
|
|
||||||
WebAuthnJSON.create({ 'publicKey': credentialOptions }).then((credential) => {
|
|
||||||
var params = { 'credential': credential, 'nickname': nickname.value };
|
|
||||||
callback('/settings/security_keys', params);
|
|
||||||
}).catch((error) => {
|
|
||||||
const errorMessage = document.getElementById('security-key-error-message');
|
|
||||||
errorMessage.classList.remove('hidden');
|
|
||||||
console.error(error);
|
|
||||||
});
|
|
||||||
}).catch((error) => {
|
|
||||||
console.error(error.response.data.error);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
nickname.focus();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const webAuthnCredentialAuthenticationForm = document.getElementById('webauthn-form');
|
|
||||||
if (webAuthnCredentialAuthenticationForm) {
|
|
||||||
webAuthnCredentialAuthenticationForm.addEventListener('submit', (event) => {
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
axios.get('sessions/security_key_options')
|
|
||||||
.then((response) => {
|
|
||||||
const credentialOptions = response.data;
|
|
||||||
|
|
||||||
WebAuthnJSON.get({ 'publicKey': credentialOptions }).then((credential) => {
|
|
||||||
var params = { 'user': { 'credential': credential } };
|
|
||||||
callback('sign_in', params);
|
|
||||||
}).catch((error) => {
|
|
||||||
const errorMessage = document.getElementById('security-key-error-message');
|
|
||||||
errorMessage.classList.remove('hidden');
|
|
||||||
console.error(error);
|
|
||||||
});
|
|
||||||
}).catch((error) => {
|
|
||||||
console.error(error.response.data.error);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const otpAuthenticationForm = document.getElementById('otp-authentication-form');
|
|
||||||
|
|
||||||
const linkToOtp = document.getElementById('link-to-otp');
|
|
||||||
linkToOtp.addEventListener('click', () => {
|
|
||||||
webAuthnCredentialAuthenticationForm.classList.add('hidden');
|
|
||||||
otpAuthenticationForm.classList.remove('hidden');
|
|
||||||
hideFlashMessages();
|
|
||||||
});
|
|
||||||
|
|
||||||
const linkToWebAuthn = document.getElementById('link-to-webauthn');
|
|
||||||
linkToWebAuthn.addEventListener('click', () => {
|
|
||||||
otpAuthenticationForm.classList.add('hidden');
|
|
||||||
webAuthnCredentialAuthenticationForm.classList.remove('hidden');
|
|
||||||
hideFlashMessages();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
|
@ -1,6 +1,5 @@
|
||||||
// This file will be loaded on admin pages, regardless of theme.
|
import './public-path';
|
||||||
|
import { createRoot } from 'react-dom/client';
|
||||||
import 'packs/public-path';
|
|
||||||
|
|
||||||
import Rails from '@rails/ujs';
|
import Rails from '@rails/ujs';
|
||||||
|
|
||||||
|
@ -261,6 +260,31 @@ Rails.delegate(
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
async function mountReactComponent(element: Element) {
|
||||||
|
const componentName = element.getAttribute('data-admin-component');
|
||||||
|
const stringProps = element.getAttribute('data-props');
|
||||||
|
|
||||||
|
if (!stringProps) return;
|
||||||
|
|
||||||
|
const componentProps = JSON.parse(stringProps) as object;
|
||||||
|
|
||||||
|
const { default: AdminComponent } = await import(
|
||||||
|
'@/mastodon/containers/admin_component'
|
||||||
|
);
|
||||||
|
|
||||||
|
const { default: Component } = (await import(
|
||||||
|
`@/mastodon/components/admin/${componentName}`
|
||||||
|
)) as { default: React.ComponentType };
|
||||||
|
|
||||||
|
const root = createRoot(element);
|
||||||
|
|
||||||
|
root.render(
|
||||||
|
<AdminComponent>
|
||||||
|
<Component {...componentProps} />
|
||||||
|
</AdminComponent>,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
ready(() => {
|
ready(() => {
|
||||||
const domainBlockSeveritySelect = document.querySelector<HTMLSelectElement>(
|
const domainBlockSeveritySelect = document.querySelector<HTMLSelectElement>(
|
||||||
'select#domain_block_severity',
|
'select#domain_block_severity',
|
||||||
|
@ -335,6 +359,10 @@ ready(() => {
|
||||||
if (announcementStartsAt) {
|
if (announcementStartsAt) {
|
||||||
setAnnouncementEndsAttributes(announcementStartsAt);
|
setAnnouncementEndsAttributes(announcementStartsAt);
|
||||||
}
|
}
|
||||||
}).catch((reason) => {
|
|
||||||
|
document.querySelectorAll('[data-admin-component]').forEach((element) => {
|
||||||
|
void mountReactComponent(element);
|
||||||
|
});
|
||||||
|
}).catch((reason: unknown) => {
|
||||||
throw reason;
|
throw reason;
|
||||||
});
|
});
|
|
@ -1,5 +1,5 @@
|
||||||
import './public-path';
|
import './public-path';
|
||||||
import main from "mastodon/main";
|
import main from 'mastodon/main';
|
||||||
|
|
||||||
import { start } from '../mastodon/common';
|
import { start } from '../mastodon/common';
|
||||||
import { loadLocale } from '../mastodon/locales';
|
import { loadLocale } from '../mastodon/locales';
|
||||||
|
@ -10,6 +10,6 @@ start();
|
||||||
loadPolyfills()
|
loadPolyfills()
|
||||||
.then(loadLocale)
|
.then(loadLocale)
|
||||||
.then(main)
|
.then(main)
|
||||||
.catch(e => {
|
.catch((e: unknown) => {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
});
|
});
|
5
app/javascript/entrypoints/common.js
Normal file
5
app/javascript/entrypoints/common.js
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
/* This file is a hack to have something more reliable than the upstream `common` tag
|
||||||
|
that is implicitly generated as the common chunk through webpack's `splitChunks` config */
|
||||||
|
|
||||||
|
import './public-path';
|
||||||
|
import 'font-awesome/css/font-awesome.css';
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue