Commit graph

4634 commits

Author SHA1 Message Date
Hazelnoot
4346bac05f check for null jobs in QueueService.queueGetJobs 2025-07-21 15:55:00 -04:00
Hazelnoot
223198a0fb fix admin/delete-all-files-of-a-user endpoint recording a log entry for every single file 2025-07-21 15:54:49 -04:00
Hazelnoot
ed68230811 merge: Add importCompleted notification. Send importCompleted when antenna/customEmoji/muting/userList is imported (!1165)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/1165

Closes #891

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Hazelnoot <acomputerdog@gmail.com>
2025-07-21 18:42:29 +00:00
наб
d954b8d138
StreamingApiServerService: handle websocket errors from client gracefully
$ nc -C tarta.nabijaczleweli.xyz 12122
  GET /streaming?_t=1752534314122 HTTP/1.1
  Host: tarta.nabijaczleweli.xyz:12122
  User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:142.0) Gecko/20100101 Firefox/142.0
  Accept: */*
  Accept-Language: en-GB,en;q=0.5
  Accept-Encoding: gzip, deflate
  Sec-WebSocket-Version: 13
  Sec-WebSocket-Extensions: permessage-deflate
  Sec-WebSocket-Key: AAAAAAAAAAAAAAAAAAAAAA==
  Connection: keep-alive, Upgrade
  Pragma: no-cache
  Cache-Control: no-cache
  Upgrade: websocket
the parameters almost don't matter so long as the server
replies with an upgrade, then press enter once or twice,
at which point the server will have crashed after
  INFO 1  [core nest]             NestFactory: Starting Nest application...
  ERR  *  [core]          Uncaught exception (uncaughtException): RangeError: Invalid WebSocket frame: invalid opcode 13
      at Receiver.getInfo (/srv/Sharkey/node_modules/.pnpm/ws@8.18.1_bufferutil@4.0.9_utf-8-validate@6.0.5/node_modules/ws/lib/receiver.js:311:26)
      at Receiver.startLoop (/srv/Sharkey/node_modules/.pnpm/ws@8.18.1_bufferutil@4.0.9_utf-8-validate@6.0.5/node_modules/ws/lib/receiver.js:155:16)
      at Receiver._write (/srv/Sharkey/node_modules/.pnpm/ws@8.18.1_bufferutil@4.0.9_utf-8-validate@6.0.5/node_modules/ws/lib/receiver.js:94:10)
      at writeOrBuffer (node:internal/streams/writable:572:12)
      at _write (node:internal/streams/writable:501:10)
      at Writable.write (node:internal/streams/writable:510:10)
      at Socket.socketOnData (/srv/Sharkey/node_modules/.pnpm/ws@8.18.1_bufferutil@4.0.9_utf-8-validate@6.0.5/node_modules/ws/lib/websocket.js:1355:35)
      at Socket.emit (node:events:518:28)
      at addChunk (node:internal/streams/readable:561:12)
      at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)
      at Readable.push (node:internal/streams/readable:392:5)
      at TCP.onStreamRead (node:internal/stream_base_commons:189:23) {
    code: 'WS_ERR_INVALID_OPCODE',
    [Symbol(status-code)]: 1002
  }
  INFO *  [core]          The process is going to exit with code 1
  node:events:496
        throw er; // Unhandled 'error' event
        ^

  RangeError: Invalid WebSocket frame: invalid opcode 13
      at Receiver.getInfo (/srv/Sharkey/node_modules/.pnpm/ws@8.18.1_bufferutil@4.0.9_utf-8-validate@6.0.5/node_modules/ws/lib/receiver.js:311:26)
      at Receiver.startLoop (/srv/Sharkey/node_modules/.pnpm/ws@8.18.1_bufferutil@4.0.9_utf-8-validate@6.0.5/node_modules/ws/lib/receiver.js:155:16)
      at Receiver._write (/srv/Sharkey/node_modules/.pnpm/ws@8.18.1_bufferutil@4.0.9_utf-8-validate@6.0.5/node_modules/ws/lib/receiver.js:94:10)
      at writeOrBuffer (node:internal/streams/writable:572:12)
      at _write (node:internal/streams/writable:501:10)
      at Writable.write (node:internal/streams/writable:510:10)
      at Socket.socketOnData (/srv/Sharkey/node_modules/.pnpm/ws@8.18.1_bufferutil@4.0.9_utf-8-validate@6.0.5/node_modules/ws/lib/websocket.js:1355:35)
      at Socket.emit (node:events:518:28)
      at addChunk (node:internal/streams/readable:561:12)
      at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)
      at Readable.push (node:internal/streams/readable:392:5)
      at TCP.onStreamRead (node:internal/stream_base_commons:189:23)
  Emitted 'error' event on WebSocket instance at:
      at Receiver.receiverOnError (/srv/Sharkey/node_modules/.pnpm/ws@8.18.1_bufferutil@4.0.9_utf-8-validate@6.0.5/node_modules/ws/lib/websocket.js:1199:15)
      at Receiver.emit (node:events:518:28)
      at emitErrorNT (node:internal/streams/destroy:170:8)
      at emitErrorCloseNT (node:internal/streams/destroy:129:3)
      at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
    code: 'WS_ERR_INVALID_OPCODE',
    [Symbol(status-code)]: 1002
  }

  Node.js v22.14.0
   ELIFECYCLE  Command failed with exit code 1.

This works through some reverse proxies (HAProxy, Caddy),
but not through others (Cloudflare, nginx, Apache(?))

Instead, just hang up if the client violates protocol

Fixes https://101010.pl/@nabijaczleweli/114854334401159070
2025-07-21 17:39:41 +02:00
Hazelnoot
6d73171dfe merge: Reject duplicate mod actions (!1157)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/1157

Closes #768

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Hazelnoot <acomputerdog@gmail.com>
2025-07-21 14:59:49 +00:00
Emily Fox
b58bd4b9c9 prevent mastodon api error when not fetching reply or renote (resolves #1125)
Use of inner joins for `reply.user` and `renote.user` meant fetching a base
note would always fail when asked to query reply or renote information.
2025-07-16 12:07:38 -05:00
наб
a00a3c6841
Add importCompleted notification. Send importCompleted when antenna/customEmoji/muting/userList is imported
The only userImportableEntities that don't notify
are blocking and following because they fork off a batch of single

Closes #891
2025-07-16 18:32:18 +02:00
piuvas
c97fafa071
requested changes. 2025-07-16 12:43:35 -03:00
Hazelnoot
38616ab246 disable outgoing mastodon quotes 2025-07-16 10:58:05 +01:00
piuvas
1696e31797
initial split descriptions impl. 2025-07-15 18:37:29 -03:00
bunnybeam
55022826cf
consistent styling for duplicate mod action checks 2025-07-14 19:40:04 +01:00
bunnybeam
92d87f955f
remove index on confetti column 2025-07-14 19:32:42 +01:00
bunnybeam
0191ea8844
fix admin/unnsfw-user not working 2025-07-10 22:49:00 +01:00
bunnybeam
eca81b6494
add various checks to avoid duplicate mod actions 2025-07-10 18:29:57 +01:00
bunnybeam
d023fb3389
return instead of erroring when suspending a suspended user 2025-07-10 16:19:55 +01:00
bunnybeam
7581b5b40b
prevent suspending a user who is already suspended 2025-07-10 15:45:21 +01:00
bunnybeam
45bf8262aa
implement optional confetti on announcements 2025-07-07 20:03:28 +01:00
Hazelnoot
c0b93364c0 disable outgoing mastodon quotes 2025-07-04 12:54:52 -04:00
dakkar
c927c30567 mark grouped notifs by oldest id - sort-of fix 1139
Misskey's code does the same, but our groups behave differently enough
that this may be not the best choice

for example, let's say we have:

- notifications 1-5 for reaction to note A
- notifications 6-8 for reaction to note B
- notifications 9-12 for reaction to note A
- notification 13-19 for non-groupable events
- notification 20 for reaction to note A

and that events happened one every minute (so the last notification is
from 20 minutes ago)

client requests the most recent 10 notifications; we fetch
notifications 1-10, and reply:

- grouped id 6 for reactions 6-8 to note B
- grouped id 10 for reactions 1-5, 9-10 to note A

then the client requests 10 more notifications, untilId=10; we fetch
notifications 11-20, and reply:

- non-grouped notifications 13-19
- grouped id 20 for reactions 11,12,20 to note A

because we sort by id, and also the `createdAt` marks the _newest_
event in each group, the client will then show:

  6 reactions to note B, 6 minutes ago
  4 reactions to note A, 1 minute ago
  notifications 13-19, 13 minutes to 19 minutes ago
  3 reactions to note A, 11 minutes ago

I don't know how to make this work better ☹
2025-07-03 14:16:20 +01:00
dakkar
76c0b646b1 recalculate size&hash after web-optimising videos 2025-07-02 16:43:24 +01:00
Lilly Schramm
0f6c5d27ec fix: Do Not NULL Descriptions 2025-06-30 08:47:44 +02:00
Hazelnoot
be1063238f merge: Enable NestJS shutdown hooks for clean exit (!1145)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/1145

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2025-06-29 19:23:55 +00:00
dakkar
d704409f85 tweak the test compose file to match our test config file
`.config/test-example.yml` uses default ports, so this one should do
the same
2025-06-29 12:19:21 +01:00
dakkar
13d045d813 merge: misskey 2025.5.0 (!1028)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/1028

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2025-06-29 09:54:12 +00:00
Marie
fad58ddc1c merge: unique constraint for registry_item - fixes #1121 (!1139)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/1139

Closes #1121

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2025-06-28 22:49:51 +00:00
Marie
f4fe14f5b7 merge: feat: Add Bio Length Setting (!1136)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/1136

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2025-06-28 22:47:41 +00:00
Marie
559a7566ab merge: smarter "clean remote files" - fixes #801 (!1143)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/1143

Closes #801

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2025-06-28 22:47:27 +00:00
Hazelnoot
957116d04a merge: Hide muted threads and notes from timelines (!1142)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/1142

Approved-by: dakkar <dakkar@thenautilus.net>
Approved-by: Marie <github@yuugi.dev>
2025-06-26 17:38:15 +00:00
Hazelnoot
d7b94e756d fix websockets not working 2025-06-26 09:32:14 -04:00
Hazelnoot
088fe15be5 improve shutdown logic somewhat 2025-06-25 22:51:32 -04:00
Hazelnoot
168a364162 fix redis listener leak in StreamingApiServerService.ts 2025-06-25 22:51:16 -04:00
Hazelnoot
4e609478f8 add additional shutdown logging 2025-06-25 22:16:26 -04:00
Hazelnoot
c79d66d48b fix disposal of ServerStatsService and QueueStatsService 2025-06-25 22:16:06 -04:00
dakkar
872258b04c embed git commit info in nodeinfo&c
this will make it much easier to debug problems for instances that run
unreleased versions!

when run on a tagged commit, `git describe --tags` prints the tag name;
otherwise it prints something like `2025.4.3-32-ga4c0ef824c` which
means:

- the closest tag is 2025.4.3
- there are 32 commits between that tag and this commit
- this commit's id is `a4c0ef824c` (the `g` is just a prefix)

notice that the version as reported by the frontend (in
`/about-sharkey` for example) is _not_ changed, that one is still
sourced from `/package.json` (so, for example, you don't get a
"sharkey has been updated!" pop-up every time)
2025-06-25 22:15:06 +01:00
dakkar
c4c6aea939 merge: use a *very* long statement_timeout for migrations (!1132)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/1132

Approved-by: Hazelnoot <acomputerdog@gmail.com>
Approved-by: Marie <github@yuugi.dev>
2025-06-25 20:35:15 +00:00
Hazelnoot
d4105dee0c enable NestJS shutdown hooks 2025-06-25 16:28:07 -04:00
dakkar
bddb6afa5d handle jobs created without the extra arguments
just in case there's any in the queue when people upgrade
2025-06-24 17:16:30 +01:00
dakkar
50ca5e8688 pass arguments to CleanRemoteFiles job 2025-06-24 17:15:21 +01:00
dakkar
c68b8d6e7c smarter "clean remote files"
this should (optionally) skip in-use files, and files that have been
seen recently
2025-06-24 17:15:21 +01:00
dakkar
4651edbc4e better upsert query
the default `.upsert` method would clobber the `id`
2025-06-24 13:47:07 +01:00
Hazelnoot
f67be0a733 fix DI for stream connection 2025-06-23 20:13:24 -04:00
Hazelnoot
d0bd12b410 fix note mutings not applying to websocket 2025-06-23 16:08:18 -04:00
Hazelnoot
bd22ae0d80 cache recent favorites, renotes, and reactions in the connection to speed up rePackNote 2025-06-23 16:05:57 -04:00
Hazelnoot
4c2a0fed63 fix streaming API notes missing reactions, not always being hidden, and having incorrect values for the isRenoted, isFavorited, isMutingThread, and isMutingNote properties 2025-06-23 15:45:47 -04:00
Hazelnoot
8cbe1344f6 fix Note.isRenoted 2025-06-23 13:47:04 -04:00
Hazelnoot
d2b4035f7a add missing GROUP BY to threadMutingsCache / noteMutingsCache 2025-06-23 13:47:04 -04:00
Hazelnoot
7200c3d6c8 implement note mutings and move favorited/renoted status into note entity directly 2025-06-23 13:47:04 -04:00
Hazelnoot
87582034b5 expose thread mute status as Note.isMuting property 2025-06-23 13:47:04 -04:00
Hazelnoot
7d0f995c9b hide muted threads from timelines 2025-06-23 13:47:04 -04:00
JeDaYoshi
afd57f99c5
fix Mastodon link verification
the top element must be a single <a> in order for verification to work, so MfmService has gained an 'inline' argument to remove the <p> added by default
2025-06-22 17:56:37 +00:00