$this->settings->get(Setting::DownloadIpLogging), 'account_erasure_grace_days' => $this->settings->get(Setting::AccountErasureGraceDays), 'account_erasure_content_action' => $this->settings->get(Setting::AccountErasureContentAction), 'account_erasure_reassign_to' => $this->settings->get(Setting::AccountErasureReassignTo), // Installation-wide on purpose: this is the default every // erasure will use, stored once for everybody, and the page is // already behind edit_settings. 'reassign_candidates' => $this->accountDeletion->candidates(null), // The effective answer, not the stored one: where a platform // has made the choice, the screen shows what will happen and // says who decided, instead of a switch that does nothing. 'account_self_delete_files' => $this->selfDeletion->deletesFilesImmediately() ? 'immediately' : 'after_grace_period', 'account_self_delete_files_managed' => $this->selfDeletion->isManaged(), 'account_self_delete_scope' => $this->settings->get(Setting::AccountSelfDeleteScope), 'api_request_log_retention_days' => $this->settings->get(Setting::ApiRequestLogRetentionDays), 'discourage_search_indexing' => $this->settings->get(Setting::DiscourageSearchIndexing), ]); } public function update(Request $request): RedirectResponse { $validated = $request->validate([ 'download_ip_logging' => ['required', Rule::in(['all', 'anonymous_only', 'none'])], 'account_erasure_grace_days' => ['required', 'integer', 'min:0'], 'account_erasure_content_action' => ['required', Rule::in(['cascade_delete', 'reassign'])], 'account_erasure_reassign_to' => [ 'nullable', 'integer', 'required_if:account_erasure_content_action,reassign', Rule::exists('users', 'id')->where('active', true), ], 'account_self_delete_files' => ['required', Rule::in(['after_grace_period', 'immediately'])], 'account_self_delete_scope' => ['required', Rule::in(['any', 'clients'])], 'api_request_log_retention_days' => ['required', 'integer', 'min:0', 'max:3650'], 'discourage_search_indexing' => ['required', 'boolean'], ]); $this->settings->set(Setting::DownloadIpLogging, $validated['download_ip_logging']); $this->settings->set(Setting::AccountErasureGraceDays, $validated['account_erasure_grace_days']); $this->settings->set(Setting::AccountErasureContentAction, $validated['account_erasure_content_action']); // Only meaningful for 'reassign'; store 0 otherwise so a later switch // back to 'cascade_delete' doesn't leave a stale target lying around. $this->settings->set( Setting::AccountErasureReassignTo, $validated['account_erasure_content_action'] === 'reassign' ? (int) $validated['account_erasure_reassign_to'] : 0, ); // Not written while a platform decides it. The screen shows that // choice with the control disabled, so what comes back is only the // platform's answer echoed; storing it would record a decision // this installation never made. if (! $this->selfDeletion->isManaged()) { $this->settings->set(Setting::AccountSelfDeleteFiles, $validated['account_self_delete_files']); } $this->settings->set(Setting::AccountSelfDeleteScope, $validated['account_self_delete_scope']); $this->settings->set(Setting::ApiRequestLogRetentionDays, $validated['api_request_log_retention_days']); $this->settings->set(Setting::DiscourageSearchIndexing, $validated['discourage_search_indexing']); $this->activity->log(Action::SettingsUpdated, context: ['section' => 'privacy']); return back(); } }