nextcloud / nextcloud/spreed

Call recordings are attributed to "remote account" in the Files activity stream

Open
#19,077 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug feature: api 🛠️ feature: recordings ⏺️
Dominant language
JavaScript
Stars
2.2k
Forks
586
Avg merge
18h 27m
Merged PRs (30d)
333

Description

Describe the bug

Every call recording that is stored by the recording backend shows up in the Files activity stream as created by "remote account" instead of the participant who started the recording:

"remote account" created Recording 2026-08-23 23-23-09.mp4

The file itself lands in the correct user's Talk recording folder and the record_file_stored notification reaches the correct user, so only the attribution is wrong. Federation is not involved here, there are no trusted servers configured on this instance.

Root cause

The recording backend uploads the file to POST /ocs/v2.php/apps/spreed/api/v1/recording/{token}/store, which is a #[PublicPage] endpoint authenticated only by the recording shared secret (RecordingController::validateBackendRequest()), so there is no active user during the request.

RecordingService::store() then writes the file with $recordingFolder->newFile(), which triggers the OC_Filesystem::post_create hook. OCA\Activity\CurrentUser::getUserIdentifier() finds no session user, no share token and no X-NC-Nickname header, and falls back to an empty string. OCA\Activity\FilesHooks::addNotificationsForFileAction() therefore uses the created_by subject with an empty actor, and OCA\Files\Activity\Provider replaces the empty {user} placeholder with "remote account":

https://github.com/nextcloud/activity/blob/master/lib/CurrentUser.php (fallback to '')
https://github.com/nextcloud/server/blob/master/apps/files/lib/Activity/Provider.php (// External user via public link share branch)

The same applies to the transcript and summary files written in RecordingService::storeTranscript().

Steps to reproduce
  1. Set up the High Performance Backend and the recording server, enable call recording.
  2. Start a call, record it and stop the recording.
  3. Open Activity (or the Activity tab of the recording file) as the user who started the recording.
Expected behaviour

The activity entry names the user the recording belongs to, like any other file that user creates.

Actual behaviour

The activity entry says "remote account" created Recording ....mp4.

Server configuration
  • Nextcloud: 34.0.3
  • Talk: 24.0.4
  • Recording backend: nextcloud-talk-recording 0.2.1
  • Signaling: nextcloud-spreed-signaling 2.1.1 (4 node cluster, Debian 12)
  • Web/application servers: Oracle Linux 9, PHP 8.4, PostgreSQL
Additional information

I have a fix that sets the owner as active user while the file is written and restores the previous user afterwards. Pull request is linked below.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by locating RecordingController::validateBackendRequest(), RecordingService::store(), and RecordingService::storeTranscript() in the Talk backend, then trace the recording upload endpoint and file-creation activity hook. Reproduce the recording flow and verify that the file, transcript, and summary activity entries attribute creation to the recording owner rather than "remote account"; add or run focused regression coverage if the project provides it.

Written by the indexing model from the issue text.

Assessment

Tech stack
php
Domain
backend
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.