Compare commits

...

875 Commits

Author SHA1 Message Date
Ferdinand Thiessen e9a6556e44 fixup 2026-04-07 04:06:33 +02:00
Ferdinand Thiessen 2a61e0bd98 refactor: migrate app level badge to css modules
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-07 04:06:33 +02:00
Ferdinand Thiessen fc0fc06124 refactor: migrate app bundles to Vue 3
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-07 04:06:33 +02:00
Ferdinand Thiessen 4cb22ad89f refactor: migrated app management to Vue 3
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-07 04:06:09 +02:00
Ferdinand Thiessen 6a674f449d refactor(appstore): migrate app management views to Vue 3 and Typescript
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-07 04:06:09 +02:00
Ferdinand Thiessen 67afe77f1c refactor(appstore): migrate app discover section to Vue 3
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-07 04:06:09 +02:00
Ferdinand Thiessen 7482a3a0f3 refactor(appstore): migrate daemon selection dialog to Typescript and Vue 3
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-07 04:06:09 +02:00
Ferdinand Thiessen 89fe742a83 refactor(appstore): prepare Vue 3 migration
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-07 04:06:09 +02:00
Ferdinand Thiessen c320f30268 refactor(appstore): split controllers and use proper root
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-07 04:06:09 +02:00
Ferdinand Thiessen 7c0d70dc98 refactor(appstore): migrate markdown component to Typescript
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-07 04:06:09 +02:00
Ferdinand Thiessen 3ad1cfd623 refactor: split appstore from settings app
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-07 04:06:08 +02:00
Ferdinand Thiessen 2a3321f1ff build: harden module name generation
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-07 00:04:05 +02:00
Nextcloud bot b012e5cc16 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-06 00:21:20 +00:00
Nextcloud bot 1afeb1c2d3 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-05 00:18:52 +00:00
Nextcloud bot 9a24eaa275 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-04 00:18:47 +00:00
github-actions[bot] fc18ce9cae Merge pull request #59414 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/lodash-4.18.1
chore(deps): Bump lodash from 4.17.23 to 4.18.1 in /build/frontend-legacy
2026-04-03 16:11:25 +00:00
nextcloud-command 137e94bec2 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-03 15:55:16 +00:00
dependabot[bot] 8c55673a25 chore(deps): Bump lodash in /build/frontend-legacy
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.23 to 4.18.1.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.23...4.18.1)

---
updated-dependencies:
- dependency-name: lodash
  dependency-version: 4.18.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-03 17:47:41 +02:00
Ferdinand Thiessen 92e4c882fc Merge pull request #59415 from hamidout/fix/user-ldap-last-login-config-key
fix(user_ldap): fix lastLogin reading wrong appid and configkey
2026-04-03 15:00:44 +02:00
hamid b7d6822592 fix(user_ldap): fix lastLogin reading wrong appid and configkey
fetchDetails() was calling getValueInt($uid, 'user_ldap', 'email')
instead of getValueInt($uid, 'login', 'lastLogin'), causing lastLogin
to always return 0 for offline LDAP users.

Fixes #58421

Signed-off-by: hamid <hamid@webpick.net>
2026-04-03 13:06:49 +01:00
Nextcloud bot ae45f67a75 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-03 00:18:44 +00:00
Ferdinand Thiessen 521e61828f Merge pull request #59335 from mykh-hailo/fix/duplicate-dashboard-widget
fix: duplicate dashboard widget
2026-04-02 23:22:12 +02:00
mykh-hailo 708fa13428 fix: move sanitize directly to sanitizeLayout
Signed-off-by: mykh-hailo <kristianderonta0205@gmail.com>
2026-04-02 20:20:19 +02:00
mykh-hailo 5a8292fe43 fix: duplicate dashboard widget
Signed-off-by: mykh-hailo <kristianderonta0205@gmail.com>
2026-04-02 20:20:19 +02:00
Ferdinand Thiessen c0cab68f8b Merge pull request #59388 from nextcloud/fix/noid/files-search-default-limit
fix(file-search): use default limit to search query if not provided on request body
2026-04-02 20:13:40 +02:00
Git'Fellow 1a2d36af39 Merge pull request #59267 from nextcloud/backport/59262/master
fix(files_sharing): do not prevent share creation if password is enabled but not supported by the current share type
2026-04-02 17:35:23 +02:00
Joas Schilling 60d71a99e2 Merge pull request #59370 from nextcloud/docs/adapt-codeowners
docs(webhook_listeners): adapt codeowners
2026-04-02 12:15:47 +02:00
Joas Schilling 532ba405cf Merge pull request #59341 from nextcloud/3rdparty/upgrade-zipstreamer
chore(dependencies): upgrade zipstreamer in 3rdparty
2026-04-02 11:33:25 +02:00
John Molakvoæ ca3f77bea2 Merge pull request #58872 from nextcloud/fix/templatespath 2026-04-02 11:27:31 +02:00
Joas Schilling 95e94556e1 Merge pull request #59394 from nextcloud/bugfix/noid/dont-register-invalid-routes
fix(settings): Don't register invalid routes
2026-04-02 11:26:09 +02:00
Ferdinand Thiessen 28724fe496 Merge pull request #59365 from nextcloud/fix/default-values
fix(files_external): properly set default values for backend options
2026-04-02 11:04:06 +02:00
Git'Fellow f637e1c6a2 Merge pull request #59330 from nextcloud/btnOpenShare-2
fix: update email button text to 'Open shared item'
2026-04-02 11:03:43 +02:00
Salvatore Martire c5f4ac1253 chore(dependencies): upgrade zipstreamer in 3rdparty
Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2026-04-02 10:44:10 +02:00
Joas Schilling baec1727b3 fix(settings): Don't register invalid routes
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-04-02 09:30:15 +02:00
nextcloud-command b3fa62fc3d chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-02 01:56:07 +00:00
Ferdinand Thiessen d3e5a764ba fix(files_external): properly set default values for backend options
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-02 03:47:33 +02:00
Ferdinand Thiessen 456684f138 Merge pull request #59362 from nextcloud/test/deprecations
test: resolve PHPUnit deprecation warning about `addMethods`
2026-04-02 03:46:55 +02:00
Nextcloud bot 04c12502d1 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-02 00:19:14 +00:00
nextcloud-command 1bbceea598 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-01 21:22:25 +00:00
skjnldsv 661739c9d7 fix(files_sharing): do not prevent share creation if password is enabled but not supported by the current share type
Signed-off-by: skjnldsv <skjnldsv@protonmail.com>
2026-04-01 21:20:21 +00:00
Ferdinand Thiessen 03c318d730 Merge pull request #58353 from nextcloud/refactor/55428/comments
refactor(comments): migrate to Vue 3
2026-04-01 20:49:24 +02:00
Cristian Scheid 3539476d12 fix(file-search): use default limit to search query if not provided on request body
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-04-01 14:55:04 -03:00
nextcloud-command 78098c8325 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-01 13:41:02 +00:00
Ferdinand Thiessen e8c47cf3ec fix: properly load async components
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-01 14:54:43 +02:00
Ferdinand Thiessen 324ebd144c fix: add compatibility layer for apps expecting Vue 2 API
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-01 14:54:43 +02:00
Ferdinand Thiessen e26588d78c chore: fix ESLint errors
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-01 14:54:43 +02:00
Edward Ly c56ebcecb2 refactor(comments): migrate to Vue 3
Signed-off-by: Edward Ly <contact@edward.ly>
2026-04-01 14:54:43 +02:00
Edward Ly 3aa22804e1 refactor(comments): migrate to TypeScript
Signed-off-by: Edward Ly <contact@edward.ly>
2026-04-01 14:54:43 +02:00
Edward Ly 4edf863803 build(comments): move from frontend-legacy to frontend
Signed-off-by: Edward Ly <contact@edward.ly>
2026-04-01 14:54:43 +02:00
Jana Peper b87d71c4e5 docs(webhook_listeners): adapt codeowners
Signed-off-by: Jana Peper <jana.peper@nextcloud.com>
2026-04-01 14:48:50 +02:00
John Molakvoæ bb1ad1ca15 Merge pull request #59372 from nextcloud/carl/silent-warning-zip 2026-04-01 14:19:13 +02:00
Carl Schwan 7eb0ba9feb fix(zip): Fix warning when downloading Zip file
The HEAD request, create a GET subrequest which is not compatible with
the ZIP plugin since the ZIP plugin is directly streaming the content to
php://output, so we were sending the content in a HEAD request and
creating the ZIP twice and this was creating various warning in logs
too.

Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-04-01 12:19:43 +02:00
Joas Schilling 530b635cea Merge pull request #58986 from nextcloud/Jerome-Herbinet-activity_use_cached_mountpoints_flag_retroactivity_notice
activity_use_cached_mountpoints flag retroactivity notice
2026-04-01 08:03:38 +02:00
Nextcloud bot 84112d8fc7 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-01 00:19:19 +00:00
Ferdinand Thiessen f6379da3a1 Merge pull request #59294 from nextcloud/dragDropDirCreate
fix(filesDrop): drag-and-drop folder upload
2026-04-01 01:30:48 +02:00
github-actions[bot] 560ea9abe7 Merge pull request #59363 from nextcloud/dependabot/github_actions/github-actions-38c73435d9
chore(deps): Bump the github-actions group with 7 updates
2026-03-31 23:22:03 +00:00
Ferdinand Thiessen e0c1b74419 test: resolve PHPUnit deprecation warning about addMethods
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-01 01:12:52 +02:00
Ferdinand Thiessen 047a758a31 Merge pull request #58786 from nextcloud/fix/templates_enabled
fix(files): only disable template creation when both skeleton directories are empty
2026-04-01 00:40:25 +02:00
nextcloud-command d5cc1ad2ca chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-31 22:21:32 +00:00
dependabot[bot] 36e4de2552 chore(deps): Bump the github-actions group with 7 updates
Bumps the github-actions group with 7 updates:

| Package | From | To |
| --- | --- | --- |
| [dorny/paths-filter](https://github.com/dorny/paths-filter) | `3.0.2` | `4.0.1` |
| [shivammathur/setup-php](https://github.com/shivammathur/setup-php) | `2.36.0` | `2.37.0` |
| [github/codeql-action](https://github.com/github/codeql-action) | `4.32.4` | `4.35.1` |
| [actions/setup-node](https://github.com/actions/setup-node) | `6.2.0` | `6.3.0` |
| [cypress-io/github-action](https://github.com/cypress-io/github-action) | `7.1.5` | `7.1.9` |
| [codecov/codecov-action](https://github.com/codecov/codecov-action) | `5.5.2` | `6.0.0` |
| [LizardByte/actions](https://github.com/lizardbyte/actions) | `2026.227.200013` | `2026.328.161128` |


Updates `dorny/paths-filter` from 3.0.2 to 4.0.1
- [Release notes](https://github.com/dorny/paths-filter/releases)
- [Changelog](https://github.com/dorny/paths-filter/blob/master/CHANGELOG.md)
- [Commits](https://github.com/dorny/paths-filter/compare/de90cc6fb38fc0963ad72b210f1f284cd68cea36...fbd0ab8f3e69293af611ebaee6363fc25e6d187d)

Updates `shivammathur/setup-php` from 2.36.0 to 2.37.0
- [Release notes](https://github.com/shivammathur/setup-php/releases)
- [Commits](https://github.com/shivammathur/setup-php/compare/44454db4f0199b8b9685a5d763dc37cbf79108e1...accd6127cb78bee3e8082180cb391013d204ef9f)

Updates `github/codeql-action` from 4.32.4 to 4.35.1
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/89a39a4e59826350b863aa6b6252a07ad50cf83e...c10b8064de6f491fea524254123dbe5e09572f13)

Updates `actions/setup-node` from 6.2.0 to 6.3.0
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/6044e13b5dc448c55e2357c09f80417699197238...53b83947a5a98c8d113130e565377fae1a50d02f)

Updates `cypress-io/github-action` from 7.1.5 to 7.1.9
- [Release notes](https://github.com/cypress-io/github-action/releases)
- [Changelog](https://github.com/cypress-io/github-action/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cypress-io/github-action/compare/bc22e01685c56e89e7813fd8e26f33dc47f87e15...783cb3f07983868532cabaedaa1e6c00ff4786a8)

Updates `codecov/codecov-action` from 5.5.2 to 6.0.0
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/671740ac38dd9b0130fbe1cec585b89eea48d3de...57e3a136b779b570ffcdbf80b3bdc90e7fab3de2)

Updates `LizardByte/actions` from 2026.227.200013 to 2026.328.161128
- [Release notes](https://github.com/lizardbyte/actions/releases)
- [Commits](https://github.com/lizardbyte/actions/compare/70bb8d394d1c92f6113aeec6ae9cc959a5763d15...0affa4f7bcb27562658960eee840eff8ff844578)

---
updated-dependencies:
- dependency-name: dorny/paths-filter
  dependency-version: 4.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: shivammathur/setup-php
  dependency-version: 2.37.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: github/codeql-action
  dependency-version: 4.35.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: actions/setup-node
  dependency-version: 6.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: cypress-io/github-action
  dependency-version: 7.1.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: codecov/codecov-action
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: LizardByte/actions
  dependency-version: 2026.328.161128
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-31 22:18:07 +00:00
Git'Fellow 5a9fa36bb1 fix(filesDrop): drag-and-drop folder upload directories
Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com>
2026-04-01 00:13:53 +02:00
Ferdinand Thiessen 9e9cccd9ec Merge pull request #58903 from nextcloud/chore/noid/update-workflows
chore(workflows): remove cypress cloud
2026-03-31 23:36:53 +02:00
Ferdinand Thiessen 533125defc Merge pull request #59342 from nextcloud/ci/cypress-contributors
ci(cypress): allow running on forks by removing Cypress cloud
2026-03-31 15:59:21 +02:00
Ferdinand Thiessen 6ba57a70a9 Merge pull request #59311 from nextcloud/jtr/feat-reminders-utc-headers
feat(files_reminders): add explicit UTC indicators to `list` command headers
2026-03-31 15:43:47 +02:00
Ferdinand Thiessen 266dfbce24 Merge pull request #58970 from nextcloud/fix/sftp-mtime
fix: manually set modified time to SFTP files after editing
2026-03-31 13:39:47 +02:00
Joas Schilling 820e0915e9 Merge pull request #59299 from AlessioDiPretoroAsdea/fix/suggestion-ticket-59266
dav: Fix fatal error when ORGANIZER is missing in CalDAV schedule
2026-03-31 13:30:14 +02:00
Stephan Orbaugh 22c75f5b25 Merge pull request #59317 from psimaker/fix/weather-status-missing-codes
fix(weather_status): add all missing met.no symbol codes to weatherOptions
2026-03-31 12:59:45 +02:00
Ferdinand Thiessen 0cd74df34e chore: update psalm baseline
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-03-31 12:36:06 +02:00
Hendrik Leidinger 6e88edb0a6 fix: make psalm and rector happy
Signed-off-by: Hendrik Leidinger <hendrik.leidinger@nextcloud.com>
2026-03-31 12:35:09 +02:00
Hendrik Leidinger 33e35afad2 fix: modified touch function of the SFTP storage to update mtimes instead
Signed-off-by: Hendrik Leidinger <hendrik.leidinger@nextcloud.com>
2026-03-31 12:35:08 +02:00
Hendrik Leidinger 6d26c71b48 fix: manually set modified time to SFTP files after editing
Signed-off-by: Hendrik Leidinger <hendrik.leidinger@nextcloud.com>
2026-03-31 12:35:08 +02:00
psimaker 19b0c911aa chore(weather_status): compile frontend assets
Signed-off-by: psimaker <psimaker@users.noreply.github.com>
2026-03-31 12:23:55 +02:00
psimaker af8cb33a40 fix(weather_status): add all missing met.no symbol codes to weatherOptions
Signed-off-by: psimaker <psimaker@users.noreply.github.com>
2026-03-31 12:12:33 +02:00
Ferdinand Thiessen d6e6525861 ci(cypress): allow running on forks by removing Cypress cloud
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-03-31 12:01:11 +02:00
Joas Schilling 5acf3878f3 Merge pull request #59318 from nextcloud/jtr/ci-perf-lint-php-cs-changes-bypass
ci: stop running `lint` in `lint-php-cs` unconditionally even if no changes
2026-03-31 11:56:26 +02:00
Joas Schilling 810d8b4c98 Merge pull request #59319 from nextcloud/jtr/ci-perf-static-code-analysis-changes-check
ci: add path filtering to static-code-analysis workflow
2026-03-31 11:55:19 +02:00
Git'Fellow 545a9c1c73 fix: update email button text to 'Open shared item'
Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com>
2026-03-31 11:27:58 +02:00
Nextcloud bot 32a264842f fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-31 00:19:16 +00:00
AlessioDiPretoroAsdea 85b851a7df fix(dav): Avoid fatal error for events without an organizer
Signed-off-by: AlessioDiPretoroAsdea <alessio.dipretoro@asdeahw.net>
2026-03-30 14:22:56 -04:00
Josh 330ae40ecf ci: add path filtering to static-code-analysis workflow
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-30 12:56:55 -04:00
Josh b400f1b93b ci: stop running lint in lint-php-cs unconditionally even if no changes
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-30 12:31:49 -04:00
Robin Appelman 78513504ca Merge pull request #59202 from nextcloud/encp-cache-key-validation
fix: cache validation of system keys
2026-03-30 17:52:31 +02:00
Josh d89da91a56 feat(files_reminders): add explicit UTC indicators to list command headers
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-30 10:42:35 -04:00
Côme Chilliet 7040916f96 Merge pull request #59222 from nextcloud/artonge/fix/systemtag_user_context
feat(systemtag): Add $user context to create and update tag
2026-03-30 16:33:52 +02:00
Salvatore Martire 9756097e28 Merge pull request #59252 from nextcloud/fix/move-with-unjailed-source-path
fix: use unjailed source path when moving jailed files
2026-03-30 15:42:49 +02:00
Oleksandr Piskun 5ce08e9704 Merge pull request #58376 from nextcloud/feat/taskprocessing/keda-autoscaler
feat(taskprocessing): Add queue_stats API endpoint for external autoscalers
2026-03-30 16:27:54 +03:00
Oleksander Piskun f573285040 feat(taskprocessing): Add queue_stats API endpoint for external autoscalers
Signed-off-by: Oleksander Piskun <oleksandr2088@icloud.com>
2026-03-30 12:03:19 +00:00
Joas Schilling b119cace4f Merge pull request #59303 from nextcloud/bugfix/noid/dont-redirect-on-error
fix(sharing): Don't redirect when accepting a share failed
2026-03-30 13:12:48 +02:00
Joas Schilling 2c560b0837 fix(sharing): Don't redirect when accepting a share failed
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-03-30 12:07:42 +02:00
Côme Chilliet 4e0217ef13 chore(tests): Fix bogus parameter passed by tests to createTag
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-30 11:38:15 +02:00
Côme Chilliet 17d60a4af0 Merge pull request #59204 from nextcloud/jtr/feat-external-s3-auth-fields
feat(files_external/s3): make some auth labels clearer
2026-03-30 11:24:23 +02:00
Côme Chilliet 3a5c445c78 Merge pull request #59261 from nextcloud/feat/config/sensitive-values/sentry-csp-report-url
feat(config): add Sentry CSP Report URL to sensitive values
2026-03-30 10:15:02 +02:00
Git'Fellow 04ee3aff1a Merge pull request #59270 from nextcloud/ensureValueOneParallel
fix(chunkedUploads): Ensure max parallel count is at least 1
2026-03-30 10:11:27 +02:00
Louis Chmn 3aa2e130cd feat(systemtag): Add $user context to create and update tag
Signed-off-by: Louis Chmn <louis@chmn.me>
2026-03-30 09:54:54 +02:00
Nextcloud bot b71661a38b fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-30 00:29:17 +00:00
Git'Fellow 5b86c7a402 docs: Add a note to documentation
Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com>
2026-03-29 15:02:43 +02:00
Nextcloud bot e2dc439c71 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-29 00:33:57 +00:00
Josh c86e2d1e67 test: add coverage for ChunkedUploadConfig
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-27 23:44:45 -04:00
Nextcloud bot f5faddaf31 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-28 00:30:27 +00:00
Git'Fellow 99a26b0a97 fix(chunkedUploads): Ensure max parallel count is at least 1
Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com>
2026-03-27 18:57:19 +01:00
Andy Scherzinger aaf2ded381 Merge pull request #59240 from nextcloud/hskpng/code-owners
docs: update CODEOWNERS with new assignments
2026-03-27 18:48:53 +01:00
Joda Stößer c8dbc73017 fix(config): correct indentation for Sentry CSP Report URL
Signed-off-by: Joda Stößer <git@simjo.st>
2026-03-27 16:11:28 +01:00
Joda Stößer a71584ee96 feat(config): add Sentry CSP Report URL to sensitive values
Signed-off-by: Joda Stößer <git@simjo.st>
2026-03-27 16:01:41 +01:00
Salvatore Martire bf24b24841 fix: use unjailed source path when moving jailed files
Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2026-03-27 14:30:46 +01:00
Nextcloud bot f8cc0adefb fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-27 00:29:10 +00:00
Robin Appelman d1fd735698 Merge pull request #57374 from nextcloud/rename-dav-permissions
fix: allow renaming files with just update permissions
2026-03-26 22:12:28 +01:00
Robin Appelman 1e2f273c09 test: adjust tests to caching of key validation
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-03-26 21:13:18 +01:00
Robin Appelman 9b504039f4 fix: cache validation of system keys
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-03-26 21:12:05 +01:00
Arthur Schiwon 0ff7ad3535 docs: update CODEOWNERS with new assignments
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
2026-03-26 21:06:50 +01:00
nextcloud-command 8f7b0b4264 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-26 18:18:56 +01:00
Robin Appelman c08592de28 fix: properly expose rename permissions over dav
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-03-26 18:18:55 +01:00
Robin Appelman 005b2b04e8 fix: update rename permissions check in files ui
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-03-26 17:10:03 +01:00
Robin Appelman 63a4778744 fix: allow renaming files with just update permissions
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-03-26 17:10:01 +01:00
Côme Chilliet ca245b4cc6 Merge pull request #58896 from nextcloud/fix/fix-tags-user-event
fix: Fix user in Tags class, do not depend upon session
2026-03-26 17:06:27 +01:00
Louis 309d12abe1 Merge pull request #58990 from mosi-kha/fix/group-displayname-event-oldvalue
fix(group): pass previous display name in GroupChangedEvent
2026-03-26 16:07:50 +01:00
Kate 7e9e1269a0 Merge pull request #59218 from nextcloud/feat/audit-log-ai-config-changes 2026-03-26 12:22:37 +01:00
Marcel Klehr 861f9bdb31 fix(settings): Check all values first, then apply them
Signed-off-by: Marcel Klehr <mklehr@gmx.net>
2026-03-26 11:32:42 +01:00
Marcel Klehr a375265111 fix(settings): Throw JSON errors and return 400 status if JSON encode fails
Signed-off-by: Marcel Klehr <mklehr@gmx.net>
2026-03-26 11:03:31 +01:00
Marcel Klehr 7fe3d1c6a0 feat(settings): Log AI config changes to audit log
Signed-off-by: Marcel Klehr <mklehr@gmx.net>
2026-03-26 10:50:01 +01:00
Kate 0cf140e903 Merge pull request #58761 from nextcloud/feat/1700/limit-recent-files 2026-03-26 09:05:14 +01:00
github-actions[bot] 3d27f8d288 Merge pull request #59207 from nextcloud/dependabot/npm_and_yarn/multi-bf05dc1ecf
chore(deps): Bump picomatch
2026-03-26 02:18:48 +00:00
Nextcloud bot 52dac4be2b fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-26 00:19:23 +00:00
dependabot[bot] 252e24b83d chore(deps): Bump picomatch
Bumps  and [picomatch](https://github.com/micromatch/picomatch). These dependencies needed to be updated together.

Updates `picomatch` from 4.0.3 to 4.0.4
- [Release notes](https://github.com/micromatch/picomatch/releases)
- [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/picomatch/compare/4.0.3...4.0.4)

Updates `picomatch` from 2.3.1 to 2.3.2
- [Release notes](https://github.com/micromatch/picomatch/releases)
- [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/picomatch/compare/4.0.3...4.0.4)

---
updated-dependencies:
- dependency-name: picomatch
  dependency-version: 4.0.4
  dependency-type: indirect
- dependency-name: picomatch
  dependency-version: 2.3.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-25 22:31:46 +00:00
Josh b7bdd76731 feat(files_external/s3): rename legacy signature (v2) for clarity
Avoid the use of "authentication" here since this is really about signing compatibility, not the source of credentials. Also prefix with "Use" for UI consistency.

Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-25 16:21:35 -04:00
Josh 00100427be feat(files_external/s3): Adjust auth meth/parameter field names
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-25 16:10:35 -04:00
Ferdinand Thiessen 2ae66ff888 Merge pull request #59043 from nextcloud/jtr/chore-trashbin-drop-abortOperation-usage
chore(trashbin): deprecate abortOperation on BeforeNodeRestoredEvent / switch to AbortedEventException
2026-03-25 18:14:59 +01:00
Cristian Scheid 6594d54476 feat(recent-search): pass recent_limit config value to getRecentSearch function
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-03-25 13:53:26 -03:00
Joas Schilling 9b125a7605 Merge pull request #59179 from nextcloud/automated/noid/master-update-code-signing-crl
[master] fix(security): Update code signing revocation list
2026-03-25 07:35:57 +01:00
nextcloud-command eb06a5628f fix(security): Update code signing revocation list
Signed-off-by: GitHub <noreply@github.com>
2026-03-25 03:12:18 +00:00
Nextcloud bot 2a5e57d2f4 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-25 00:19:21 +00:00
Cristian Scheid 9b605de474 refactor(recent-files): move recent limit to app-scoped config
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-03-24 20:44:22 -03:00
Cristian Scheid 48ce8c3fa1 refactor(recent-files): remove user config from frontend files
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-03-24 15:38:53 -03:00
Cristian Scheid 3925176b49 refactor(files-settings): remove recent file settings section
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-03-24 15:15:34 -03:00
Cristian Scheid 981978d960 feat(recent-files): handle invalid config when only min or max are set for recent files limit
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-03-24 15:15:34 -03:00
Cristian Scheid 282e6b707a feat(file-info): encapsulate logic to get last activity in getLastActivity function
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-03-24 15:15:34 -03:00
Cristian Scheid 5bcac61c73 refactor(recent-search): use order by fields to determine extended cache join and cast config limit to number
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-03-24 15:15:34 -03:00
Cristian Scheid 8225ab726f feat(recent-files): add nc:last_activity property to allow sorting by max between upload_time and mtime
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-24 15:15:34 -03:00
Cristian Scheid 62f3ea390e feat(recent-files): add recent_files_limit config on files settings
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-03-24 15:15:34 -03:00
John Molakvoæ d677a3a5e2 Merge pull request #59089 from nextcloud/fix/expand-theming-capabilities 2026-03-24 17:45:07 +01:00
skjnldsv 04d9f79985 chore: openapi conf update
Signed-off-by: skjnldsv <skjnldsv@protonmail.com>
2026-03-24 15:24:18 +01:00
John Molakvoæ 8fa69c1c29 fix(theming): deprecation message
Co-authored-by: Ferdinand Thiessen <opensource@fthiessen.de>
Signed-off-by: John Molakvoæ <skjnldsv@users.noreply.github.com>
2026-03-24 15:24:18 +01:00
skjnldsv f2c73ebffd fix(theming): deprecate OCA.Theming and move to capabilities
Signed-off-by: skjnldsv <skjnldsv@protonmail.com>
2026-03-24 15:24:18 +01:00
Côme Chilliet 5a7d38b22c Merge pull request #59159 from nextcloud/fix/remove-static-vars-batch
Remove static vars, first batch
2026-03-24 14:20:10 +01:00
Nextcloud bot e4c2a1d218 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-24 00:19:16 +00:00
Côme Chilliet e367c5a928 chore: update psalm baseline
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-23 16:48:31 +01:00
Côme Chilliet 5c935429ef fix: Remove a static var usage in encryption application
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-23 16:48:31 +01:00
Côme Chilliet c88a1d3961 fix: Remove static vars usage in user_ldap
There are still some left, harder to remove.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-23 16:48:31 +01:00
Côme Chilliet 9b84a0ec19 fix: Remove unused static var and method in files application
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-23 16:48:30 +01:00
Côme Chilliet b256928385 fix: Remove use of static vars in dav application
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-23 16:48:30 +01:00
Daniel 8032ad83b3 Merge pull request #59147 from nextcloud/fix/use-fqdn-for-dns-pinning
fix(DnsPinning): Ensure to always lookup based on FQDN
2026-03-23 16:36:38 +01:00
Côme Chilliet 6b49aa792b chore: Remove types from const properties for PHP 8.2 compatibility
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-23 16:36:01 +01:00
Côme Chilliet cd2d09de64 fix: Remove static vars from core classes
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-23 16:34:54 +01:00
Côme Chilliet 2c068f3683 fix: Remove static vars from applications
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-23 16:34:20 +01:00
Côme Chilliet 1398c598cf fix: Remove static vars from user_ldap
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-23 16:34:01 +01:00
Côme Chilliet 614afec231 fix: Remove static var in AppManager
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-23 16:33:29 +01:00
Côme Chilliet 3fcb3a962d fix: Remove useless static property in OCP\Util
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-23 16:33:15 +01:00
Côme Chilliet 5961eba6a1 fix: Remove static var in NaturalSort
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-23 16:19:59 +01:00
Arthur Schiwon 6f7961f5ce Merge pull request #59142 from nextcloud/fix/caldav_search_for_uri
fix(ICalendar): allow to search for event URI
2026-03-23 14:56:57 +01:00
Côme Chilliet 69db28c7ec Merge pull request #59079 from nextcloud/fix/do-not-store-auth-code
fix(oauth2): Do not store the code in throttle metadata
2026-03-23 10:31:51 +01:00
Kate 18f03f69b4 Merge pull request #59151 from nextcloud/automated/noid/rector-changes 2026-03-23 10:23:51 +01:00
Jonas f34513d8ad fix(ICalendar): allow to search for event URI
Signed-off-by: Jonas <jonas@freesources.org>
2026-03-23 10:22:03 +01:00
Nextcloud bot 9beed5c8fe fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-23 00:19:29 +00:00
github-actions[bot] 50c37e300c Merge pull request #59118 from nextcloud/dependabot/npm_and_yarn/jsdom-29.0.1
chore(deps-dev): Bump jsdom from 29.0.0 to 29.0.1
2026-03-23 00:19:37 +01:00
github-actions[bot] 730db45c26 Merge pull request #59115 from nextcloud/dependabot/composer/vendor-bin/rector/rector/rector-2.3.9
chore(deps-dev): Bump rector/rector from 2.3.8 to 2.3.9 in /vendor-bin/rector
2026-03-23 00:18:21 +01:00
github-actions[bot] eec757fc2e Merge pull request #59117 from nextcloud/dependabot/npm_and_yarn/stylelint-17.5.0
chore(deps-dev): Bump stylelint from 17.4.0 to 17.5.0
2026-03-23 00:17:50 +01:00
David Dreschner 5bc0ba6a51 fix(DnsPinning): Ensure to always lookup based on FQDN
Signed-off-by: David Dreschner <david.dreschner@nextcloud.com>
2026-03-22 20:34:55 +01:00
nextcloud-command 1ed0769d4c refactor: Apply rector changes
Signed-off-by: GitHub <noreply@github.com>
2026-03-22 14:45:16 +00:00
Andy Scherzinger cde3780f01 Merge pull request #59120 from nextcloud/dependabot/npm_and_yarn/cypress-split-1.24.31
chore(deps-dev): Bump cypress-split from 1.24.28 to 1.24.31
2026-03-22 14:45:14 +01:00
Andy Scherzinger 4a88f9316b Merge pull request #58739 from chandrika1993/fix/issue-50502
fix(settings): correctly detect Chrome on Android in devices & sessions
2026-03-22 10:24:09 +01:00
Nextcloud bot e17f7aa92d fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-22 00:19:11 +00:00
Ferdinand Thiessen 9d8bab02fc Merge pull request #59141 from nextcloud/jtr/chore-EventSource-drop-legacy-IE-inline-fallback
chore(EventSource): drop no longer needed legacy fallback
2026-03-21 22:47:14 +01:00
Josh 8bd63c5fe2 chore(Trashbin): hello lint
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-21 11:50:28 -04:00
Josh e53c124ecc chore(trashbin): drop unused use statements from SyncLivePhotosListener
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-21 11:50:28 -04:00
Josh 5f658d9eae chore(Trashbin): add AbortedEventException use
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-21 11:50:28 -04:00
Josh bd0784e056 refactor(Trashbin): switch to AbortedEventException usage in restore
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-21 11:50:28 -04:00
Josh 23569000a8 chore(trashbin): switch SyncLivePhotosListener to AbortedEventException
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-21 11:50:28 -04:00
Josh 4b2a77b1ff chore(trashbin): refactor deprecated abortOperation to use AbortedEventException
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-21 11:50:28 -04:00
nextcloud-command 6346b9c884 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-21 14:31:28 +00:00
Josh 6a88c86a54 chore(EventSource): add typing
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-21 09:38:37 -04:00
Josh 9da1e46def chore(EventSource): drop legacy fallback note from IEventSource
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-21 09:36:35 -04:00
Josh 24550e5aac chore(EventSource): drop legacy server-side fallback
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-21 09:18:06 -04:00
Josh 1c1bd469b8 chore(EventSource): drop client-side fallback
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-21 09:14:35 -04:00
dependabot[bot] fafc55c039 chore(deps-dev): Bump cypress-split from 1.24.28 to 1.24.31
Bumps [cypress-split](https://github.com/bahmutov/cypress-split) from 1.24.28 to 1.24.31.
- [Release notes](https://github.com/bahmutov/cypress-split/releases)
- [Commits](https://github.com/bahmutov/cypress-split/compare/v1.24.28...v1.24.31)

---
updated-dependencies:
- dependency-name: cypress-split
  dependency-version: 1.24.31
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-21 02:09:35 +00:00
dependabot[bot] f5040be492 chore(deps-dev): Bump jsdom from 29.0.0 to 29.0.1
Bumps [jsdom](https://github.com/jsdom/jsdom) from 29.0.0 to 29.0.1.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Commits](https://github.com/jsdom/jsdom/compare/v29.0.0...v29.0.1)

---
updated-dependencies:
- dependency-name: jsdom
  dependency-version: 29.0.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-21 02:08:29 +00:00
dependabot[bot] ce009c4f95 chore(deps-dev): Bump stylelint from 17.4.0 to 17.5.0
Bumps [stylelint](https://github.com/stylelint/stylelint) from 17.4.0 to 17.5.0.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/17.4.0...17.5.0)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-version: 17.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-21 02:08:00 +00:00
dependabot[bot] c1251e0292 chore(deps-dev): Bump rector/rector in /vendor-bin/rector
Bumps [rector/rector](https://github.com/rectorphp/rector) from 2.3.8 to 2.3.9.
- [Release notes](https://github.com/rectorphp/rector/releases)
- [Commits](https://github.com/rectorphp/rector/compare/2.3.8...2.3.9)

---
updated-dependencies:
- dependency-name: rector/rector
  dependency-version: 2.3.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-21 02:03:39 +00:00
Nextcloud bot 753e6ee442 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-21 00:19:26 +00:00
github-actions[bot] df0f570802 Merge pull request #59111 from nextcloud/dependabot/npm_and_yarn/flatted-3.4.2
chore(deps-dev): Bump flatted from 3.3.3 to 3.4.2
2026-03-20 15:48:13 +01:00
github-actions[bot] c107cd4555 Merge pull request #59022 from nextcloud/dependabot/npm_and_yarn/fast-xml-parser-5.5.6
chore(deps): Bump fast-xml-parser from 5.4.1 to 5.5.6
2026-03-20 14:29:12 +01:00
Chandrika Mohan 38278d172f fix(settings): correctly detect Chrome on Android in devices & sessions
Signed-off-by: Chandrika Mohan <chandrikalov@gmail.com>

common logic to detect ua

Signed-off-by: Chandrika Mohan <chandrikalov@gmail.com>
2026-03-20 14:08:15 +01:00
dependabot[bot] 7df1d3683d chore(deps): Bump fast-xml-parser from 5.4.1 to 5.5.6
Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) from 5.4.1 to 5.5.6.
- [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases)
- [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.4.1...v5.5.6)

---
updated-dependencies:
- dependency-name: fast-xml-parser
  dependency-version: 5.5.6
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-20 13:04:29 +00:00
dependabot[bot] 4ac7bec175 chore(deps-dev): Bump flatted from 3.3.3 to 3.4.2
Bumps [flatted](https://github.com/WebReflection/flatted) from 3.3.3 to 3.4.2.
- [Commits](https://github.com/WebReflection/flatted/compare/v3.3.3...v3.4.2)

---
updated-dependencies:
- dependency-name: flatted
  dependency-version: 3.4.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-20 12:57:30 +00:00
github-actions[bot] 1493d30f14 Merge pull request #59093 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/fast-xml-parser-5.5.7
chore(deps): Bump fast-xml-parser from 5.5.6 to 5.5.7 in /build/frontend-legacy
2026-03-20 13:56:06 +01:00
nextcloud-command b59fcd4c32 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-20 10:53:13 +00:00
dependabot[bot] 9fee8d4dfe chore(deps): Bump fast-xml-parser in /build/frontend-legacy
Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) from 5.5.6 to 5.5.7.
- [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases)
- [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.6...v5.5.7)

---
updated-dependencies:
- dependency-name: fast-xml-parser
  dependency-version: 5.5.7
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-20 11:27:03 +01:00
Joas Schilling 7434af87c2 Merge pull request #59104 from nextcloud/automated/noid/master-update-ca-cert-bundle
[master] fix(security): Update CA certificate bundle
2026-03-20 07:44:11 +01:00
nextcloud-command 784a2adb87 fix(security): Update CA certificate bundle
Signed-off-by: GitHub <noreply@github.com>
2026-03-20 03:07:44 +00:00
Nextcloud bot d0c63a1753 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-20 00:19:49 +00:00
F. E Noel Nfebe 5e93c58795 Merge pull request #58226 from nextcloud/fix/password-state-management
fix(sharing): Prevent empty password when checkbox is enabled
2026-03-19 20:23:54 +01:00
Jonas 7cdbb38d52 Merge pull request #58834 from nextcloud/feat/translucent_selection_color
feat(theming): use translucent color for text selection
2026-03-19 18:41:28 +01:00
github-actions[bot] 28bb7305c0 Merge pull request #58767 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/marked-17.0.4
chore(deps): Bump marked from 17.0.3 to 17.0.4 in /build/frontend-legacy
2026-03-19 16:32:11 +01:00
nextcloud-command c5e9a1598a chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-19 15:31:30 +00:00
nfebe e7f8950d65 fix(sharing): Prevent generated password from overwriting user input
Signed-off-by: nfebe <fenn25.fn@gmail.com>
2026-03-19 15:39:35 +01:00
nfebe 0cb96fb77d fix(sharing): Prevent empty password when checkbox is enabled
Set passwordProtectedState explicitly when initializing shares with
default passwords. This ensures the checkbox state is tracked
independently of the password value, preventing it from unchecking
when the password field is cleared.

Also block saving new shares when password protection is enabled but
no password is entered, regardless of enforcement settings.

Added passWithNoTests to vitest configs to handle Vue 2/3 dual
frontend test runs gracefully.

Fixes: #57732, #57011
Signed-off-by: nfebe <fenn25.fn@gmail.com>
2026-03-19 15:39:35 +01:00
Marcel Klehr 9e7e32f0c7 Merge pull request #59015 from nextcloud/copilot/add-taskprocessing-worker-command
feat(taskprocessing): add worker command for synchronous task processing
2026-03-19 15:33:21 +01:00
Côme Chilliet 5c1b58c380 fix(oauth2): Do not store the code in throttle metadata
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-19 14:40:12 +01:00
David Dreschner 9e65c597fe Merge pull request #58897 from nextcloud/feat/add-shared-calendar-api
feat(CalDAV): Add function to get the token of a publicly shared calendar
2026-03-19 14:25:27 +01:00
nextcloud-command f4c6b26e7b chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-19 13:16:32 +00:00
dependabot[bot] e045bb9f2b chore(deps): Bump marked from 17.0.3 to 17.0.4 in /build/frontend-legacy
Bumps [marked](https://github.com/markedjs/marked) from 17.0.3 to 17.0.4.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Commits](https://github.com/markedjs/marked/compare/v17.0.3...v17.0.4)

---
updated-dependencies:
- dependency-name: marked
  dependency-version: 17.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-19 14:08:33 +01:00
David Dreschner 7c61e06b74 feat(CalDAV): Add function to get the token of a publicly shared calendar
Signed-off-by: David Dreschner <david.dreschner@nextcloud.com>
2026-03-19 13:55:39 +01:00
Ferdinand Thiessen e4ab89d5b2 Merge pull request #59065 from nextcloud/fix/noid/phpunit-deprecations
fix(phpunit): migrate from deprecated syntax for PHPUnit 11.1
2026-03-19 12:05:39 +01:00
Marcel Klehr a51d74407a fix: Apply suggestions from code review
Co-authored-by: Marcel Klehr <mklehr@gmx.net>
Signed-off-by: Marcel Klehr <mklehr@gmx.net>
2026-03-19 11:14:26 +01:00
Marcel Klehr ad5e709f7f chore: Address review comments
Signed-off-by: Marcel Klehr <mklehr@gmx.net>
2026-03-19 11:08:25 +01:00
copilot-swe-agent[bot] b1517d8938 test(taskprocessing): fix broken multi-type assertions and add starvation-prevention test
Co-authored-by: marcelklehr <986878+marcelklehr@users.noreply.github.com>
2026-03-19 11:08:25 +01:00
copilot-swe-agent[bot] 549b081f2f fix: Fix task type starvation: collect all eligible task types then pick the oldest task
Co-authored-by: marcelklehr <986878+marcelklehr@users.noreply.github.com>
2026-03-19 11:08:25 +01:00
copilot-swe-agent[bot] e46b967b53 fix: Fix task type starvation in WorkerCommand::processNextTask by shuffling providers
Co-authored-by: marcelklehr <986878+marcelklehr@users.noreply.github.com>
2026-03-19 11:08:25 +01:00
copilot-swe-agent[bot] de9852eca4 fix: Fix Task mock error: use real Task instances; run autoloaderchecker
Co-authored-by: marcelklehr <986878+marcelklehr@users.noreply.github.com>
2026-03-19 11:08:25 +01:00
copilot-swe-agent[bot] 9cc334312b feat(taskprocessing): Add --taskTypes whitelist option to taskprocessing:worker command
Co-authored-by: marcelklehr <986878+marcelklehr@users.noreply.github.com>
2026-03-19 11:08:25 +01:00
copilot-swe-agent[bot] 118ca6a94b feat(taskprocessing): Add worker command with tests and registration
Co-authored-by: marcelklehr <986878+marcelklehr@users.noreply.github.com>
2026-03-19 11:08:25 +01:00
Kate 95f22bc48d Merge pull request #59029 from nextcloud/fix/58913/bg-job-argument-type-text 2026-03-19 11:01:57 +01:00
John Molakvoæ 7cb4b4bbdb Merge pull request #54542 from nextcloud/54088-providePermissionsAndOwnerIdInPut 2026-03-19 10:59:10 +01:00
Maksim Sukharev 2c68e65e19 fix(phpunit): migrate from deprecated syntax for PHPUnit 11.1
Signed-off-by: Maksim Sukharev <antreesy.web@gmail.com>
2026-03-19 10:53:56 +01:00
John Molakvoæ 3d0234bb2e Merge branch 'master' into 54088-providePermissionsAndOwnerIdInPut
Signed-off-by: John Molakvoæ <skjnldsv@users.noreply.github.com>
2026-03-19 09:13:45 +01:00
github-actions[bot] e01440af96 Merge pull request #58920 from nextcloud/dependabot/npm_and_yarn/eslint-plugin-cypress-6.2.0
chore(deps-dev): Bump eslint-plugin-cypress from 6.1.0 to 6.2.0
2026-03-19 07:57:07 +00:00
github-actions[bot] b5d8a97128 Merge pull request #59023 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/fast-xml-parser-5.5.6
chore(deps): Bump fast-xml-parser from 5.4.1 to 5.5.6 in /build/frontend-legacy
2026-03-19 00:44:59 +00:00
Nextcloud bot 0af21b72ae fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-19 00:20:27 +00:00
nextcloud-command 7eedf9c713 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-19 00:38:47 +01:00
dependabot[bot] 85f9a593a4 chore(deps): Bump fast-xml-parser in /build/frontend-legacy
Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) from 5.4.1 to 5.5.6.
- [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases)
- [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.4.1...v5.5.6)

---
updated-dependencies:
- dependency-name: fast-xml-parser
  dependency-version: 5.5.6
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-19 00:38:47 +01:00
github-actions[bot] 97ceffcbb4 Merge pull request #58926 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/nextcloud/password-confirmation-6.0.3
chore(deps): Bump @nextcloud/password-confirmation from 6.0.2 to 6.0.3 in /build/frontend-legacy
2026-03-18 23:55:27 +01:00
nextcloud-command 43c8d2de30 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-18 21:55:03 +00:00
dependabot[bot] bf58238b5f chore(deps): Bump @nextcloud/password-confirmation
Bumps [@nextcloud/password-confirmation](https://github.com/nextcloud-libraries/nextcloud-password-confirmation) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/nextcloud-libraries/nextcloud-password-confirmation/releases)
- [Changelog](https://github.com/nextcloud-libraries/nextcloud-password-confirmation/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nextcloud-libraries/nextcloud-password-confirmation/compare/v6.0.2...6.0.3)

---
updated-dependencies:
- dependency-name: "@nextcloud/password-confirmation"
  dependency-version: 6.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-18 21:23:15 +00:00
dependabot[bot] 82ee720335 chore(deps-dev): Bump eslint-plugin-cypress from 6.1.0 to 6.2.0
Bumps [eslint-plugin-cypress](https://github.com/cypress-io/eslint-plugin-cypress) from 6.1.0 to 6.2.0.
- [Release notes](https://github.com/cypress-io/eslint-plugin-cypress/releases)
- [Commits](https://github.com/cypress-io/eslint-plugin-cypress/compare/v6.1.0...v6.2.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-cypress
  dependency-version: 6.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-18 21:22:34 +00:00
github-actions[bot] 7af11b4315 Merge pull request #58763 from nextcloud/dependabot/npm_and_yarn/zip.js/zip.js-2.8.23
chore(deps-dev): Bump @zip.js/zip.js from 2.8.21 to 2.8.23
2026-03-18 22:19:57 +01:00
github-actions[bot] f20789fb9d Merge pull request #58919 from nextcloud/dependabot/npm_and_yarn/vitest-17a571e09b
chore(deps-dev): Bump the vitest group across 2 directories with 3 updates
2026-03-18 21:06:02 +00:00
Maksim Sukharev 0c5feae8d0 chore: recompile autoload files
Signed-off-by: Maksim Sukharev <antreesy.web@gmail.com>
2026-03-18 15:50:38 +01:00
Maksim Sukharev f01ba2de0f fix(bg_jobs): store job argument as a text, increase length cap from 4000 to 32000
Signed-off-by: Maksim Sukharev <antreesy.web@gmail.com>
2026-03-18 15:50:38 +01:00
Ferdinand Thiessen 35606bc6bd Merge pull request #59033 from nextcloud/fix/files-external-issues
fix(files_external): properly handle API errors
2026-03-18 15:10:22 +01:00
Ferdinand Thiessen a24fc77bcf chore: compile assets
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-03-18 14:14:31 +01:00
Arthur Schiwon 3be8a652bc Merge pull request #59025 from nextcloud/perf/noid/ldap-displayname-from-db
fix(LDAP): use displayname from DB, before reaching out to LDAP
2026-03-18 13:51:56 +01:00
Ferdinand Thiessen 1688dff259 fix(files_external): properly handle API errors
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-03-18 12:13:50 +01:00
Arthur Schiwon badd759ff1 ci: update psalm baseline
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
2026-03-18 11:41:25 +01:00
Arthur Schiwon 0ace547307 fix(LDAP): do not use count() inside a loop
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
2026-03-18 11:34:35 +01:00
Arthur Schiwon 1c01895796 fix(LDAP): use displayname from DB, before reaching out to LDAP
As we do it with other information of the user, we now use the known value
of a users displayname, and leave the updating to the background job. This
improves performance of user facing actions where the display name is
required and reduces queries to the LDAP server that are typically more
expensive.

Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
2026-03-18 11:34:35 +01:00
Joas Schilling 44175e3cdb Merge pull request #58998 from nextcloud/bugfix/noid/dont-count-mentions-in-markdown-code
fix(comments): Correctly treat end of message as end of code block/in…
2026-03-18 10:35:29 +01:00
Benjamin Gaussorgues 1b504bf4ec Merge pull request #58863 from nextcloud/fix/annotation-attributes-fix 2026-03-18 08:46:31 +01:00
Ferdinand Thiessen 22976d20d5 Merge pull request #59008 from nextcloud/federated-sharing-check
fix: provide `canDownload` helper for shares and use it where appropriate
2026-03-17 22:57:14 +01:00
Anna 294e5397f3 Merge pull request #58975 from nextcloud/enh/42157/hid-warning
fix(initializeSession): only log HMAC problem to critical logs if indeed critical
2026-03-17 19:17:55 +01:00
Jonas db3ff20ce9 fix(theming): move text selection text color into variable
Signed-off-by: Jonas <jonas@freesources.org>
2026-03-17 19:06:41 +01:00
Jonas 3f27ba3aac feat(theming): use translucent color for text selection
Keeps old design with stronger constrast between background color and
background for high contrast themes.

Fixes: #55508

Signed-off-by: Jonas <jonas@freesources.org>
2026-03-17 19:05:56 +01:00
Jonas b96083862b Merge pull request #58830 from nextcloud/feat/color_mark_css_variable
feat(theming): add `--color-mark` CSS variable for highlighted text
2026-03-17 19:04:13 +01:00
Côme Chilliet fee637ca12 Merge pull request #59006 from nextcloud/fix/fix-ldap-renewpassword-parameters
fix: Add missing Attribute and fix parameter type in renewpassword route
2026-03-17 18:18:53 +01:00
Kate 2351df0172 Merge pull request #58960 from nextcloud/automated/noid/rector-changes 2026-03-17 18:07:29 +01:00
Jonas 39a0545c53 feat(theming): add --color-mark CSS variable for highlighted text
Required for nextcloud/text#8309

Signed-off-by: Jonas <jonas@freesources.org>
2026-03-17 18:04:21 +01:00
Ferdinand Thiessen df15699a31 Merge pull request #59004 from nextcloud/fix/mail_admin_check
fix(admin): use correct delegation class
2026-03-17 17:58:13 +01:00
Ferdinand Thiessen 7f8f86ab9a fix: use canDownload for permissions on federated shares
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-03-17 17:22:57 +01:00
Benjamin Gaussorgues a1c72a25c2 Merge pull request #58914 from nextcloud/chore/ncignore-tweaks 2026-03-17 17:02:22 +01:00
Ferdinand Thiessen 08495bfc0e feat(share): provide canDownload getter on the share
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-03-17 17:01:58 +01:00
Côme Chilliet 77b0d6cbbc fix: Add missing Attribute and fix parameter type in renewpassword route
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-17 16:58:34 +01:00
Benjamin Gaussorgues aaab13c7ca fix(admin): use correct delegation class
Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
2026-03-17 16:49:44 +01:00
Andy Scherzinger 3961a8be67 Merge pull request #59000 from nextcloud/bugfix/noid/enable-onetime-qrcode-for-34
feat(qrcode): Enable one-time QR codes by default for 34
2026-03-17 15:37:12 +01:00
Joas Schilling fe89541be3 fix(comments): Correctly treat end of message as end of code block/inline
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-03-17 15:34:47 +01:00
Joas Schilling 7e5a690a67 fix(qrcode): Enable one-time QR codes by default for 34
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-03-17 12:54:36 +01:00
Ferdinand Thiessen 5a1c233de9 Merge pull request #58611 from nextcloud/fix/files-snowflake
fix(files): correctly handle nodes with snowflake ids
2026-03-17 12:54:09 +01:00
Simon L. d3faa4247d fix(initializeSession): only log HMAC problem to critical logs if indeed critical
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-17 11:46:41 +01:00
Kate f6d2e6219a Merge pull request #58979 from nextcloud/chore/hide_avail_space 2026-03-17 11:41:59 +01:00
mostafa 3d6d38a2fb fix(group): pass previous display name in GroupChangedEvent
Signed-off-by: mostafa <mostafakhaki00@gmail.com>
2026-03-17 09:16:30 +00:00
Kate acbc10cc8c Merge pull request #58887 from nextcloud/fix/sharee-userid-config-key-inconsistency 2026-03-17 10:11:02 +01:00
Côme Chilliet b4f859b0ec Merge pull request #58870 from nextcloud/jtr/chore-root-htaccess-drop-noop-qsa
chore(.htaccess): 🧹 drop no-op QSA flag from RewriteRules
2026-03-17 10:07:41 +01:00
Jérôme Herbinet b964ca5394 feat(doc): activity_use_cached_mountpoints flag retroactivity notice
Signed-off-by: Jérôme Herbinet <33763786+Jerome-Herbinet@users.noreply.github.com>
2026-03-17 09:37:37 +01:00
Nextcloud bot 438f942081 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-17 00:19:33 +00:00
nextcloud-command 99a20afa8a chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-16 18:48:28 +00:00
Ferdinand Thiessen 6dfeeffe20 test(cypress): retry if failed on first try
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-03-16 19:39:51 +01:00
Ferdinand Thiessen 5830b0a0af fix(files): adjust files store for Snowflake IDs
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-03-16 19:39:37 +01:00
Ferdinand Thiessen 0787185967 fix(files): correctly handle nodes with snowflake ids
We introduced `id` instead of `fileid` to be always of type `string` to
allow snow flake ids. So we need to check the new attribute instead of
the legacy one.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-03-16 18:47:30 +01:00
Joas Schilling c826288435 Merge pull request #58974 from nextcloud/bugfix/noid/dont-count-mentions-in-markdown-code
fix(comments): Don't return mentions in markdown code (by default)
2026-03-16 15:33:43 +01:00
Benjamin Gaussorgues 24ce01d8f5 chore(quota): hide available space from error
Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
2026-03-16 14:49:11 +01:00
Joas Schilling 11959a1359 fix(comments): Don't return mentions in markdown code (by default)
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-03-16 11:49:07 +01:00
Joas Schilling b17d5180b2 Merge pull request #58959 from nextcloud/bugfix/spreed-16678/load-custom-app-order-earlier
fix(apporder): Load custom app order before resolving closures
2026-03-16 11:37:43 +01:00
Joas Schilling 46f61ca5e5 Merge pull request #58967 from nextcloud/bump/lognormalizer
build(deps): bump nextcloud/lognormalizer from 3.0.0 to 3.0.1
2026-03-16 10:12:25 +01:00
Joas Schilling f722f4648e build(deps): bump nextcloud/lognormalizer from 3.0.0 to 3.0.1
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-03-16 09:18:13 +01:00
Andy Scherzinger 91cfd7aded Merge pull request #58964 from nextcloud/automated/noid/-update-min-supported-desktop-version
chore: Update minimum supported desktop version to 3.1.81
2026-03-16 08:47:28 +01:00
Andy Scherzinger b865115cc8 Merge pull request #58966 from nextcloud/bugfix/noid/fix-SPDX-header
chore: Fix SPDX header
2026-03-16 08:47:04 +01:00
Joas Schilling 5f80f26799 chore: Fix SPDX header
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-03-16 08:38:16 +01:00
nextcloud-command bb4c9ecc0e chore: Update minimum supported desktop version
Signed-off-by: GitHub <noreply@github.com>
2026-03-16 00:46:58 +00:00
github-actions[bot] e48685600e Merge pull request #58483 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/nextcloud/paths-3.1.0
chore(deps): Bump @nextcloud/paths from 3.0.0 to 3.1.0 in /build/frontend-legacy
2026-03-16 00:37:53 +00:00
Ferdinand Thiessen cec23a0d83 test(cypress): clear state before user tests
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-03-16 01:22:45 +01:00
Nextcloud bot 1fdb54bdf5 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-16 00:20:15 +00:00
nextcloud-command 2dbd9dd381 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-15 23:52:06 +00:00
dependabot[bot] c968f1f3b3 chore(deps): Bump @nextcloud/paths from 3.0.0 to 3.1.0 in /build/frontend-legacy
Dependabot couldn't find the original pull request head commit, 7677d40c0b7896a45c8a5423e0851e4a4d0b4a10.
2026-03-15 23:49:49 +00:00
github-actions[bot] 7f6f29ea32 Merge pull request #58921 from nextcloud/dependabot/npm_and_yarn/nextcloud/password-confirmation-6.0.3
chore(deps): Bump @nextcloud/password-confirmation from 6.0.2 to 6.0.3
2026-03-15 20:53:37 +00:00
nextcloud-command 72cf9e01b6 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-15 18:43:59 +00:00
dependabot[bot] 93568366f4 chore(deps): Bump @nextcloud/password-confirmation from 6.0.2 to 6.0.3
Bumps [@nextcloud/password-confirmation](https://github.com/nextcloud-libraries/nextcloud-password-confirmation) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/nextcloud-libraries/nextcloud-password-confirmation/releases)
- [Changelog](https://github.com/nextcloud-libraries/nextcloud-password-confirmation/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nextcloud-libraries/nextcloud-password-confirmation/compare/v6.0.2...6.0.3)

---
updated-dependencies:
- dependency-name: "@nextcloud/password-confirmation"
  dependency-version: 6.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-15 18:29:46 +00:00
github-actions[bot] 8ec12f3446 Merge pull request #58958 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/nextcloud/vue-8.37.0
chore(deps): Bump @nextcloud/vue from 8.36.0 to 8.37.0 in /build/frontend-legacy
2026-03-15 18:04:14 +00:00
nextcloud-command c2ab8a3e8c chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-15 17:47:35 +00:00
nextcloud-command 5eec4fd69c refactor: Apply rector changes
Signed-off-by: GitHub <noreply@github.com>
2026-03-15 14:53:03 +00:00
Joas Schilling 58619b2a68 fix(apporder): Load custom app order before resolving closures
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-03-15 15:31:40 +01:00
dependabot[bot] 6791e95312 chore(deps): Bump @nextcloud/vue in /build/frontend-legacy
Bumps [@nextcloud/vue](https://github.com/nextcloud-libraries/nextcloud-vue) from 8.36.0 to 8.37.0.
- [Release notes](https://github.com/nextcloud-libraries/nextcloud-vue/releases)
- [Changelog](https://github.com/nextcloud-libraries/nextcloud-vue/blob/v8.37.0/CHANGELOG.md)
- [Commits](https://github.com/nextcloud-libraries/nextcloud-vue/compare/v8.36.0...v8.37.0)

---
updated-dependencies:
- dependency-name: "@nextcloud/vue"
  dependency-version: 8.37.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-15 14:26:23 +00:00
dependabot[bot] 649f333c89 chore(deps-dev): Bump the vitest group across 2 directories with 3 updates
Bumps the vitest group with 1 update in the / directory: [@vitest/coverage-istanbul](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-istanbul).
Bumps the vitest group with 2 updates in the /build/frontend-legacy directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) and [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8).


Updates `@vitest/coverage-istanbul` from 4.0.18 to 4.1.0
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.0/packages/coverage-istanbul)

Updates `vitest` from 4.0.18 to 4.1.0
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.0/packages/vitest)

Updates `vitest` from 4.0.18 to 4.1.0
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.0/packages/vitest)

Updates `@vitest/coverage-v8` from 4.0.18 to 4.1.0
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.0/packages/coverage-v8)

---
updated-dependencies:
- dependency-name: "@vitest/coverage-istanbul"
  dependency-version: 4.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: vitest
- dependency-name: vitest
  dependency-version: 4.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: vitest
- dependency-name: vitest
  dependency-version: 4.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: vitest
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 4.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: vitest
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-15 14:24:48 +00:00
github-actions[bot] 52801b995c Merge pull request #58953 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/libphonenumber-js-1.12.40
chore(deps): Bump libphonenumber-js from 1.12.38 to 1.12.40 in /build/frontend-legacy
2026-03-15 13:07:28 +00:00
github-actions[bot] 8e6ce46485 Merge pull request #58952 from nextcloud/dependabot/npm_and_yarn/jsdom-29.0.0
chore(deps-dev): Bump jsdom from 28.1.0 to 29.0.0
2026-03-15 13:50:54 +01:00
nextcloud-command 2997b0a53c chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-15 12:15:38 +00:00
Andy Scherzinger 529b30eb04 Merge pull request #58922 from nextcloud/dependabot/npm_and_yarn/cypress-15.12.0
chore(deps-dev): Bump cypress from 15.11.0 to 15.12.0
2026-03-15 13:09:45 +01:00
dependabot[bot] 1e40bd0d33 chore(deps): Bump libphonenumber-js in /build/frontend-legacy
Bumps [libphonenumber-js](https://gitlab.com/catamphetamine/libphonenumber-js) from 1.12.38 to 1.12.40.
- [Changelog](https://gitlab.com/catamphetamine/libphonenumber-js/blob/master/CHANGELOG.md)
- [Commits](https://gitlab.com/catamphetamine/libphonenumber-js/compare/v1.12.38...v1.12.40)

---
updated-dependencies:
- dependency-name: libphonenumber-js
  dependency-version: 1.12.40
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-15 11:10:26 +00:00
dependabot[bot] e961190912 chore(deps-dev): Bump jsdom from 28.1.0 to 29.0.0
Bumps [jsdom](https://github.com/jsdom/jsdom) from 28.1.0 to 29.0.0.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Changelog](https://github.com/jsdom/jsdom/blob/main/Changelog.md)
- [Commits](https://github.com/jsdom/jsdom/compare/v28.1.0...v29.0.0)

---
updated-dependencies:
- dependency-name: jsdom
  dependency-version: 29.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-15 11:10:04 +00:00
github-actions[bot] 4da2a1e2e1 Merge pull request #58775 from nextcloud/dependabot/npm_and_yarn/dompurify-3.3.2
chore(deps): Bump dompurify from 3.3.1 to 3.3.3
2026-03-15 06:16:57 +00:00
Nextcloud bot a10204b11b fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-15 00:19:16 +00:00
nextcloud-command fceece9ba8 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-15 00:07:47 +00:00
dependabot[bot] a2144ab2f2 chore(deps): Bump dompurify from 3.3.1 to 3.3.2
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.3.1 to 3.3.2.
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](https://github.com/cure53/DOMPurify/compare/3.3.1...3.3.2)

---
updated-dependencies:
- dependency-name: dompurify
  dependency-version: 3.3.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-14 23:49:35 +00:00
Andy Scherzinger 3130722a21 Merge pull request #58924 from nextcloud/dependabot/npm_and_yarn/vue-3.5.30
chore(deps): Bump vue from 3.5.29 to 3.5.30
2026-03-14 15:18:25 +01:00
nextcloud-command e1171b0e61 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-14 13:31:18 +00:00
dependabot[bot] db4a46da09 chore(deps): Bump vue from 3.5.29 to 3.5.30
Bumps [vue](https://github.com/vuejs/core) from 3.5.29 to 3.5.30.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/compare/v3.5.29...v3.5.30)

---
updated-dependencies:
- dependency-name: vue
  dependency-version: 3.5.30
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-14 13:21:25 +00:00
github-actions[bot] 168259039e Merge pull request #58923 from nextcloud/dependabot/npm_and_yarn/sass-1.98.0
chore(deps-dev): Bump sass from 1.97.3 to 1.98.0
2026-03-14 13:47:46 +01:00
github-actions[bot] 76e4788ec1 Merge pull request #58944 from nextcloud/dependabot/npm_and_yarn/multi-7f7c85af6b
chore(deps): Bump undici
2026-03-14 13:47:01 +01:00
dependabot[bot] 53069c770d chore(deps): Bump undici
Bumps  and [undici](https://github.com/nodejs/undici). These dependencies needed to be updated together.

Updates `undici` from 7.21.0 to 7.24.2
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v7.21.0...v7.24.2)

Updates `undici` from 6.23.0 to 6.24.1
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v7.21.0...v7.24.2)

---
updated-dependencies:
- dependency-name: undici
  dependency-version: 7.24.2
  dependency-type: indirect
- dependency-name: undici
  dependency-version: 6.24.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-14 08:45:38 +00:00
github-actions[bot] 8e603a30ea Merge pull request #58925 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/sass-1.98.0
chore(deps-dev): Bump sass from 1.97.3 to 1.98.0 in /build/frontend-legacy
2026-03-14 09:44:24 +01:00
dependabot[bot] f27cc2842a chore(deps-dev): Bump sass in /build/frontend-legacy
Bumps [sass](https://github.com/sass/dart-sass) from 1.97.3 to 1.98.0.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.97.3...1.98.0)

---
updated-dependencies:
- dependency-name: sass
  dependency-version: 1.98.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-14 02:06:25 +00:00
dependabot[bot] 9cb220983a chore(deps-dev): Bump sass from 1.97.3 to 1.98.0
Bumps [sass](https://github.com/sass/dart-sass) from 1.97.3 to 1.98.0.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.97.3...1.98.0)

---
updated-dependencies:
- dependency-name: sass
  dependency-version: 1.98.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-14 02:05:32 +00:00
dependabot[bot] 44c8dae987 chore(deps-dev): Bump cypress from 15.11.0 to 15.12.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 15.11.0 to 15.12.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Changelog](https://github.com/cypress-io/cypress/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/cypress-io/cypress/compare/v15.11.0...v15.12.0)

---
updated-dependencies:
- dependency-name: cypress
  dependency-version: 15.12.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-14 02:05:18 +00:00
Nextcloud bot 38f79c031d fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-14 00:19:08 +00:00
Côme Chilliet cc99dd8fd9 fix: Fix user in Tags class, do not depend upon session
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-13 15:13:40 +01:00
Benjamin Gaussorgues 232192c59c chore(build): update list of ignored files
Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
2026-03-13 13:10:07 +01:00
Daniel 98583d7ceb Merge pull request #58201 from nextcloud/fix/remove-deprecated-rfc7231-constant
fix: Remove deprecated RFC7231 constant to avoid warnings on PHP 8.5
2026-03-13 11:34:51 +01:00
David Dreschner 2bb9524c84 fix: Remove deprecated RFC7231 constant to avoid warnings on PHP 8.5
Signed-off-by: David Dreschner <david.dreschner@nextcloud.com>
2026-03-13 10:43:38 +01:00
Sebastian Krupinski 201a97a4ed Merge pull request #57112 from nextcloud/feat/improve-calendar-migrator
feat: improve calendar migrator
2026-03-13 05:30:54 -04:00
Nextcloud bot 551973cb3e fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-13 00:20:20 +00:00
Anna Larch a77040f41e chore(workflows): remove cypress cloud
and allow regular cypress tests to run on forks (no secret leaked)
add consistent gating
 for changes
remove empty matrix option
skip performance workflow on forks without it looking like it's failing

Signed-off-by: Anna Larch <anna@nextcloud.com>
2026-03-12 20:26:51 +01:00
SebastianKrupinski f4feec424c feat: improve calendar migrator
Signed-off-by: SebastianKrupinski <krupinskis05@gmail.com>
2026-03-12 12:43:15 -04:00
Louis 56dcfc4b86 Merge pull request #45036 from iLinaza/fix/45034-clear-cached-user-groups-on-pre-hooks
fix(usergroups): clear cached user groups on pre hooks
2026-03-12 16:03:44 +01:00
Benjamin Gaussorgues 7a96dbc20c Merge pull request #58875 from nextcloud/chore/update-ignred-files 2026-03-12 15:35:49 +01:00
nfebe 25e7dd799e fix(sharing): Align userid config key in UserPlugin with Manager
UserPlugin reads `shareapi_restrict_user_enumeration_full_match_userid`
(no underscore) while Manager.php and the frontend both use
`shareapi_restrict_user_enumeration_full_match_user_id` (with underscore).

This mismatch causes the "disable exact match by user ID" admin setting
to have no effect on actual sharee search results.

Signed-off-by: nfebe <fenn25.fn@gmail.com>
2026-03-12 13:19:09 +01:00
Benjamin Gaussorgues 8c6d314b0e Merge pull request #58798 from AIlkiv/fix-UserMountCache-for-postgresql 2026-03-12 12:11:29 +01:00
Kate ddf79066b9 Merge pull request #58689 from nextcloud/fix/federated-reshare 2026-03-12 12:01:24 +01:00
Sebastian Krupinski ed3a230403 Merge pull request #58679 from nextcloud/feat/add-default-reminder-setting-caldav
feat: add default reminder setting caldav
2026-03-12 06:26:12 -04:00
provokateurin 5dbbe2ccf9 fix(dav): Use share initiator to get the share node, because the owner might on another server
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-03-12 10:31:25 +01:00
provokateurin 045ad43237 fix(federatedfilesharing): Do not set the share id for an existing share
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-03-12 10:31:25 +01:00
Carl Schwan 83956e9f04 Merge pull request #58854 from nextcloud/jtr/refactor-View-getLocalFile
refactor(view): `getLocalFile` path handling
2026-03-12 10:05:19 +01:00
Kate c8380b1b62 Merge pull request #58869 from nextcloud/fix/pwd-confirmation 2026-03-12 09:54:15 +01:00
Nextcloud bot 5ff62d5baf fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-12 00:19:26 +00:00
Josh eb5a9085ee Merge pull request #58855 from nextcloud/jtr/test-drop-testTouchFloat
tests - Fix `Implicit conversion from float 500.5 to int loses precision` in ViewTest
2026-03-11 15:07:57 -04:00
Benjamin Gaussorgues 3904da98e6 Merge pull request #58864 from nextcloud/fix/cached_exporter_hardening 2026-03-11 18:30:22 +01:00
Benjamin Gaussorgues e07be2b189 chore(buuld): update list of ignored files
Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
2026-03-11 17:50:11 +01:00
Grigory Vodyanov e3c2920c18 feat: add default reminder setting caldav
Signed-off-by: Grigory Vodyanov <scratchx@gmx.com>
2026-03-11 12:45:04 -04:00
John Molakvoæ (skjnldsv) 5fdebf923c fix(lib): templates core path detection
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
2026-03-11 17:24:11 +01:00
Côme Chilliet 9b54383532 Merge pull request #58835 from nextcloud/chore/fix-merge-leftover
Remove leftover useless path assignements in View
2026-03-11 16:52:55 +01:00
Côme Chilliet e03d825062 chore: Update psalm baseline
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-11 16:23:21 +01:00
Josh 7dfcf5afad chore(.htaccess): drop no-op QSA flag from RewriteRules
- For Apache `RewriteRule`, if the substitution (right side) has no `?` query part, the original query string is already preserved by default.
- So `QSA` adds nothing in these rules.

Note for the future: QSA will be needed if we ever add a query string on the right (substitution) side. We don't currently so this is just noise in the htaccess rules.

Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-11 10:57:53 -04:00
Joas Schilling 78cfe3742a Merge pull request #58853 from nextcloud/bugfix/noid/remove-wildcard-csp
fix(videoverification): Remove CSP wildcard for video verification
2026-03-11 15:25:59 +01:00
Ferdinand Thiessen 9b54b06de5 fix(SecurityMiddleware): return header to distinguish error type
Currently we return a 403 (Forbidden) when the password confirmation
failed - which itself seems to be inappropriate as its basically a login
failing so a 401 (not authorized) is more appropriate.

This is especially a problem because APIs might return 403 internally
for good reason (e.g. user missing permission) but 401 would not be a
problem.

But as this is a breaking change so my solution to be able to
distinguish API error from password confirmation error is:

Add a header inside the response that marks failed password confirmation
`X-NC-Auth-NotConfirmed`.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-03-11 15:11:29 +01:00
Côme Chilliet 504dc5142e chore: Un-deprecate IControllerMethodReflector as it’s now useful for attributes as well
It should be extended later to add methods to get attributes from
 reflection, and maybe a getter to the reflectionMethod object to avoid
 middlewares building their own.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-11 14:43:50 +01:00
Côme Chilliet d68face43f chore: Move away from deprecated method in TwoFactorMiddleware
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-11 14:39:40 +01:00
Côme Chilliet 91334643dc fix(tests): Adapt Middleware tests to API change
Removed a few tests rendered obsolete by the refactoring.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-11 14:27:45 +01:00
Benjamin Gaussorgues 509784cff2 chore(metrics): harden Cached exporter
Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
2026-03-11 13:01:21 +01:00
Hamza f0f38fd04c Merge pull request #58862 from nextcloud/fix/add-note-example-contact
fix:(dav): add note to example contact
2026-03-11 12:19:41 +01:00
Côme Chilliet 447ee17759 fix: Remove code duplication by using the new method
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-11 11:36:01 +01:00
Côme Chilliet bd343a6e9e fix: Fix AuthorizedAdminSetting attribute behavior
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-11 11:25:31 +01:00
Hamza 9f5c3e39a7 fix:(dav): add note to example contact
Signed-off-by: Hamza <hamzamahjoubi221@gmail.com>
2026-03-11 11:21:37 +01:00
Côme Chilliet 520878338f fix: Move hasAnnotationOrAttribute to the reflector
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-11 11:16:26 +01:00
Joas Schilling a304a54775 Merge pull request #58836 from nextcloud/feat/noid/unify-generated-by-ai-tag-handling
feat(systemtags): Add methods to directly do "Generated by AI" tag
2026-03-11 10:02:20 +01:00
Josh 8895970019 test(ViewTest): disable Nextcloud not PHP - drop testTouchFloat()
Our interface contract (and implementations) in IStorage are:
`public function touch(string $path, ?int $mtime = null): bool {`

This wasn't always the case but it is today, so testTouchFloat() no longer makes sense; it's not testing our code, just PHP.

Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-10 22:12:42 -04:00
Josh 0a7420d0a4 chore(View): fixup for php-cs
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-10 21:40:44 -04:00
Nextcloud bot 1a70d192f3 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-11 00:26:43 +00:00
Josh 14e837ce11 refactor(View): add typing to getAbsolutePath and clarify contract
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-10 19:42:16 -04:00
Josh af78da59bc refactor(View): improve readability of getLocalFile and resolvePath
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-10 19:21:47 -04:00
Joas Schilling dc529fa86d fix(videoverification): Remove CSP wildcard for video verification
spreed does it via AddContentSecurityPolicyEvent event by now

Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-03-10 22:35:43 +01:00
Côme Chilliet a119716a7d Merge pull request #58826 from nextcloud/carl/code-cleaning-storage-cache
refactor(cache-storage): Make Storage and StorageGlobal psalm strict
2026-03-10 22:01:43 +01:00
Kate 44ec45e941 Merge pull request #58841 from nextcloud/chore/deps/haze-2.2.0 2026-03-10 19:22:20 +01:00
Robin Appelman 38a42d9ad4 Merge pull request #53733 from nextcloud/copy-all-permissions
fix: give target file all permissions on copy
2026-03-10 18:09:33 +01:00
provokateurin aa65c7598e chore(deps): Update haze to 2.2.0
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-03-10 16:25:56 +01:00
Robin Appelman cf124e7c75 fix: make objectstore copy consistent with changed local storage behavior
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-03-10 16:07:38 +01:00
Raphael Gradenwitz 3e78bf662d Merge pull request #58648 from nextcloud/feat/add-files-sharing-raw-to-rootUrlApps
feat(routing): add files_sharing_raw to rootUrlApps
2026-03-10 15:31:02 +01:00
Carl Schwan 783e2ac625 refactor(external-storage-services): Modernize code
Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-03-10 15:27:46 +01:00
Robin Appelman 7dccf5f257 fix: give target file all permissions on copy
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-03-10 15:27:35 +01:00
Joas Schilling 1425df49d0 feat(systemtags): Add methods to directly do "Generated by AI" tag
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-03-10 15:19:30 +01:00
Côme Chilliet b0240a43af chore: Remove other useless assignment of 'path' key for FileInfo
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-10 15:12:06 +01:00
Côme Chilliet 347d786a14 chore: Remove useless assignement
Because of the order we merged PRs, this line was not removed while the
 value is not used anymore, let’s cleanup.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-10 15:09:54 +01:00
Côme Chilliet 8417db5df8 Merge pull request #58687 from nextcloud/carl/webhook-typo
fix(webhook_listeners): Fix typo in comment
2026-03-10 15:07:57 +01:00
Kate 810caa3e4a Merge pull request #58593 from nextcloud/carl/share-spring-cleaning 2026-03-10 15:01:50 +01:00
Côme Chilliet c98244a79e Merge pull request #58827 from nextcloud/fix/fix-fileinfo-path
fix(files): Fix FileInfo['path'] situation
2026-03-10 15:01:17 +01:00
Côme Chilliet 17ef1dbec9 Merge pull request #58808 from nextcloud/carl/remove-many-get-server
refactor: remove long deprecated IServerContainer methods
2026-03-10 15:00:48 +01:00
Carl Schwan eb5c6acf13 fix(webhook_listeners): Fix typo in comment
Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-03-10 14:39:30 +01:00
Carl Schwan 140bfa2d1f refactor(cache-storage): Make Storage and StorageGlobal psalm strict
Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-03-10 14:20:31 +01:00
Côme Chilliet 082664c0c2 chore: Run rector on integration bootstrap code
This avoids integration PHP code to use deprecated method and crash when
 we remove them.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-10 14:15:30 +01:00
Côme Chilliet 397454ff4a fix: Adapt ViewTest to ['path'] being absolute
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-10 12:34:50 +01:00
Côme Chilliet 842b3f9e0a fix(files): Fix FileInfo['path'] situation
Previously $fileInfo->getPath() and $fileInfo['path'] would return
 different things. The [] version was not consistent, being sometimes
 relative and sometimes kind of absolute, and sometimes plenty wrong
 (like when used from occ commands, because there is no user in
 session).
So this is always returning absolute now.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-10 11:56:31 +01:00
Carl Schwan 7fa44717e0 refactor(share): Remove some deprecated method usages
Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-03-10 11:39:57 +01:00
Carl Schwan 39c14c383b refactor: remove long deprecated IServerContainer methods
Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-03-10 10:36:35 +01:00
Carl Schwan af94028bdb refactor: Remove old Share backend
This has been implicitely deprecated for a while with Share20 containing
the new implementation.

The only use was to determine whether remote sharing was enabled or not,
which we can do much more easily.

Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-03-10 10:09:40 +01:00
Nextcloud bot 6f1fc07868 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-10 00:19:19 +00:00
Kate 27c438503b Merge pull request #58817 from nextcloud/fix/noid/add-fallback-to-raw-path-info 2026-03-09 23:21:13 +01:00
Kate 7ae8aebab3 Merge pull request #58724 from nextcloud/fix/respect-skipping-certificate-verify
fix(files_sharing): respect config to skip certificate verification
2026-03-09 23:08:34 +01:00
Anna Larch cbe8e4d90f fix: add fallback to raw path info
Follow up to https://github.com/nextcloud/server/pull/56843

The raw path info method has no fallback for an empty array parameter

Signed-off-by: Anna Larch <anna@nextcloud.com>
2026-03-09 22:22:08 +01:00
Salvatore Martire 8b235c8f49 fix(files_sharing): respect config to skip certificate verification
This is important especially for local development, as certificate are
self-signed.

Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2026-03-09 18:21:15 +01:00
Daniel 92cf64f798 Merge pull request #58793 from nextcloud/validatePreviewMimeType
fix(preview): Validate preview MIME type
2026-03-09 17:20:00 +01:00
Kate 938b9ba0ac Merge pull request #58800 from nextcloud/ci/rector-apply/ignore-composer-changes 2026-03-09 16:22:37 +01:00
Andy Scherzinger 56eaf1dbcc Merge pull request #58603 from pymnh/feat/extend-group-search-to-teams
feat(UserPlugin): Include teams in group search
2026-03-09 15:17:41 +01:00
Peymaneh 3985555753 feat(UserPlugin): Include teams in group search
Signed-off-by: Peymaneh <peymaneh@posteo.net>
2026-03-09 13:51:27 +01:00
provokateurin fe612bb4dd ci(rector-apply): Ignore composer changes
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-03-09 11:28:15 +01:00
ailkiv e958fa0113 fix: PostgreSQL transaction aborts when caching user mounts
Signed-off-by: ailkiv <a.ilkiv.ye@gmail.com>
2026-03-09 10:02:40 +00:00
Carl Schwan 2613f3274b Merge pull request #58790 from nextcloud/chore/remove-oc-app-get-current-app
fix: Deprecate OC_App::getCurrentApp and remove its only use
2026-03-09 10:20:08 +01:00
Anna 715d776649 Merge pull request #58229 from nextcloud/fix/noid/improve-preview-scan-performance
perf(preview): bulk process preview regeneration
2026-03-09 09:05:02 +00:00
Nextcloud bot 15591054ac fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-09 00:19:53 +00:00
Git'Fellow 304c9fbc3b fix(preview): Validate preview MIME type
Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com>
2026-03-08 18:57:18 +01:00
Côme Chilliet b878678562 chore: Adapt tests to TemplateLayout constructor changes
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-08 17:57:44 +01:00
Côme Chilliet 521bb9432e fix: Deprecate OC_App::getCurrentApp and remove its only use
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-08 17:00:44 +01:00
Côme Chilliet 6fce5aa3ea Merge pull request #58474 from nextcloud/jtr/chore-drop-OC-JSON
chore: drop OC_JSON
2026-03-08 16:51:12 +01:00
Anna Larch e3c6702cd8 perf(preview): bulk process preview regeneration
Signed-off-by: Anna Larch <anna@nextcloud.com>
2026-03-08 11:09:37 +01:00
Nextcloud bot 9cd3177bb4 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-08 00:19:13 +00:00
Benjamin Frueh 4b203e5f7b fix: only skip template initialization when both skeletondirectory and templatedirectory are empty
Signed-off-by: Benjamin Frueh <benjamin.frueh@gmail.com>
2026-03-08 00:12:56 +01:00
dependabot[bot] 629740d935 chore(deps-dev): Bump @zip.js/zip.js from 2.8.21 to 2.8.23
Bumps [@zip.js/zip.js](https://github.com/gildas-lormeau/zip.js) from 2.8.21 to 2.8.23.
- [Release notes](https://github.com/gildas-lormeau/zip.js/releases)
- [Commits](https://github.com/gildas-lormeau/zip.js/compare/v2.8.21...v2.8.23)

---
updated-dependencies:
- dependency-name: "@zip.js/zip.js"
  dependency-version: 2.8.23
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-07 02:05:10 +00:00
Nextcloud bot 6a29ea172b fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-07 00:19:22 +00:00
Carl Schwan ed1b0dcd5e Merge pull request #58725 from nextcloud/jtr/docs-config-mount-file-drop
docs(config): drop legacy `mount_file` option
2026-03-06 14:07:44 +01:00
Carl Schwan bd8aff39f2 Merge branch 'master' into jtr/docs-config-mount-file-drop
Signed-off-by: Carl Schwan <carl@carlschwan.eu>
2026-03-06 13:39:08 +01:00
Nextcloud bot fc354f46bb fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-06 00:20:14 +00:00
Côme Chilliet 7b305fbe22 Merge pull request #58705 from nextcloud/local-custom-cache-prefix
feat: Add memcache_customprefix
2026-03-05 16:05:14 +01:00
Côme Chilliet 8aedcb4a82 Merge pull request #58652 from nextcloud/automated/noid/rector-changes
Apply rector changes
2026-03-05 16:03:50 +01:00
Côme Chilliet 842f3a44cb Merge branch 'master' into fix/45034-clear-cached-user-groups-on-pre-hooks
Signed-off-by: Côme Chilliet <91878298+come-nc@users.noreply.github.com>
2026-03-05 16:00:17 +01:00
Carl Schwan 01fa73831f Merge pull request #58728 from nextcloud/jtr/docs-config-part-file-in-storage-non-chunking
docs(config): `part_file_in_storage` only applies to non-chunked
2026-03-05 15:28:12 +01:00
Robin Appelman b40d230218 Merge pull request #58723 from nextcloud/jtr/docs-config-fs-cache-RO
docs(config): improve `filesystem_cache_readonly` docs
2026-03-05 14:29:08 +01:00
Ferdinand Thiessen 5d84d79c4b Merge pull request #58550 from nextcloud/dav-open-size-not-found
handle case where we can't get the filesize after open in dav get
2026-03-05 13:24:52 +01:00
Robin Appelman 26ba3cac9c fix: handle case where we can't get the filesize after open in dav get
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-03-05 11:35:52 +01:00
Joas Schilling 85b0dcca27 Merge pull request #58664 from nextcloud/bugfix/noid/workflowengine-fix-checks-list
fix(workflowengine): Fix list of checks being a list instead of array…
2026-03-05 10:49:46 +01:00
Kate 687d82843f Merge pull request #58727 from nextcloud/mounts-cache-duplicate-rootid 2026-03-05 09:46:34 +01:00
Nextcloud bot 4da21d78d0 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-05 00:19:23 +00:00
Sebastian Krupinski 142ddaf146 Merge pull request #58697 from nextcloud/feat/add-calendar-name-to-search-result
feat: add calendar name to search entries
2026-03-04 14:11:54 -05:00
Josh f3ceded754 docs(config): clarify part_file_in_storage only applies to non-chunked
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-04 12:47:25 -05:00
Robin Appelman 9884dec646 fix: fix updating cached mounts with multiple entries for root id
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-03-04 18:43:55 +01:00
Robin Appelman d14c4082e1 test: add test for updating cached mounts with multiple entries for root id
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-03-04 18:43:35 +01:00
Josh 052d62b83c docs(config): make cs happy fixup
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-04 11:41:36 -05:00
Josh ceb1b7e767 docs(config): drop legacy mount_file option
All logic that used this was completely removed as of #30991

Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-04 11:37:18 -05:00
Josh 2faa5e894b docs(config): improve filesystem_cache_readonly docs
- Add more extensive explanation
- Explain interaction/relation to more commonly used option: `filesystem_check_changes`
- Add warning

Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-04 10:22:11 -05:00
SebastianKrupinski 277a35ee23 feat: add calendar name to search entries
Signed-off-by: SebastianKrupinski <krupinskis05@gmail.com>
2026-03-04 08:44:09 -05:00
Raphael Gradenwitz 44e733bae9 Merge branch 'master' into feat/add-files-sharing-raw-to-rootUrlApps 2026-03-04 12:24:34 +01:00
Kate c29c7023d9 Merge pull request #58204 from nextcloud/bug/noid/remove-external-shares-from-share-list 2026-03-04 07:41:25 +01:00
Nextcloud bot f43a4c62d6 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-04 00:19:34 +00:00
Martin 2a2f42e781 feat: Add memcache_customprefix
Signed-off-by: Martin <31348196+Earl0fPudding@users.noreply.github.com>
2026-03-04 00:19:19 +01:00
Daniel 35ef9b078a Merge pull request #57667 from nextcloud/bug/noid/avoid-error-when-updating-share
fix(sharing): do not notify remote if owner and sharee are local users
2026-03-04 00:03:21 +01:00
Daniel Kesselberg c63eb85966 chore: compile assets
Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
2026-03-03 23:45:51 +01:00
Daniel Kesselberg 5c19d5eb26 fix(sharing): remove external shares from view on delete
Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
2026-03-03 23:43:37 +01:00
Daniel Kesselberg da7250f05d fix(sharing): do not notify remote if owner and sharee are local users
If both the owner and the sharee are local users, no remote notification is required.
If either the owner or the sharee is not a local user, the change must be propagated.

Based on https://github.com/owncloud/core/pull/37534

Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
Co-authored-by: Victor Dubiniuk <victor.dubiniuk@gmail.com>
2026-03-03 23:08:52 +01:00
Anna 9afbad3865 Merge pull request #58699 from nextcloud/fix/noid/dav-capabilities-psalm-return-type
fix(dav): add missing search_supports_creation_time and search_supports_upload_time to Capabilities return type
2026-03-03 20:48:29 +01:00
Cristian Scheid 80184b4d25 fix(dav): add missing search_supports_creation_time and search_supports_upload_time to Capabilities return type
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-03-03 15:01:12 -03:00
Stephan Orbaugh 074df09caf Merge pull request #58680 from nextcloud/fix/drop-files
fix(files): properly handle dropping files
2026-03-03 18:09:54 +01:00
nextcloud-command 7dba462eec chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-03 15:51:07 +00:00
Ferdinand Thiessen 0e0af702ac fix(files): properly handle dropping files
- resolves https://github.com/nextcloud/server/issues/58454

use upload library for dropped files instead of custom logic

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-03-03 15:46:36 +00:00
Stephan Orbaugh f6c79c0d33 Merge pull request #58562 from nextcloud/feat/1699/recent-files-mark-recently-created
feat: set creation_time on file creation and render recently created icon
2026-03-03 16:08:07 +01:00
Ferdinand Thiessen 2909821cb2 Merge pull request #58685 from nextcloud/fix/files-external-inital
fix(files_external): set default values for new configurations
2026-03-03 15:53:01 +01:00
nextcloud-command 3542dbf9a1 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-03 14:13:13 +00:00
Ferdinand Thiessen cae14d356b fix(files_external): set default values for new configurations
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-03-03 15:05:17 +01:00
nextcloud-command 3836eb6b0d chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-03 13:05:15 +00:00
Cristian Scheid 3458d3150b refactor(recent-search): use d:creationdate instead of c:creation_time and crtime instead of attributes.upload_time
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-03-03 09:43:21 -03:00
Cristian Scheid 03f93d97e9 refactor(recently-created-icon): use mdi/js path instead of raw svg prop setup() instead of data()
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-03-03 09:42:26 -03:00
Cristian Scheid 3a21ad408b feat(dav): expose search_supports_creation_time and search_supports_upload_time capabilities
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-03-03 09:42:26 -03:00
Cristian Scheid 7f89490cef feat: set creation_time on file creation and render recently created icon
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-03-03 09:41:22 -03:00
Joas Schilling 34484b591a Merge pull request #58678 from nextcloud/fix/noid/set-lexicon-strictness-to-ignore
fix: Set files app lexicon strictness to IGNORE
2026-03-03 07:44:13 +01:00
Ferdinand Thiessen fa2660a9d7 Merge pull request #58616 from nextcloud/fix/external-shares
fix(files_sharing): allow strict validation of shares
2026-03-03 02:26:45 +01:00
Nextcloud bot 4d58563991 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-03 00:19:33 +00:00
Marcel Müller d039cb92f9 fix: Set files app lexicon strictness to IGNORE
Signed-off-by: Marcel Müller <marcel-mueller@gmx.de>
2026-03-02 22:06:49 +01:00
nextcloud-command 128137dc06 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-03-02 17:52:41 +00:00
Ferdinand Thiessen 882d8324e8 fix(files_sharing): allow strict validation of shares
API response sometimes includes `null` for unset, but unset
(`undefined`) is something different than `null`.
So if `null` is passed we mean `undefined` instead.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-03-02 18:31:46 +01:00
Carl Schwan 5fa368c41c Merge pull request #57100 from nextcloud/fix/remove-iservercontainer-from-user-ldap
fix(user_ldap): Remove usages of deprecated IServerContainer
2026-03-02 17:38:52 +01:00
Andy Scherzinger 0e6c8ec73f Merge pull request #58660 from nextcloud/fix/chunked-uploads-on-shared-folders
fix: check source and target when emitting copy event
2026-03-02 16:50:33 +01:00
Côme Chilliet 279d5c226e chore(user_ldap): Adapt code to LDAP constructor change, remove dead code
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-03-02 16:34:04 +01:00
Carl Schwan 52e8de9482 Merge pull request #58643 from nextcloud/jtr/ci-fix-performance-profiler-branch
ci(performance): fix Unexpected input warning for profiler-branch
2026-03-02 16:17:22 +01:00
Sebastian Krupinski 95e3dba34c Merge pull request #58526 from nextcloud/fix/icon-ratio
fix(theming): Fix favicon and touchicon ratios
2026-03-02 09:04:57 -05:00
Ferdinand Thiessen 3b53e9aeca Merge pull request #58615 from nextcloud/jtr/fix-s3-normalizePath-falsy
fix(s3): prevent "0" path from being treated as root
2026-03-02 14:36:04 +01:00
Simon L. 987a52b87f Merge pull request #58657 from nextcloud/enh/noid/auto-label-reports
feat: add workflow that auto-labels bug reports based on entered content
2026-03-02 14:19:11 +01:00
Joas Schilling 1bc0bd7611 fix(workflowengine): Fix list of checks being a list instead of array<int, …>
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-03-02 14:17:51 +01:00
Josh 2d39c5a179 test(Storage): avoid falsy directory/filename checks (for now)
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-02 13:44:20 +01:00
Josh 6c1d648f59 chore: fixup/ revert cast in S3ObjectTrait
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-02 13:44:20 +01:00
Josh d5d34adcbb fix(S3ObjectTrait): cast $urn to a string until typing adding elsewhere
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-02 13:44:20 +01:00
Josh ace9eb21e6 test(Storage): expand file / directory name tests
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-02 13:44:20 +01:00
Josh 9ce1ae8e61 fix(ObjectStorage): fix 0 folder handling in Primary Storage
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-02 13:44:20 +01:00
Josh 958e67687b fix(s3): Fix 0 folder handling in External Storage
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-02 13:44:19 +01:00
Côme Chilliet e7c4dbf2cb Merge pull request #58642 from nextcloud/jtr/perf-s3-external-cache-sizing
perf(files_external): Increase S3 cache caps
2026-03-02 13:36:01 +01:00
Côme Chilliet 7f18934344 Merge pull request #58654 from nextcloud/jtr/refactor-external-s3-unused-methods
refactor(files_external/S3): drop unused methods
2026-03-02 13:27:50 +01:00
Salvatore Martire 8431abff32 fix: check source and target when emitting copy event
Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2026-03-02 13:15:11 +01:00
Simon L. e0bf0737a0 fix: adjust the bug-report template to be consistent
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-02 12:16:45 +01:00
Simon L. 10ae88a1c3 feat: add workflow that aut-labels bug reports based on entered content
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-03-02 12:13:37 +01:00
Andy Scherzinger b729dc4ead Merge pull request #58057 from nextcloud/carl/perf-delete-share
perf(sharing): Avoid loading all shares from all users when unsharing
2026-03-02 12:03:52 +01:00
Nextcloud bot 2b5a26db95 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-03-02 00:19:14 +00:00
Carl Schwan 4588c7134d fix: Fix ci after run of rector
Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-03-01 22:48:25 +01:00
Josh bde043d13b chore(files_external/s3): drop no-op $this->filesCache use sites
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-01 12:53:57 -05:00
Josh 08b465d219 refactor(files_external/S3): drop unused methods
getContentLength() and getLastModified() are dead code. Originally added in PR #11518 and made defunct in PR #29220.

Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-03-01 12:45:01 -05:00
nextcloud-command 663018455e refactor: Apply rector changes
Signed-off-by: GitHub <noreply@github.com>
2026-03-01 14:43:11 +00:00
github-actions[bot] ee43b68606 Merge pull request #58649 from nextcloud/dependabot/npm_and_yarn/fast-xml-parser-5.4.1
chore(deps): Bump fast-xml-parser from 5.3.6 to 5.4.1
2026-03-01 13:51:14 +01:00
dependabot[bot] ced6d9e430 chore(deps): Bump fast-xml-parser from 5.3.6 to 5.4.1
Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) from 5.3.6 to 5.4.1.
- [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases)
- [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.6...v5.4.1)

---
updated-dependencies:
- dependency-name: fast-xml-parser
  dependency-version: 5.4.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-01 12:05:33 +01:00
github-actions[bot] 62109cc0a1 Merge pull request #58647 from nextcloud/dependabot/github_actions/github-actions-dcec74b321
chore(deps): Bump the github-actions group with 5 updates
2026-03-01 09:54:56 +00:00
dependabot[bot] 0b2893a154 chore(deps): Bump the github-actions group with 5 updates
Bumps the github-actions group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [github/codeql-action](https://github.com/github/codeql-action) | `4.32.2` | `4.32.4` |
| [cypress-io/github-action](https://github.com/cypress-io/github-action) | `7.1.2` | `7.1.5` |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `6.0.0` | `7.0.0` |
| [LizardByte/actions](https://github.com/lizardbyte/actions) | `2026.212.22356` | `2026.227.200013` |
| [actions/stale](https://github.com/actions/stale) | `10.1.1` | `10.2.0` |


Updates `github/codeql-action` from 4.32.2 to 4.32.4
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/45cbd0c69e560cd9e7cd7f8c32362050c9b7ded2...89a39a4e59826350b863aa6b6252a07ad50cf83e)

Updates `cypress-io/github-action` from 7.1.2 to 7.1.5
- [Release notes](https://github.com/cypress-io/github-action/releases)
- [Changelog](https://github.com/cypress-io/github-action/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cypress-io/github-action/compare/84d178e4bbce871e23f2ffa3085898cde0e4f0ec...bc22e01685c56e89e7813fd8e26f33dc47f87e15)

Updates `actions/upload-artifact` from 6.0.0 to 7.0.0
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/b7c566a772e6b6bfb58ed0dc250532a479d7789f...bbbca2ddaa5d8feaa63e36b76fdaad77386f024f)

Updates `LizardByte/actions` from 2026.212.22356 to 2026.227.200013
- [Release notes](https://github.com/lizardbyte/actions/releases)
- [Commits](https://github.com/lizardbyte/actions/compare/9bf3ef783775e17fe6b8dde3585d94ec570b93c2...70bb8d394d1c92f6113aeec6ae9cc959a5763d15)

Updates `actions/stale` from 10.1.1 to 10.2.0
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/997185467fa4f803885201cee163a9f38240193d...b5d41d4e1d5dceea10e7104786b73624c18a190f)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.32.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: cypress-io/github-action
  dependency-version: 7.1.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: LizardByte/actions
  dependency-version: 2026.227.200013
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: actions/stale
  dependency-version: 10.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-28 23:14:04 +00:00
github-actions[bot] e13e0c598e Merge pull request #58641 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/fast-xml-parser-5.4.1
chore(deps): Bump fast-xml-parser from 5.3.6 to 5.4.1 in /build/frontend-legacy
2026-02-28 22:47:13 +01:00
github-actions[bot] 60ea64210e Merge pull request #58599 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/multi-571506d351
chore(deps): Bump rollup in /build/frontend-legacy
2026-02-28 22:45:47 +01:00
nextcloud-command b42b92c13e chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-28 21:09:50 +00:00
dependabot[bot] 448e6df7e8 chore(deps): Bump fast-xml-parser in /build/frontend-legacy
Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) from 5.3.6 to 5.4.1.
- [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases)
- [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.6...v5.4.1)

---
updated-dependencies:
- dependency-name: fast-xml-parser
  dependency-version: 5.4.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-28 21:07:35 +00:00
dependabot[bot] a0bd65b174 chore(deps): Bump rollup in /build/frontend-legacy
Bumps  and [rollup](https://github.com/rollup/rollup). These dependencies needed to be updated together.

Updates `rollup` from 4.52.3 to 4.59.0
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.52.3...v4.59.0)

Updates `rollup` from 2.79.2 to 2.80.0
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.52.3...v4.59.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-version: 4.59.0
  dependency-type: indirect
- dependency-name: rollup
  dependency-version: 2.80.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-28 22:04:15 +01:00
github-actions[bot] c113a7698b Merge pull request #58640 from nextcloud/dependabot/npm_and_yarn/rollup-4.59.0
chore(deps): Bump rollup from 4.52.5 to 4.59.0
2026-02-28 20:54:01 +00:00
nextcloud-command 16592b9f73 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-28 19:57:23 +00:00
dependabot[bot] a49ceee5ae chore(deps): Bump rollup from 4.52.5 to 4.59.0
Bumps [rollup](https://github.com/rollup/rollup) from 4.52.5 to 4.59.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.52.5...v4.59.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-version: 4.59.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-28 20:49:28 +01:00
Andy Scherzinger ea24a7f3b8 Merge pull request #58621 from nextcloud/dependabot/npm_and_yarn/stylelint-17.4.0
chore(deps-dev): Bump stylelint from 17.3.0 to 17.4.0
2026-02-28 20:41:06 +01:00
github-actions[bot] 158f643c2b Merge pull request #58624 from nextcloud/dependabot/npm_and_yarn/vue-3.5.29
chore(deps): Bump vue from 3.5.28 to 3.5.29
2026-02-28 19:32:14 +00:00
ernolf b24663db93 feat(routing): add files_sharing_raw to rootUrlApps
- Registers the files_sharing_raw app as a root-URL app so that its routes are served under /raw/{token} and /rss instead of the default /apps/files_sharing_raw/... prefix.
  This is required for the files_sharing_raw app to generate correct canonical raw URLs via PublicUrlBuilder.

Signed-off-by: ernolf <raphael.gradenwitz@googlemail.com>
2026-02-28 20:30:19 +01:00
nextcloud-command f8aea303c2 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-28 19:14:22 +00:00
dependabot[bot] e14c8ec2c4 chore(deps): Bump vue from 3.5.28 to 3.5.29
Bumps [vue](https://github.com/vuejs/core) from 3.5.28 to 3.5.29.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/compare/v3.5.28...v3.5.29)

---
updated-dependencies:
- dependency-name: vue
  dependency-version: 3.5.29
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-28 20:06:32 +01:00
github-actions[bot] 4ca998e8bc Merge pull request #58627 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/webpack-5.105.3
chore(deps-dev): Bump webpack from 5.105.2 to 5.105.3 in /build/frontend-legacy
2026-02-28 18:56:59 +00:00
nextcloud-command 05345789dd chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-28 18:36:38 +00:00
dependabot[bot] 5ee5a71930 chore(deps-dev): Bump webpack in /build/frontend-legacy
Bumps [webpack](https://github.com/webpack/webpack) from 5.105.2 to 5.105.3.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Changelog](https://github.com/webpack/webpack/blob/main/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack/compare/v5.105.2...v5.105.3)

---
updated-dependencies:
- dependency-name: webpack
  dependency-version: 5.105.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-28 19:28:42 +01:00
github-actions[bot] c9af0f0977 Merge pull request #58598 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/multi-f81e89d21b
chore(deps): Bump minimatch in /build/frontend-legacy
2026-02-28 17:35:00 +00:00
github-actions[bot] e00da518e7 Merge pull request #58622 from nextcloud/dependabot/npm_and_yarn/cypress-15.11.0
chore(deps-dev): Bump cypress from 15.10.0 to 15.11.0
2026-02-28 18:25:41 +01:00
nextcloud-command 1aadd46c18 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-28 17:11:34 +00:00
dependabot[bot] 9b4f3f2c11 chore(deps): Bump minimatch in /build/frontend-legacy
Bumps  and [minimatch](https://github.com/isaacs/minimatch). These dependencies needed to be updated together.

Updates `minimatch` from 9.0.5 to 9.0.9
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v9.0.5...v9.0.9)

Updates `minimatch` from 8.0.4 to 8.0.7
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v9.0.5...v9.0.9)

Updates `minimatch` from 5.1.6 to 5.1.9
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v9.0.5...v9.0.9)

Updates `minimatch` from 10.1.1 to 10.2.4
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v9.0.5...v9.0.9)

---
updated-dependencies:
- dependency-name: minimatch
  dependency-version: 9.0.9
  dependency-type: indirect
- dependency-name: minimatch
  dependency-version: 8.0.7
  dependency-type: indirect
- dependency-name: minimatch
  dependency-version: 5.1.9
  dependency-type: indirect
- dependency-name: minimatch
  dependency-version: 10.2.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-28 18:03:51 +01:00
github-actions[bot] 36232afffd Merge pull request #58625 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/babel-loader-exclude-node-modules-except-1.2.4
chore(deps-dev): Bump babel-loader-exclude-node-modules-except from 1.2.1 to 1.2.4 in /build/frontend-legacy
2026-02-28 16:58:49 +00:00
github-actions[bot] c864d55f8f Merge pull request #58626 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/libphonenumber-js-1.12.38
chore(deps): Bump libphonenumber-js from 1.12.37 to 1.12.38 in /build/frontend-legacy
2026-02-28 16:46:06 +00:00
Josh a1814676b8 ci(performance): fix Unexpected input warning for profiler-branch
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-28 09:38:05 -05:00
Josh 430975ce96 perf(files_external): Increase S3 metadata cache caps
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-28 09:08:00 -05:00
nextcloud-command 41f87251c7 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-28 12:45:00 +00:00
dependabot[bot] 1098812f95 chore(deps): Bump libphonenumber-js in /build/frontend-legacy
Bumps [libphonenumber-js](https://gitlab.com/catamphetamine/libphonenumber-js) from 1.12.37 to 1.12.38.
- [Changelog](https://gitlab.com/catamphetamine/libphonenumber-js/blob/master/CHANGELOG.md)
- [Commits](https://gitlab.com/catamphetamine/libphonenumber-js/compare/v1.12.37...v1.12.38)

---
updated-dependencies:
- dependency-name: libphonenumber-js
  dependency-version: 1.12.38
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-28 13:37:36 +01:00
github-actions[bot] dbdba090ee Merge pull request #58620 from nextcloud/dependabot/composer/vendor-bin/rector/rector/rector-2.3.8
chore(deps-dev): Bump rector/rector from 2.3.7 to 2.3.8 in /vendor-bin/rector
2026-02-28 13:37:10 +01:00
github-actions[bot] 52f133dbc2 Merge pull request #58639 from nextcloud/dependabot/npm_and_yarn/multi-71d1011188
chore(deps): Bump minimatch and editorconfig
2026-02-28 08:58:31 +01:00
dependabot[bot] 54f95a1d8b chore(deps): Bump minimatch and editorconfig
Bumps [minimatch](https://github.com/isaacs/minimatch) and [editorconfig](https://github.com/editorconfig/editorconfig-core-js). These dependencies needed to be updated together.

Updates `minimatch` from 9.0.5 to 9.0.9
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v9.0.5...v9.0.9)

Updates `minimatch` from 3.1.2 to 3.1.5
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v9.0.5...v9.0.9)

Updates `minimatch` from 5.1.6 to 5.1.9
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v9.0.5...v9.0.9)

Updates `editorconfig` from 1.0.4 to 1.0.7
- [Release notes](https://github.com/editorconfig/editorconfig-core-js/releases)
- [Changelog](https://github.com/editorconfig/editorconfig-core-js/blob/main/CHANGELOG.md)
- [Commits](https://github.com/editorconfig/editorconfig-core-js/compare/v1.0.4...v1.0.7)

---
updated-dependencies:
- dependency-name: minimatch
  dependency-version: 9.0.9
  dependency-type: indirect
- dependency-name: minimatch
  dependency-version: 3.1.5
  dependency-type: indirect
- dependency-name: minimatch
  dependency-version: 5.1.9
  dependency-type: indirect
- dependency-name: editorconfig
  dependency-version: 1.0.7
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-28 06:38:18 +00:00
dependabot[bot] 0b01566282 chore(deps-dev): Bump babel-loader-exclude-node-modules-except
Bumps [babel-loader-exclude-node-modules-except](https://github.com/dutchenkoOleg/babel-loader-exclude-node-modules-except) from 1.2.1 to 1.2.4.
- [Release notes](https://github.com/dutchenkoOleg/babel-loader-exclude-node-modules-except/releases)
- [Commits](https://github.com/dutchenkoOleg/babel-loader-exclude-node-modules-except/compare/v1.2.1...v1.2.4)

---
updated-dependencies:
- dependency-name: babel-loader-exclude-node-modules-except
  dependency-version: 1.2.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-28 02:07:37 +00:00
dependabot[bot] 60bc7ffd0c chore(deps-dev): Bump cypress from 15.10.0 to 15.11.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 15.10.0 to 15.11.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Changelog](https://github.com/cypress-io/cypress/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/cypress-io/cypress/compare/v15.10.0...v15.11.0)

---
updated-dependencies:
- dependency-name: cypress
  dependency-version: 15.11.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-28 02:06:33 +00:00
dependabot[bot] c94c6ea45a chore(deps-dev): Bump stylelint from 17.3.0 to 17.4.0
Bumps [stylelint](https://github.com/stylelint/stylelint) from 17.3.0 to 17.4.0.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/17.3.0...17.4.0)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-version: 17.4.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-28 02:06:20 +00:00
dependabot[bot] b2dd3be343 chore(deps-dev): Bump rector/rector in /vendor-bin/rector
Bumps [rector/rector](https://github.com/rectorphp/rector) from 2.3.7 to 2.3.8.
- [Release notes](https://github.com/rectorphp/rector/releases)
- [Commits](https://github.com/rectorphp/rector/compare/2.3.7...2.3.8)

---
updated-dependencies:
- dependency-name: rector/rector
  dependency-version: 2.3.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-28 02:04:31 +00:00
Nextcloud bot d758f64a18 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-28 00:18:59 +00:00
Marcel Müller 00af1217ff Merge pull request #58601 from nextcloud/fix/noid/default-loglevel-with-match-condition
fix: Use configured loglevel even when log.condition matches is set
2026-02-27 16:00:49 +01:00
Ferdinand Thiessen 694e2312fd Merge pull request #58589 from nextcloud/fix/external-missing
fix(files_external): boolean comparison of array
2026-02-27 15:40:14 +01:00
Ferdinand Thiessen 69a5db46bd fix: code style
Co-authored-by: Carl Schwan <carl@carlschwan.eu>
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-27 14:31:42 +01:00
Kent Delante d6eade0119 Merge pull request #58582 from nextcloud/leftybournes/fix/files_external_delete_objects
fix: pass only object key to deleteObjects call
2026-02-27 11:28:19 +08:00
Kent Delante 8d1cb50048 fix: pass only object key to deleteObjects call
Some S3-compatible object storage hosts don't like the ETag being included in
the request and return a MalformedXML response. In the AWS API documentation,
only the object key is required so just pass that in.

Signed-off-by: Kent Delante <kent.delante@proton.me>
2026-02-27 10:54:23 +08:00
Nextcloud bot b4b328cf61 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-27 00:19:48 +00:00
Carl Schwan e47195a334 Merge pull request #58597 from nextcloud/bugfix/58594/files_sharing-disabled
fix(repair): Fix repair steps when files_sharing is disabled
2026-02-27 00:35:03 +01:00
Marcel Müller a56607e91f fix: Use configured loglevel even when log.condition matches is set
Signed-off-by: Marcel Müller <marcel-mueller@gmx.de>
2026-02-26 23:12:20 +01:00
github-actions[bot] 4d00f49757 Merge pull request #58556 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/multi-5543462fab
chore(deps): Bump bn.js in /build/frontend-legacy
2026-02-26 21:58:10 +01:00
Andy Scherzinger 83d795dd18 Merge pull request #58595 from nextcloud/fix/db-occ-pending-migrations-typo
fix(db): pending migrations in `occ migrations:status`
2026-02-26 21:56:27 +01:00
Joas Schilling a6b9483a5f fix(repair): Fix repair steps when files_sharing is disabled
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-02-26 21:51:13 +01:00
Josh 636345bac8 fix(db): pending migrations in occ migrations:status
Fixes #58569

Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-26 12:38:00 -05:00
Benjamin Gaussorgues 79d4953e64 Merge pull request #58535 from nextcloud/fix/do-not-send-headers-on-cli 2026-02-26 16:20:52 +01:00
Côme Chilliet d8084559a9 chore: Add missing return type in tests
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-02-26 15:22:09 +01:00
Côme Chilliet 60c86848e4 fix: Use proper DI for LDAP class
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-02-26 15:21:40 +01:00
Sebastian Krupinski ca8050b94e Merge pull request #58008 from nextcloud/feat/calendar-federation-readwrite
feat: calendar read and write federation
2026-02-26 09:01:25 -05:00
Carl Schwan 47b08a07d8 Merge pull request #58586 from nextcloud/carl/sharehelper-typing
refactor(typing): Correct typing of IShareHelper
2026-02-26 14:21:53 +01:00
Ferdinand Thiessen d50fbfe37d fix(files_external): boolean comparison of array
To check if there are no missing required dependencies we need to check
if the required dependencies are **empty** because `!array` is still
true.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-26 14:21:50 +01:00
Kate 77c070bc93 Merge pull request #58559 from nextcloud/fix/itypedquerybuilder/chained-calls 2026-02-26 13:44:40 +01:00
Côme Chilliet cc365554c6 chore: update psalm baseline
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-02-26 13:31:27 +01:00
Côme Chilliet 8b432809b4 fix: Adapt LDAPProvider tests to code changes
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-02-26 13:31:26 +01:00
Côme Chilliet c6f56ddbd7 fix(user_ldap): Remove usages of deprecated IServerContainer
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-02-26 13:31:26 +01:00
Kent Delante 09c9241b30 Merge pull request #58042 from nextcloud/feat/clear_password
feat(occ): allow admins to clear account passwords
2026-02-26 20:29:26 +08:00
Kent Delante 711bd2bc6d feat(occ): allow admins to clear account passwords
Signed-off-by: Kent Delante <kent.delante@proton.me>
2026-02-26 19:36:22 +08:00
Carl Schwan 2a81cba978 refactor(typing): Correct typing of IShareHelper
Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-02-26 12:22:44 +01:00
Andy Scherzinger 6df490942c Merge pull request #58525 from nextcloud/fix/fix-decryption-failure-false-positive
fix(encryption): Improve type strictness on decryption check
2026-02-26 12:10:01 +01:00
Andy Scherzinger 0b8e7bb4f0 Merge pull request #58205 from nextcloud/bug-show-configuration-options-for-again
fix: show configuration options for external storage backends
2026-02-26 11:56:41 +01:00
Carl Schwan 4acb3b5da3 perf: Perform share path validation early
Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-02-26 11:38:59 +01:00
Carl Schwan 0676fba514 perf(sharing): Avoid loading all shares from all users when unsharing
First check which users have a shares and for which providers and then
only load these shares.

Avoid doing at most 5 SQL queries for each users a share was shared with if
there are no shares.

Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-02-25 17:14:15 +01:00
Salvatore Martire 7e264ba58e Merge pull request #58571 from nextcloud/fix/regional-languages
fix(L10N): stop stripping _ from language codes
2026-02-25 16:54:18 +01:00
SebastianKrupinski 64f319ab4e feat: calendar federation write
Signed-off-by: SebastianKrupinski <krupinskis05@gmail.com>
2026-02-25 10:35:27 -05:00
Salvatore Martire ec0ed788fa fix(L10N): stop stripping _ from language codes
Stripping the underscore breaks support for all languages like de_AT,
de_DE and so on...

Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2026-02-25 15:28:34 +01:00
Daniel Kesselberg 67d1fac6f6 fix: show configuration options for external storage backends
The occ files_external_backends command is supposed to list available backends along with their configuration options.

For the SMB backend, only the timeout option is currently shown, while options like host, share, root, and domain are missing. This makes configuring external storage via occ complicated.

Since the timeout option is marked as hidden but still shown, while the other options are not, the logic needs to be inverted so that all relevant configuration options are displayed correctly.

Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
2026-02-25 15:24:20 +01:00
Kate af98eed523 Merge pull request #58548 from nextcloud/artonge/feat/ai_pr_template 2026-02-25 11:52:12 +01:00
Louis Chmn bfac9e7023 feat: Add AI checkbox to pull request template
Request committers to be transparent with their usage of AI.

Signed-off-by: Louis <louis@chmn.me>
Signed-off-by: Louis Chmn <louis@chmn.me>
2026-02-25 10:41:38 +01:00
Joas Schilling 346c4bd69a Merge pull request #58453 from nextcloud/bugfix/noid/update-notifier-exception-handling
fix(notifications): Update notifier exception handling
2026-02-25 10:29:45 +01:00
Benjamin Gaussorgues a12808e7c3 Merge pull request #58516 from nextcloud/fix/allow-multiple-sfids-files-gen 2026-02-25 10:20:29 +01:00
provokateurin 237d5156b6 fix(ITypedQueryBuilder): Add correct return type and add note about Psalm bug
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-25 09:52:48 +01:00
provokateurin 40c39270c0 fix((ITypedQueryBuilder): Fix chained calls of non-select methods
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-25 09:51:59 +01:00
Joas Schilling 0d6c551694 Merge pull request #58547 from nextcloud/dependabot/composer/symfony/process-6.4.33
build(deps): bump symfony/process from 6.4.31 to 6.4.33
2026-02-25 08:44:34 +01:00
Kate 14b42076ff Merge pull request #58279 from nextcloud/fix/mount-manager-improve-get-by-provider 2026-02-25 07:30:37 +01:00
Nextcloud bot 3431441180 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-25 00:19:43 +00:00
Joas Schilling d1f16ffaeb build(deps): bump symfony/process from 6.4.31 to 6.4.33
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-02-24 22:32:01 +01:00
dependabot[bot] f5b18dd7fd chore(deps): Bump bn.js in /build/frontend-legacy
Bumps  and [bn.js](https://github.com/indutny/bn.js). These dependencies needed to be updated together.

Updates `bn.js` from 5.2.2 to 5.2.3
- [Release notes](https://github.com/indutny/bn.js/releases)
- [Changelog](https://github.com/indutny/bn.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/indutny/bn.js/compare/v5.2.2...v5.2.3)

Updates `bn.js` from 4.12.2 to 4.12.3
- [Release notes](https://github.com/indutny/bn.js/releases)
- [Changelog](https://github.com/indutny/bn.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/indutny/bn.js/compare/v5.2.2...v5.2.3)

---
updated-dependencies:
- dependency-name: bn.js
  dependency-version: 5.2.3
  dependency-type: indirect
- dependency-name: bn.js
  dependency-version: 4.12.3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-24 21:02:56 +00:00
Joas Schilling 1cb826ea83 Merge pull request #58436 from redsteadz/enhancement/folder-icon
Enhancement/folder icon changed to be closer to the title "View in Folder".
2026-02-24 21:40:11 +01:00
Hamees Ehsan 9b7feee481 fix(files): use more appropriate icon for context menu action
Signed-off-by: Hamees Ehsan <harcolemas@gmail.com>
2026-02-25 01:21:40 +05:00
Kate 7d24904baf Merge pull request #58543 from nextcloud/filesize-non-existing 2026-02-24 16:58:22 +01:00
Robin Appelman 3f19e137e4 fix: correctly return false for filesize on non-existing file
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-02-24 15:46:03 +01:00
Robin Appelman bd8f251ad8 test: add test for calling filesize on non-existing files
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-02-24 15:32:06 +01:00
Kate 52a1d63993 Merge pull request #58373 from nextcloud/feat/db/typed-query-builder 2026-02-24 14:02:25 +01:00
F. E Noel Nfebe 33f852a641 Merge pull request #58128 from nextcloud/fix/share-expiration-date-time
fix(share): Set expiration time to end of day (23:59:59)
2026-02-24 11:22:44 +01:00
nfebe ce0d97b6e5 test(share): Update expiration date tests for end-of-day time
Update expected values in ManagerTest to reflect the new behavior
where share expiration dates are set to 23:59:59 instead of 00:00:00.

Signed-off-by: nfebe <fenn25.fn@gmail.com>
2026-02-24 10:43:46 +01:00
nfebe 2d20ee2e4e fix(share): Set expiration time to end of day (23:59:59)
Shares now expire at the end of the selected day instead of the
beginning, allowing access throughout the entire expiration day.

Also return actual stored time in API response instead of hardcoded
00:00:00 to prevent timezone-related display issues in the UI.

Signed-off-by: nfebe <fenn25.fn@gmail.com>
2026-02-24 10:43:46 +01:00
Benjamin Gaussorgues c25160d7eb Merge pull request #58530 from nextcloud/dav-download-size-fix-logg 2026-02-24 10:32:41 +01:00
Côme Chilliet f885d7292f fix(occ): Do not attempt to send headers on CLI
This avoids errors like 'Cannot modify header information - headers already sent',
 when using --debug-log with occ.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-02-24 10:22:13 +01:00
Nextcloud bot e61f0074f0 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-24 00:19:26 +00:00
Robin Appelman 84ff5760e0 fix: improve logging around automatic cache updated for dav downloads
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-02-23 17:45:35 +01:00
Kate c73b4e6ddd Merge pull request #58338 from nextcloud/fix/58333/user-files-replace 2026-02-23 16:45:05 +01:00
SebastianKrupinski 3bd7784c1e fix(theming): Fix favicon and touchicon ratios
Signed-off-by: SebastianKrupinski <krupinskis05@gmail.com>
2026-02-23 10:38:50 -05:00
Ferdinand Thiessen 839c4d71ce Merge pull request #58518 from nextcloud/enh/58508/move-user-picker-to-profile
Move the profile picker to the profile app
2026-02-23 16:31:53 +01:00
Julien Veyssier 9464eabad7 chore(assets): compile assets
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2026-02-23 15:30:43 +01:00
Julien Veyssier ee44591509 feat(profile-picker): adjust tests
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2026-02-23 15:29:27 +01:00
Côme Chilliet e4244c5fc8 fix(encryption): Improve type strictness on decryption check
Otherwise decrypting a falsy value like '0' would be seen as a
 decryption failure.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-02-23 14:49:03 +01:00
Julien Veyssier 2fc9eda850 feat(profile-picker): add an admin setting in the profile section to toggle the picker and the previews
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2026-02-23 14:40:50 +01:00
Julien Veyssier da455ee86e feat(profile-picker): move the profile picker to the profile app, remove the user_picker app
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2026-02-23 14:40:50 +01:00
Kate e19db72d98 Merge pull request #58512 from nextcloud/fix/core/share-external-http-localhost 2026-02-23 14:28:27 +01:00
provokateurin 161c91e1fd feat(DB): Add ITypedQueryBuilder
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-23 14:06:11 +01:00
provokateurin b41569d80c fix(QueryBuilder): Use correct parameter name in addSelect method
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-23 13:58:26 +01:00
Joas Schilling 542d492b74 Merge pull request #58384 from nextcloud/feat/noid/config-file-mode
feat(config): Allow defining config.php permissions after write
2026-02-23 13:39:35 +01:00
Arthur Schiwon 7cc235e98f Merge pull request #58401 from nextcloud/fix/show-file-size-on-remote-shares
fix: show file size on remote shares
2026-02-23 13:39:19 +01:00
Kate 432c06cb5b Merge pull request #58466 from nextcloud/carl/abort-early 2026-02-23 12:59:16 +01:00
Benjamin Gaussorgues 5cbba3a080 Merge pull request #58473 from nextcloud/jtr/fix-58470 2026-02-23 12:04:19 +01:00
Ferdinand Thiessen 974c82aedd Merge pull request #58492 from nextcloud/jtr/fix-user-picker-dataprovider-deps
test(user-picker): fix PHPUnit 12 dataprovider deprecations
2026-02-23 12:03:18 +01:00
nextcloud-command ba480b93ce chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-23 11:01:38 +00:00
provokateurin e8feef1c9c fix(core): Allow external sharing to plain http://localhost
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-23 10:59:02 +00:00
Benjamin Gaussorgues 86c0e11a91 fix(snowflake_ids): allow multiple instance with same temp directory
Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
2026-02-23 11:46:07 +01:00
Kate f1e29d444f Merge pull request #58506 from nextcloud/fix/user_picker-metadata 2026-02-23 10:47:31 +01:00
Ferdinand Thiessen fabf017fd6 Merge pull request #58505 from nextcloud/build/vite-config
build: fix vite config for assets imported from node modules
2026-02-23 10:26:18 +01:00
Nextcloud bot be5dd03f92 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-23 00:19:18 +00:00
Kate 1a3d77e710 Merge pull request #58351 from nextcloud/ci/rector-apply-fix-php-version
ci(rector-apply): Fix PHP version for server
2026-02-22 19:32:24 +01:00
Ferdinand Thiessen fe99131ac3 fix(user_picker): valid appinfo and correct license info
- app info was not valid according to XSD (missing `<bugs>`)
- license info for l10n was missing

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-22 16:17:43 +01:00
Ferdinand Thiessen 55c5b70f10 build: fix vite config for assets imported from node modules
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-22 15:59:46 +01:00
Nextcloud bot c4eddb5947 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-22 00:19:20 +00:00
github-actions[bot] fd39e45e6c Merge pull request #58482 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/underscore-1.13.8
chore(deps): Bump underscore from 1.13.7 to 1.13.8 in /build/frontend-legacy
2026-02-21 19:31:39 +00:00
nextcloud-command 2551796604 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-21 18:53:36 +00:00
dependabot[bot] 265ecc1c29 chore(deps): Bump underscore in /build/frontend-legacy
Bumps [underscore](https://github.com/jashkenas/underscore) from 1.13.7 to 1.13.8.
- [Commits](https://github.com/jashkenas/underscore/commits)

---
updated-dependencies:
- dependency-name: underscore
  dependency-version: 1.13.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-21 19:45:47 +01:00
github-actions[bot] 1d4d277157 Merge pull request #58481 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/marked-17.0.3
chore(deps): Bump marked from 17.0.2 to 17.0.3 in /build/frontend-legacy
2026-02-21 18:12:56 +00:00
Josh 24ffcd74f1 test(user-picker): add DataProvider use statement
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-21 12:58:22 -05:00
nextcloud-command bfaf1c46f3 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-21 16:27:16 +00:00
dependabot[bot] 2d69bee01b chore(deps): Bump marked from 17.0.2 to 17.0.3 in /build/frontend-legacy
Bumps [marked](https://github.com/markedjs/marked) from 17.0.2 to 17.0.3.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Commits](https://github.com/markedjs/marked/compare/v17.0.2...v17.0.3)

---
updated-dependencies:
- dependency-name: marked
  dependency-version: 17.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-21 17:19:21 +01:00
github-actions[bot] e29053e0dc Merge pull request #58484 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/libphonenumber-js-1.12.37
chore(deps): Bump libphonenumber-js from 1.12.36 to 1.12.37 in /build/frontend-legacy
2026-02-21 16:44:57 +01:00
nextcloud-command 54202f9b6e chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-21 14:58:07 +00:00
dependabot[bot] 284f2fc651 chore(deps): Bump libphonenumber-js in /build/frontend-legacy
Bumps [libphonenumber-js](https://gitlab.com/catamphetamine/libphonenumber-js) from 1.12.36 to 1.12.37.
- [Changelog](https://gitlab.com/catamphetamine/libphonenumber-js/blob/master/CHANGELOG.md)
- [Commits](https://gitlab.com/catamphetamine/libphonenumber-js/compare/v1.12.36...v1.12.37)

---
updated-dependencies:
- dependency-name: libphonenumber-js
  dependency-version: 1.12.37
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-21 15:50:13 +01:00
github-actions[bot] 0a68310859 Merge pull request #58476 from nextcloud/dependabot/npm_and_yarn/nextcloud/paths-3.1.0
chore(deps): Bump @nextcloud/paths from 3.0.0 to 3.1.0
2026-02-21 10:07:41 +01:00
github-actions[bot] 6956e809a7 Merge pull request #58475 from nextcloud/dependabot/composer/vendor-bin/rector/rector/rector-2.3.7
chore(deps-dev): Bump rector/rector from 2.3.6 to 2.3.7 in /vendor-bin/rector
2026-02-21 09:01:26 +00:00
github-actions[bot] 693ae05cc8 Merge pull request #58480 from nextcloud/dependabot/npm_and_yarn/jsdom-28.1.0
chore(deps-dev): Bump jsdom from 28.0.0 to 28.1.0
2026-02-21 09:01:24 +00:00
nextcloud-command baeb847595 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-21 08:45:38 +00:00
dependabot[bot] bff343be2f chore(deps): Bump @nextcloud/paths from 3.0.0 to 3.1.0
Bumps [@nextcloud/paths](https://github.com/nextcloud-libraries/nextcloud-paths) from 3.0.0 to 3.1.0.
- [Release notes](https://github.com/nextcloud-libraries/nextcloud-paths/releases)
- [Changelog](https://github.com/nextcloud-libraries/nextcloud-paths/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nextcloud-libraries/nextcloud-paths/compare/v3.0.0...v3.1.0)

---
updated-dependencies:
- dependency-name: "@nextcloud/paths"
  dependency-version: 3.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-21 09:37:18 +01:00
github-actions[bot] c0e80684ec Merge pull request #58477 from nextcloud/dependabot/npm_and_yarn/eslint-plugin-cypress-6.1.0
chore(deps-dev): Bump eslint-plugin-cypress from 5.3.0 to 6.1.0
2026-02-21 09:36:21 +01:00
github-actions[bot] 0f54c82f80 Merge pull request #58479 from nextcloud/dependabot/npm_and_yarn/zip.js/zip.js-2.8.21
chore(deps-dev): Bump @zip.js/zip.js from 2.8.20 to 2.8.21
2026-02-21 09:35:44 +01:00
Josh 07c614d2bd test(user-picker): fix PHPUnit 12 dataprovider deprecations
Eliminates PHPUnit deprecation notices (due to @dataProvider use) that were introduced via #57539.

Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-20 21:47:21 -05:00
dependabot[bot] 0012588252 chore(deps-dev): Bump jsdom from 28.0.0 to 28.1.0
Bumps [jsdom](https://github.com/jsdom/jsdom) from 28.0.0 to 28.1.0.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Changelog](https://github.com/jsdom/jsdom/blob/main/Changelog.md)
- [Commits](https://github.com/jsdom/jsdom/compare/28.0.0...28.1.0)

---
updated-dependencies:
- dependency-name: jsdom
  dependency-version: 28.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-21 02:09:06 +00:00
dependabot[bot] 583fafbbb6 chore(deps-dev): Bump @zip.js/zip.js from 2.8.20 to 2.8.21
Bumps [@zip.js/zip.js](https://github.com/gildas-lormeau/zip.js) from 2.8.20 to 2.8.21.
- [Release notes](https://github.com/gildas-lormeau/zip.js/releases)
- [Commits](https://github.com/gildas-lormeau/zip.js/compare/v2.8.20...v2.8.21)

---
updated-dependencies:
- dependency-name: "@zip.js/zip.js"
  dependency-version: 2.8.21
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-21 02:08:38 +00:00
dependabot[bot] 69e4f78306 chore(deps-dev): Bump eslint-plugin-cypress from 5.3.0 to 6.1.0
Bumps [eslint-plugin-cypress](https://github.com/cypress-io/eslint-plugin-cypress) from 5.3.0 to 6.1.0.
- [Release notes](https://github.com/cypress-io/eslint-plugin-cypress/releases)
- [Commits](https://github.com/cypress-io/eslint-plugin-cypress/compare/v5.3.0...v6.1.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-cypress
  dependency-version: 6.1.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-21 02:07:32 +00:00
dependabot[bot] 35bdc857a8 chore(deps-dev): Bump rector/rector in /vendor-bin/rector
Bumps [rector/rector](https://github.com/rectorphp/rector) from 2.3.6 to 2.3.7.
- [Release notes](https://github.com/rectorphp/rector/releases)
- [Commits](https://github.com/rectorphp/rector/compare/2.3.6...2.3.7)

---
updated-dependencies:
- dependency-name: rector/rector
  dependency-version: 2.3.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-21 02:03:16 +00:00
Nextcloud bot 5a5f82c52e fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-21 00:19:15 +00:00
Josh 2475a0bb19 chore(autoload_classmap): drop OC_JSON
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-20 16:58:21 -05:00
Josh 7f9b9e9104 chore(autoload_static): drop OC_JSON
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-20 16:57:45 -05:00
Josh aad7571502 chore: drop OC_JSON
Closes #8568

Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-20 16:56:24 -05:00
Josh f0663d5cbf fix(Cron): Log when WebCron accessed in system cron mode
Fixese #58470

Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-20 16:44:14 -05:00
Ferdinand Thiessen 6664eb397c Merge pull request #56967 from nextcloud/fix/share-download
fix(files_sharing): make legacy `downloadShare` endpoint compatible with legacy behavior
2026-02-20 19:20:19 +01:00
Carl Schwan fa48b7065e fix(propagator): Don't run queries if no parents
Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-02-20 17:36:34 +01:00
Salvatore Martire ed18c44374 fix: remove user part only at the beginning of path
Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2026-02-20 16:35:37 +01:00
Ferdinand Thiessen a63e248b39 fix(files_sharing): make legacy downloadShare endpoint compatible with legacy behavior
This needs to be able to directly download files if specified to only
download a single file and not a folder.
Also it was possible to either pass a files array json encoded or a
single file not encoded at all.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-20 15:57:56 +01:00
John Molakvoæ 6873b96ea5 Merge pull request #58457 from nextcloud/fix/a11y-select-header-all
fix(files): fix tab navigation from select all checkbox to batch actions
2026-02-20 14:59:44 +01:00
nextcloud-command e614d8fc9b chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-20 13:39:22 +00:00
skjnldsv de56af3173 fix(files): fix tab navigation from select all checkbox to batch actions
Signed-off-by: skjnldsv <skjnldsv@protonmail.com>
2026-02-20 13:36:35 +00:00
Andy Scherzinger 3e9f5b3e63 Merge pull request #57539 from nextcloud/enh/noid/user-picker
Move the profile picker to server
2026-02-20 12:38:27 +01:00
nextcloud-command 0c7ae444ef chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-20 09:27:17 +00:00
Julien Veyssier fc4b743415 feat(user-picker): make the user_picker app enabled by default
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2026-02-20 10:16:34 +01:00
Julien Veyssier 7b330cf265 feat(user-picker): fix eslint issues
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2026-02-20 10:16:34 +01:00
Julien Veyssier 57ec0dee99 feat(user-picker): support NC 34
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2026-02-20 10:16:34 +01:00
Julien Veyssier c0a984dfc4 feat(user-picker): use logger instead of console
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2026-02-20 10:16:34 +01:00
Julien Veyssier 00a47f1d70 feat(user-picker): add .noopenapi
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2026-02-20 10:16:34 +01:00
Julien Veyssier d34905b26c feat(user-picker): fix REUSE issues
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2026-02-20 10:16:34 +01:00
Julien Veyssier 530a0bbbef feat(user-picker): add app to psalm config, fix unit tests
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2026-02-20 10:16:34 +01:00
Julien Veyssier a25578cd57 feat(user-picker): fix unit tests
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2026-02-20 10:16:34 +01:00
Julien Veyssier 668db370d2 feat(user-picker): fix eslint errors
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2026-02-20 10:16:33 +01:00
Julien Veyssier bf64cb17c8 feat(user-picker): add translation config
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2026-02-20 10:16:33 +01:00
Julien Veyssier e29349cd9f feat(user-picker): fix style issue
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2026-02-20 10:16:33 +01:00
Julien Veyssier 20453312bd feat(user-picker): adjust build files
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2026-02-20 10:16:33 +01:00
Julien Veyssier 28e6f8e808 feat(user-picker): generate composer stuff
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2026-02-20 10:16:33 +01:00
Julien Veyssier 4628ca2166 feat(user-picker): start moving the users_picker app as the shipped user_picker
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2026-02-20 10:16:33 +01:00
Joas Schilling 57100fe78e fix(notifications): Update notifier exception handling
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-02-20 08:13:42 +01:00
Kate 1285c8cd04 Merge pull request #58414 from nextcloud/fix/transfer-ownership-service/remove-groupfolders-size
fix(TransferOwnershipService): Remove groupfolders size
2026-02-20 06:17:21 +01:00
Nextcloud bot 7e474a9ac4 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-20 00:20:34 +00:00
github-actions[bot] 0df2a8a588 Merge pull request #58442 from nextcloud/dependabot/npm_and_yarn/systeminformation-5.31.1
chore(deps): Bump systeminformation from 5.27.14 to 5.31.1
2026-02-19 21:44:23 +00:00
github-actions[bot] 9039dab9cd Merge pull request #58430 from nextcloud/dependabot/npm_and_yarn/fast-xml-parser-5.3.6
chore(deps): Bump fast-xml-parser from 5.3.4 to 5.3.6
2026-02-19 21:17:14 +00:00
Thomas Citharel 80fd6fa194 Merge pull request #57376 from nextcloud/add-server-url-to-http-client-user-agent
feat(http-client): add option to add instance URL to HTTP client user-agent
2026-02-19 18:28:10 +01:00
Thomas Citharel 0bfa86b02d feat(http-client): add option to add instance URL to HTTP client user-agent
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
2026-02-19 17:57:40 +01:00
dependabot[bot] d896295312 chore(deps): Bump systeminformation from 5.27.14 to 5.31.1
Bumps [systeminformation](https://github.com/sebhildebrandt/systeminformation) from 5.27.14 to 5.31.1.
- [Release notes](https://github.com/sebhildebrandt/systeminformation/releases)
- [Changelog](https://github.com/sebhildebrandt/systeminformation/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sebhildebrandt/systeminformation/compare/v5.27.14...v5.31.1)

---
updated-dependencies:
- dependency-name: systeminformation
  dependency-version: 5.31.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-19 16:18:19 +00:00
Ferdinand Thiessen 21da74cade Merge pull request #58360 from nextcloud/fix/show-error-sharing
fix(files_sharing): ensure the server share API errors are shown
2026-02-19 17:16:43 +01:00
nextcloud-command cdce99b3ce chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-19 14:33:56 +00:00
Salvatore Martire 238e459032 Merge pull request #58144 from nextcloud/fix/more-missing-userid-cases
fix: add missing `X-User-Id` in DAV uploads and index redirect
2026-02-19 15:27:06 +01:00
Ferdinand Thiessen e73e990ed2 fix(files_sharing): ensure the server share API errors are shown
- fix https://github.com/nextcloud/server/issues/58359

To reproduce:
1. Setup password policy.
2. Try to set a share password like `1234`
3. See that no visual error message is show but only in the console

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-19 14:30:15 +01:00
Kate ea9e2bb161 Merge pull request #58419 from nextcloud/fix/propagator/skip-groupfolders-versions-trash
fix(Propagator): Also skip groupfolders versions and trash entries
2026-02-19 14:29:42 +01:00
Carl Schwan a128445e3e Merge pull request #58403 from nextcloud/fix/slow-delete
fix(perf): use index when deleting old previews
2026-02-19 14:06:46 +01:00
dependabot[bot] 70223c1f73 chore(deps): Bump fast-xml-parser from 5.3.4 to 5.3.6
Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) from 5.3.4 to 5.3.6.
- [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases)
- [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.4...v5.3.6)

---
updated-dependencies:
- dependency-name: fast-xml-parser
  dependency-version: 5.3.6
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-19 13:03:53 +00:00
github-actions[bot] b16865f49a Merge pull request #58397 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/fast-xml-parser-5.3.6
chore(deps): Bump fast-xml-parser from 5.3.4 to 5.3.6 in /build/frontend-legacy
2026-02-19 13:02:03 +00:00
Maksim Sukharev 7413607350 Merge pull request #58422 from nextcloud/fix/58342/user-status-emoji-picker
fix(user_status): mount emoji picker outside of dialog
2026-02-19 12:52:13 +01:00
nextcloud-command df796052c9 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-19 10:19:56 +00:00
Maksim Sukharev e45d6cab19 fix(user_status): mount emoji picker outside of dialog
- fix overflow and scroll when emoji picker is open

Signed-off-by: Maksim Sukharev <antreesy.web@gmail.com>
2026-02-19 10:41:45 +01:00
provokateurin a9fb17c982 fix(Propagator): Also skip groupfolders versions and trash entries
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-19 09:19:44 +01:00
Julius Knorr c378bb4e9a Merge pull request #58236 from nextcloud/jtr/fix-db-missing-indices-at-install-time
fix(setup): add index properties_name_path_user by default on new installs
2026-02-19 09:17:45 +01:00
provokateurin 1ed7a0ef98 fix(TransferOwnershipService): Remove groupfolders size
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-19 08:38:04 +01:00
nextcloud-command 79ac26f85f chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-19 06:25:50 +00:00
dependabot[bot] 117e929c17 chore(deps): Bump fast-xml-parser in /build/frontend-legacy
Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) from 5.3.4 to 5.3.6.
- [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases)
- [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.4...v5.3.6)

---
updated-dependencies:
- dependency-name: fast-xml-parser
  dependency-version: 5.3.6
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-19 07:15:45 +01:00
Nextcloud bot 42c0e5ffeb fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-19 00:21:07 +00:00
Kate 3c8ca879a5 Merge pull request #58402 from nextcloud/fix/propagator/skip-groupfolders-root-entries
fix(Propagator): Skip groupfolders root entries
2026-02-18 22:57:56 +01:00
Benjamin Gaussorgues 30e35a8411 fix(perf): use index when deleting old previews
Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
2026-02-18 17:27:36 +01:00
Robin Appelman d504ec1ec5 Merge pull request #57578 from nextcloud/authoritative-setup-improvements
Authoritative setup improvements
2026-02-18 16:59:16 +01:00
Robin Appelman 7064ff035f fix: also use authoritative mount info for setupForProvider
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-02-18 15:47:39 +01:00
Robin Appelman f5d7a44dca fix: only refresh mounts once per user
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-02-18 15:47:39 +01:00
grnd-alt e4dcec8d5f fix: show file size on remote shares
Signed-off-by: grnd-alt <git@belakkaf.net>
2026-02-18 15:11:59 +01:00
provokateurin ca9c54518a fix(Propagator): Skip groupfolders root entries
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-18 13:45:55 +01:00
Joas Schilling a6d1fa1fa6 Merge pull request #58399 from nextcloud/followup/58282/restore-typing-on-middle-class
fix(migrations): Restore type definitions for API class used in apps
2026-02-18 09:24:57 +01:00
Joas Schilling 06f35ec4f8 fix(migrations): Restore type definitions for API class used in apps
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-02-18 08:36:08 +01:00
Nextcloud bot 16d3cee3a2 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-18 00:20:52 +00:00
Ferdinand Thiessen 48d6d8df2b Merge pull request #54048 from nextcloud/files-external-optional-dependencies
fix(files_external): ignore unsatisfied optional dependencies
2026-02-17 22:58:42 +01:00
Ferdinand Thiessen 252449023f Merge pull request #58379 from nextcloud/backport/58285/master
fix(cache): filter out invalid entries in `OC\Files\Cache\Wrapper\CacheWrapper::getFolderContentsById`
2026-02-17 18:11:04 +01:00
Jan-Philipp Litza 0f4d6b8027 fix(files_external): ignore unsatisfied optional dependencies
Signed-off-by: Jan-Philipp Litza <janphilipp@litza.de>
2026-02-17 18:03:56 +01:00
Ferdinand Thiessen 88bb82ccfe fix(cache): filter out invalid entries in OC\Files\Cache\Wrapper\CacheWrapper::getFolderContentsById
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-17 17:20:46 +01:00
Ferdinand Thiessen 560df4a73c fix(cache): filter out invalid entries in OC\Files\Cache\Wrapper\CacheWrapper::getFolderContentsById
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>

[skip ci]
2026-02-17 17:17:02 +01:00
Joas Schilling af9308344b feat(config): Allow defining config.php permissions after write
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-02-17 15:25:47 +01:00
Benjamin Gaussorgues f2907f133c Merge pull request #58282 from nextcloud/carl/refactor-migration
refactor(psalm): Modernize migration doc
2026-02-17 14:58:03 +01:00
Ferdinand Thiessen b6d22f384b Merge pull request #57648 from nextcloud/chore/drop-jquery
chore!: drop jQuery UI and jQuery
2026-02-17 14:14:12 +01:00
Robin Appelman 867ef52cfb Merge pull request #57523 from nextcloud/authoritative-share-provider
Make share mount provider authoritative
2026-02-17 13:31:10 +01:00
Kate e9bba6a610 Merge pull request #58286 from nextcloud/fix/groupfolders-phpstan
Fix a bunch of typing issues to make PHPStan level 10 happy on groupfolders
2026-02-17 13:30:46 +01:00
Ferdinand Thiessen 0b37d37884 chore: compile assets
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-17 12:53:15 +01:00
Ferdinand Thiessen b0df06d533 chore!(core): remove deprecated jQuery and jQuery UI
"jQuery is deprecated and will be removed with Nextcloud 19"
Well... At least it is removed now 😉

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-17 12:51:42 +01:00
Ferdinand Thiessen 00a5c028a4 chore!(core): remove legacy Backbone
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-17 12:50:49 +01:00
Ferdinand Thiessen a32168b01e chore!(core): remove legacy OC.Files.Client
Use the DAV client from `@nextcloud/files/dav` instead.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-17 12:50:49 +01:00
Ferdinand Thiessen fd5108b68b chore!(core): remove global snapper.js handling
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-17 12:50:49 +01:00
Ferdinand Thiessen c89939fbd6 chore!(core): remove handling of .live-relative-timestamp use @nextcloud/vue/components/NcDateTime instead
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-17 12:50:49 +01:00
Ferdinand Thiessen 503fad2b16 chore!(core): remove legacy OC.registerMenu and other menu helpers
Instead use Vue components.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-17 12:50:49 +01:00
Ferdinand Thiessen e14d97b95a chore!(core): remove deprecated OC.Apps
Instead use components from `@nextcloud/vue`

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-17 12:50:49 +01:00
Ferdinand Thiessen b66292a0d4 chore!(core): drop deprecated OC.Notification
Deprecated since 17.0.0, use the `@nextcloud/dialogs` package instead.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-17 12:50:49 +01:00
Ferdinand Thiessen 16f4ff98e4 chore!(core): drop deprecated OC.Dialogs.fileexists
It is deprecated since 29.0.0.
Instead use `openConflictPicker` from the `@nextcloud/upload` (Vue 2).
Or from `@nextcloud/dialogs` (every other framework like Vue 3 etc).

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-17 12:50:49 +01:00
Ferdinand Thiessen 9c8f80102a chore!(core): drop deprecated OC.Settings
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-17 12:50:49 +01:00
Ferdinand Thiessen b0e99d0293 Merge pull request #58327 from nextcloud/feat/1698/recent-files-include-recently-uploaded
feat: add upload_time support to file search and recent files
2026-02-17 11:48:12 +01:00
Kate 3a80443508 Merge pull request #58278 from nextcloud/techdebt/noid/openapi-for-workflow-engine
feat(workflowengine): Add openapi for workflow engine
2026-02-17 08:34:45 +01:00
provokateurin 4eada2d804 refactor(Files): Modernize Wrapper
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-17 06:43:16 +01:00
provokateurin 672a29aa0c refactor(Files): Remove deprecated and unused getMimeType and searchByMime methods
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-17 06:43:16 +01:00
provokateurin 5f4a5d8c67 refactor(Files): Remove deprecated streamCopy method
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-17 06:43:16 +01:00
provokateurin c953ad9bcd fix(Storage): Use correct return types for getMetaData and getDirectoryContent
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-17 06:43:16 +01:00
provokateurin 7ceddb3ffb fix(IStorage): Use correct return type for stat
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-17 06:43:16 +01:00
provokateurin 2d486c5629 fix(IGroupManager): Use correct return type for displayNamesInGroup
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-17 06:43:16 +01:00
provokateurin e454cc6765 refactor(settings): Modernize authorized group classes
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-17 06:43:16 +01:00
provokateurin 3693cbeaf9 fix(IMetadataVersion): Use correct return type for getMetadata
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-17 06:43:16 +01:00
provokateurin e40d6b1c6b refactor(dav): Modernize Node
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-17 06:43:16 +01:00
provokateurin bf71461bee fix(psalm-strict): Supress errors related to internal classes, methods and properties
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-17 06:43:16 +01:00
Nextcloud bot 045a41625a fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-17 00:20:47 +00:00
Robin Appelman 3ec7bd2ee1 Merge pull request #58207 from nextcloud/share-verify-mount-event-improvements
feat: improve VerifyMountPointEvent event
2026-02-16 20:49:39 +01:00
Joas Schilling 4134df9eda feat(workflowengine): Add openapi for workflow engine
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-02-16 17:51:18 +01:00
Kent Delante 91946d549f Merge pull request #58262 from nextcloud/leftybournes/fix/external_storage_forbid_local
fix(external_storage): hide local storage as an option for users
2026-02-16 21:23:52 +08:00
Kent Delante 2d2139ab94 fix(external_storage): hide local storage as an option for users
Signed-off-by: Kent Delante <kent.delante@proton.me>
2026-02-16 20:53:30 +08:00
Kate 35f24bcd38 Merge pull request #58355 from nextcloud/fix/ocp/container
fix(IRegistrationContext): Use IContainer in registerService factory
2026-02-16 13:36:37 +01:00
provokateurin d92c2de741 fix(IRegistrationContext): Use IContainer in registerService factory
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-16 10:45:13 +01:00
provokateurin 931d15e476 feat(IContainer): Undeprecate class
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-16 10:45:13 +01:00
provokateurin 935c2416b5 fix(IContainer): Override get method with better type annotations
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-16 10:45:13 +01:00
provokateurin 9dc1d6372f fix(IContainer): Fix parameter and return types
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-16 10:45:13 +01:00
Git'Fellow f06133bf13 Merge pull request #58350 from nextcloud/regressionEmptyPort
fix(sftp): Handle empty port parameter to allow host-defined ports
2026-02-16 10:13:38 +01:00
Nextcloud bot 891ec7bed5 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-16 00:20:46 +00:00
provokateurin 38b6bfc8db ci(rector-apply): Fix PHP version for server
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-15 16:11:18 +01:00
github-actions[bot] 53ac6d62b5 Merge pull request #58307 from nextcloud/dependabot/npm_and_yarn/nextcloud/dialogs-7.3.0
chore(deps): Bump @nextcloud/dialogs from 7.2.0 to 7.3.0
2026-02-15 16:07:39 +01:00
nextcloud-command b812040314 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-15 12:39:59 +00:00
dependabot[bot] d4416f10fe chore(deps): Bump @nextcloud/dialogs from 7.2.0 to 7.3.0
Bumps [@nextcloud/dialogs](https://github.com/nextcloud-libraries/nextcloud-dialogs) from 7.2.0 to 7.3.0.
- [Release notes](https://github.com/nextcloud-libraries/nextcloud-dialogs/releases)
- [Changelog](https://github.com/nextcloud-libraries/nextcloud-dialogs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nextcloud-libraries/nextcloud-dialogs/compare/v7.2.0...v7.3.0)

---
updated-dependencies:
- dependency-name: "@nextcloud/dialogs"
  dependency-version: 7.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-15 12:08:37 +00:00
github-actions[bot] eebcc7b5bb Merge pull request #58314 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/nextcloud/upload-1.11.1
chore(deps): Bump @nextcloud/upload from 1.11.0 to 1.11.1 in /build/frontend-legacy
2026-02-15 11:13:37 +00:00
nextcloud-command 88b6c54d6b chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-15 08:27:14 +00:00
dependabot[bot] ee65e8e79c chore(deps): Bump @nextcloud/upload in /build/frontend-legacy
Bumps [@nextcloud/upload](https://github.com/nextcloud-libraries/nextcloud-upload) from 1.11.0 to 1.11.1.
- [Release notes](https://github.com/nextcloud-libraries/nextcloud-upload/releases)
- [Changelog](https://github.com/nextcloud-libraries/nextcloud-upload/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nextcloud-libraries/nextcloud-upload/compare/v1.11.0...v1.11.1)

---
updated-dependencies:
- dependency-name: "@nextcloud/upload"
  dependency-version: 1.11.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-15 08:19:12 +00:00
github-actions[bot] 15f1ec22f4 Merge pull request #58312 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/webpack-5.105.2
chore(deps-dev): Bump webpack from 5.105.0 to 5.105.2 in /build/frontend-legacy
2026-02-15 09:17:15 +01:00
github-actions[bot] a04d6d6de2 Merge pull request #58310 from nextcloud/dependabot/npm_and_yarn/sortablejs-1.15.7
chore(deps): Bump sortablejs from 1.15.6 to 1.15.7
2026-02-15 09:02:37 +01:00
Nextcloud bot ba2ddc1392 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-15 00:20:42 +00:00
nextcloud-command 72d825a7dc chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-14 23:16:00 +00:00
nextcloud-command 096bff5fed chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-14 23:15:51 +00:00
dependabot[bot] e0e37fcac4 chore(deps): Bump sortablejs from 1.15.6 to 1.15.7
Bumps [sortablejs](https://github.com/SortableJS/Sortable) from 1.15.6 to 1.15.7.
- [Release notes](https://github.com/SortableJS/Sortable/releases)
- [Commits](https://github.com/SortableJS/Sortable/compare/1.15.6...1.15.7)

---
updated-dependencies:
- dependency-name: sortablejs
  dependency-version: 1.15.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-14 23:07:24 +00:00
dependabot[bot] eec2e93d3a chore(deps-dev): Bump webpack in /build/frontend-legacy
Bumps [webpack](https://github.com/webpack/webpack) from 5.105.0 to 5.105.2.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Changelog](https://github.com/webpack/webpack/blob/main/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack/compare/v5.105.0...v5.105.2)

---
updated-dependencies:
- dependency-name: webpack
  dependency-version: 5.105.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-14 23:07:05 +00:00
github-actions[bot] f6dc6ec3e3 Merge pull request #58346 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/marked-17.0.2
chore(deps): Bump marked from 17.0.1 to 17.0.2 in /build/frontend-legacy
2026-02-14 22:53:59 +00:00
Ferdinand Thiessen 66c1e0ab61 Merge pull request #58330 from nextcloud/fix/view-order
fix(files): correctly sort views
2026-02-14 22:59:27 +01:00
nextcloud-command 93d6087eb6 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-14 21:37:23 +00:00
Ferdinand Thiessen 2007491e11 fix(files): correctly sort views
The condition to sort by order was missing, so the views were only
sorted by name. Added the most important order condition and proper
tests for this.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-14 22:29:46 +01:00
nextcloud-command 0263a7f093 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-14 20:53:35 +01:00
dependabot[bot] d16a7b3653 chore(deps): Bump marked from 17.0.1 to 17.0.2 in /build/frontend-legacy
Bumps [marked](https://github.com/markedjs/marked) from 17.0.1 to 17.0.2.
- [Release notes](https://github.com/markedjs/marked/releases)
- [Commits](https://github.com/markedjs/marked/compare/v17.0.1...v17.0.2)

---
updated-dependencies:
- dependency-name: marked
  dependency-version: 17.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-14 20:53:35 +01:00
github-actions[bot] a69d56d1b7 Merge pull request #58348 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/multi-d31b51a7f2
chore(deps): Bump qs and body-parser in /build/frontend-legacy
2026-02-14 20:38:35 +01:00
nextcloud-command eb4194a973 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-14 16:46:10 +00:00
Git'Fellow b1e71ae646 fix(sftp): Handle empty port parameter to allow host-defined ports
Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com>
2026-02-14 12:29:38 +01:00
dependabot[bot] 161b1098c0 chore(deps): Bump qs and body-parser in /build/frontend-legacy
Bumps [qs](https://github.com/ljharb/qs) and [body-parser](https://github.com/expressjs/body-parser). These dependencies needed to be updated together.

Updates `qs` from 6.14.1 to 6.14.2
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.14.1...v6.14.2)

Updates `body-parser` from 1.20.3 to 1.20.4
- [Release notes](https://github.com/expressjs/body-parser/releases)
- [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/body-parser/compare/1.20.3...1.20.4)

---
updated-dependencies:
- dependency-name: qs
  dependency-version: 6.14.2
  dependency-type: indirect
- dependency-name: body-parser
  dependency-version: 1.20.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-14 07:08:25 +00:00
github-actions[bot] cf1c70ca62 Merge pull request #58345 from nextcloud/dependabot/npm_and_yarn/stylelint-17.3.0
chore(deps-dev): Bump stylelint from 17.1.1 to 17.3.0
2026-02-14 07:07:17 +00:00
dependabot[bot] e9ec5026a6 chore(deps-dev): Bump stylelint from 17.1.1 to 17.3.0
Bumps [stylelint](https://github.com/stylelint/stylelint) from 17.1.1 to 17.3.0.
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/17.1.1...17.3.0)

---
updated-dependencies:
- dependency-name: stylelint
  dependency-version: 17.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-14 02:05:13 +00:00
Nextcloud bot 1439a2caab fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-14 00:21:13 +00:00
github-actions[bot] f9f35151c0 Merge pull request #58301 from nextcloud/dependabot/npm_and_yarn/zip.js/zip.js-2.8.20
chore(deps-dev): Bump @zip.js/zip.js from 2.8.17 to 2.8.20
2026-02-13 18:34:50 +00:00
github-actions[bot] 7ed3134160 Merge pull request #58304 from nextcloud/dependabot/npm_and_yarn/msw-2.12.10
chore(deps-dev): Bump msw from 2.12.9 to 2.12.10
2026-02-13 18:19:11 +00:00
Robin Appelman eb6f78e26d feat: implement authoritative mount provider for share provider
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-02-13 19:02:05 +01:00
Cristian Scheid e964351389 feat: add upload_time support to file search and recent files
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-02-13 14:38:51 -03:00
Sebastian Krupinski c56938f6a9 Merge pull request #58203 from nextcloud/fix/obey-x-nc-scheduling-flag-on-delete
fix: obey x-nc-scheduling flag on delete
2026-02-13 12:07:25 -05:00
github-actions[bot] 8443c71d3e Merge pull request #58302 from nextcloud/dependabot/npm_and_yarn/eslint-plugin-cypress-5.3.0
chore(deps-dev): Bump eslint-plugin-cypress from 5.2.1 to 5.3.0
2026-02-13 16:25:09 +00:00
Salvatore Martire d400dd4167 fix: avoid recomputing list of mounts by provider
Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2026-02-13 16:41:44 +01:00
SebastianKrupinski b91dfee54a fix: obey x-nc-scheduling flag on delete
Signed-off-by: SebastianKrupinski <krupinskis05@gmail.com>
2026-02-13 09:58:26 -05:00
Sebastian Krupinski 0cd375532d Merge pull request #50843 from nextcloud/fix/noid/fix-itipbroker-messages
fix(CalDAV): iTipBroker message generation and testing
2026-02-13 09:51:52 -05:00
Carl Schwan 2391d58eb0 Merge pull request #58107 from nextcloud/local-preview-mkdir-exists
fix: don't try to create preview folder if it already exists
2026-02-13 15:10:24 +01:00
github-actions[bot] 44e7082e5a Merge pull request #58318 from nextcloud/dependabot/npm_and_yarn/qs-6.14.2
chore(deps): Bump qs from 6.14.1 to 6.14.2
2026-02-13 12:39:13 +01:00
Ferdinand Thiessen fee431f9c0 Merge pull request #58003 from nextcloud/fix/57669/show-theming-image-upload-errors
fix(theming): display error messages on image upload and delete previous image only after validation
2026-02-13 11:49:38 +01:00
nextcloud-command 0f91aec1bd chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-13 10:03:50 +00:00
Nextcloud bot bf83faf7cd fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-13 00:41:19 +00:00
github-actions[bot] a793dac97c Merge pull request #58317 from nextcloud/dependabot/github_actions/github-actions-ee4cefd656
chore(deps): Bump the github-actions group with 3 updates
2026-02-13 00:12:39 +00:00
github-actions[bot] d6842d720e Merge pull request #58316 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/nextcloud/dialogs-7.3.0
chore(deps): Bump @nextcloud/dialogs from 7.2.0 to 7.3.0 in /build/frontend-legacy
2026-02-12 23:11:48 +00:00
nextcloud-command 742f8717e3 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-12 22:55:26 +00:00
dependabot[bot] acb9698012 chore(deps): Bump @nextcloud/dialogs in /build/frontend-legacy
Bumps [@nextcloud/dialogs](https://github.com/nextcloud-libraries/nextcloud-dialogs) from 7.2.0 to 7.3.0.
- [Release notes](https://github.com/nextcloud-libraries/nextcloud-dialogs/releases)
- [Changelog](https://github.com/nextcloud-libraries/nextcloud-dialogs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nextcloud-libraries/nextcloud-dialogs/compare/v7.2.0...v7.3.0)

---
updated-dependencies:
- dependency-name: "@nextcloud/dialogs"
  dependency-version: 7.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-12 22:43:30 +00:00
dependabot[bot] ac4c74156a chore(deps): Bump qs from 6.14.1 to 6.14.2
Bumps [qs](https://github.com/ljharb/qs) from 6.14.1 to 6.14.2.
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.14.1...v6.14.2)

---
updated-dependencies:
- dependency-name: qs
  dependency-version: 6.14.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-12 22:42:25 +00:00
github-actions[bot] e00c98cf67 Merge pull request #58315 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/msw-2.12.10
chore(deps-dev): Bump msw from 2.12.9 to 2.12.10 in /build/frontend-legacy
2026-02-12 23:41:12 +01:00
SebastianKrupinski 70d051f602 fix: iTipBroker message generation and testing
Signed-off-by: SebastianKrupinski <krupinskis05@gmail.com>
2026-02-12 15:20:36 -05:00
dependabot[bot] bd4899fc42 chore(deps): Bump the github-actions group with 3 updates
Bumps the github-actions group with 3 updates: [github/codeql-action](https://github.com/github/codeql-action), [cypress-io/github-action](https://github.com/cypress-io/github-action) and [LizardByte/actions](https://github.com/lizardbyte/actions).


Updates `github/codeql-action` from 4.32.0 to 4.32.2
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/b20883b0cd1f46c72ae0ba6d1090936928f9fa30...45cbd0c69e560cd9e7cd7f8c32362050c9b7ded2)

Updates `cypress-io/github-action` from 7.1.1 to 7.1.2
- [Release notes](https://github.com/cypress-io/github-action/releases)
- [Changelog](https://github.com/cypress-io/github-action/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cypress-io/github-action/compare/0f330ebf0d60f87608ed72f1d6232e5644aa3171...84d178e4bbce871e23f2ffa3085898cde0e4f0ec)

Updates `LizardByte/actions` from 2026.129.194351 to 2026.212.22356
- [Release notes](https://github.com/lizardbyte/actions/releases)
- [Commits](https://github.com/lizardbyte/actions/compare/09a6e10dc8175f2933c20bdf35fde0a193a9c00e...9bf3ef783775e17fe6b8dde3585d94ec570b93c2)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.32.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: cypress-io/github-action
  dependency-version: 7.1.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: LizardByte/actions
  dependency-version: 2026.212.22356
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-12 18:52:19 +00:00
dependabot[bot] af1d11434b chore(deps-dev): Bump msw in /build/frontend-legacy
Bumps [msw](https://github.com/mswjs/msw) from 2.12.9 to 2.12.10.
- [Release notes](https://github.com/mswjs/msw/releases)
- [Changelog](https://github.com/mswjs/msw/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mswjs/msw/compare/v2.12.9...v2.12.10)

---
updated-dependencies:
- dependency-name: msw
  dependency-version: 2.12.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-12 18:39:16 +00:00
dependabot[bot] 0578b0dd9c chore(deps-dev): Bump msw from 2.12.9 to 2.12.10
Bumps [msw](https://github.com/mswjs/msw) from 2.12.9 to 2.12.10.
- [Release notes](https://github.com/mswjs/msw/releases)
- [Changelog](https://github.com/mswjs/msw/blob/main/CHANGELOG.md)
- [Commits](https://github.com/mswjs/msw/compare/v2.12.9...v2.12.10)

---
updated-dependencies:
- dependency-name: msw
  dependency-version: 2.12.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-12 18:36:34 +00:00
dependabot[bot] 178517847c chore(deps-dev): Bump eslint-plugin-cypress from 5.2.1 to 5.3.0
Bumps [eslint-plugin-cypress](https://github.com/cypress-io/eslint-plugin-cypress) from 5.2.1 to 5.3.0.
- [Release notes](https://github.com/cypress-io/eslint-plugin-cypress/releases)
- [Commits](https://github.com/cypress-io/eslint-plugin-cypress/compare/v5.2.1...v5.3.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-cypress
  dependency-version: 5.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-12 18:36:05 +00:00
dependabot[bot] 50c163f9a9 chore(deps-dev): Bump @zip.js/zip.js from 2.8.17 to 2.8.20
Bumps [@zip.js/zip.js](https://github.com/gildas-lormeau/zip.js) from 2.8.17 to 2.8.20.
- [Release notes](https://github.com/gildas-lormeau/zip.js/releases)
- [Commits](https://github.com/gildas-lormeau/zip.js/compare/v2.8.17...v2.8.20)

---
updated-dependencies:
- dependency-name: "@zip.js/zip.js"
  dependency-version: 2.8.20
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-12 18:35:36 +00:00
Andy Scherzinger 4cc2bb26ca Merge pull request #58292 from nextcloud/ci/noid/dependabot-v31
Drop dependabot for stable31
2026-02-12 19:32:27 +01:00
Ferdinand Thiessen 202124cd28 Merge pull request #58287 from nextcloud/fix/comments-action
fix(comments): properly handle opening the sidebar when Activity integration is used
2026-02-12 19:10:58 +01:00
Andy Scherzinger 6fb0072a00 ci(deps): Drop dependabot for stable31
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2026-02-12 18:53:50 +01:00
Joas Schilling 8c5fb9c751 Merge pull request #58289 from nextcloud/bugfix/noid/fix-dead-docs-link
fix(docs): Fix dead documentation link for Windows file names
2026-02-12 18:32:36 +01:00
nextcloud-command eb07c52f95 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-12 17:23:17 +00:00
Joas Schilling bb1b12b218 fix(docs): Fix dead documentation link for Windows file names
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-02-12 17:47:37 +01:00
Ferdinand Thiessen f2574fdf34 fix(files): fallback to action id if displayname is empty
This fixes invalid error messages if the action has an empty
displayname, often the case for inline actions

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-12 17:20:30 +01:00
Ferdinand Thiessen cd15bb0679 fix(comments): properly handle opening the sidebar when Activity integration is used
When the activity integration is used we need to open the `activity` tab
not the comments tab.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-12 17:19:04 +01:00
Cristian Scheid 8a703c95ec Merge branch 'master' into fix/57669/show-theming-image-upload-errors
Signed-off-by: Cristian Scheid <74515775+cristianscheid@users.noreply.github.com>
2026-02-12 11:16:47 -03:00
Kate b80816dfb7 Merge pull request #58098 from nextcloud/fix/appframework/types-phpstan
fix(AppFramework): Adjust types so PHPStan understands them
2026-02-12 14:00:47 +01:00
Louis 286d0d23a3 Merge pull request #58283 from nextcloud/chore/files-v4
chore(deps): update `@nextcloud/files` to v4.0.0
2026-02-12 13:56:47 +01:00
nextcloud-command c524562c88 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-12 12:15:28 +00:00
nextcloud-command 7ab1c0f212 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-02-12 08:08:44 -03:00
Cristian Scheid 347c509308 refactor(theming): use isAxiosError for error handling
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-02-12 08:03:03 -03:00
Cristian Scheid 0a5f75e719 fix(theming): display error messages on image upload and delete previous image only after validation
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-02-12 08:03:03 -03:00
Ferdinand Thiessen bb1d814e04 fix(files_sharing): adjust for @nextcloud/files v4
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-12 11:50:07 +01:00
Ferdinand Thiessen 7ef66a6199 fix(files_external): use root id property instead of internal attributes
Root attributes must not be accessed by the internal `attributes`.
Trying to do so will return `undefined`, so instead use the root `id`
property of nodes.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-12 11:49:41 +01:00
Ferdinand Thiessen 85c0dcf136 chore(deps): update @nextcloud/files to v4.0.0
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-12 11:49:21 +01:00
Carl Schwan f6c839d125 refactor(psalm): Modernize migration doc
And remove all the duplication in the subclasses

Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-02-12 11:25:55 +01:00
Kate 4d6959da27 Merge pull request #58261 from nextcloud/fix/simplecontainer/get-return-type 2026-02-12 10:56:53 +01:00
Andy Scherzinger 3d4774edb6 Merge pull request #58273 from nextcloud/fix/folder-tree-2
perf(files): initialize folder tree from current state and store
2026-02-12 07:35:50 +01:00
nextcloud-command e38f96af72 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-12 03:31:28 +01:00
Carl Schwan 0e66ed2233 perf(files): Only request directories from the database
Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-02-12 03:31:27 +01:00
Ferdinand Thiessen 95d7b5608b perf(files): initialize folder tree from current path and store
Initialize the folder tree based on the current directory.
Also only include views needed.

If possible reuse nodes from files store to prevent API call.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-12 03:31:27 +01:00
Ferdinand Thiessen e5c1d80a00 perf(files): only emit initialization once
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-12 03:31:27 +01:00
Ferdinand Thiessen 69f2c17675 refactor(files): only load navigation views needed
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-12 03:31:27 +01:00
Ferdinand Thiessen 2f29ad8ff8 feat(files): allow to include parents in folder tree API
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-12 01:28:46 +01:00
Carl Schwan d35773b99a Merge pull request #57891 from nextcloud/carl/getDirectoryContent-mimetypefilter
perf: Allow filtering the directory content by mimetype
2026-02-12 01:22:10 +01:00
Nextcloud bot 55fb2f395e fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-12 00:20:46 +00:00
Carl Schwan 3da621d7fb Merge pull request #58230 from nextcloud/carl/fix-appdata-scanning
fix(preview): Fix files:app-data-scan for previews
2026-02-12 00:57:28 +01:00
Carl Schwan edd37d349b perf(file-cache): Add mimetype filter on getFolderContents
Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-02-12 00:36:18 +01:00
Carl Schwan 9741f5f17d perf: Allow filtering the directory content by mimetype
Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-02-12 00:35:48 +01:00
Carl Schwan 89a20598e5 fix: Skip test requiring local storage on object store setup
Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-02-12 00:26:22 +01:00
Carl Schwan 3d18cd7cc5 fix(preview): Fix files:app-data-scan for previews
And add unit tests for both migrated files and non-migrated files

Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-02-12 00:26:20 +01:00
github-actions[bot] fdf200e343 Merge pull request #58272 from nextcloud/dependabot/npm_and_yarn/axios-1.13.5
chore(deps): Bump axios from 1.13.2 to 1.13.5
2026-02-11 22:50:07 +01:00
nextcloud-command 5e6c8b6134 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-11 21:03:02 +00:00
dependabot[bot] ce99b0f7ed chore(deps): Bump axios from 1.13.2 to 1.13.5
Bumps [axios](https://github.com/axios/axios) from 1.13.2 to 1.13.5.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.13.2...v1.13.5)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.13.5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-11 20:35:30 +00:00
Andy Scherzinger 47b314067c Merge pull request #58216 from nextcloud/carl/preview-unique-constraints
fix(preview): Handle unique constraints
2026-02-11 20:20:31 +01:00
Carl Schwan 4722f56778 fix(preview): Handle unique constraints
Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-02-11 19:56:11 +01:00
Kate 0fc06b3b87 Merge pull request #58237 from nextcloud/share-target-repair-circles 2026-02-11 17:58:51 +01:00
Robin Appelman f216bf5798 fix: handle circle shares in share target repair
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-02-11 15:39:11 +01:00
Louis d21351701a Merge pull request #58140 from nextcloud/artonge/fix/ignore_abort_error
fix(files): Do not show abort error to the user
2026-02-11 15:03:02 +01:00
nextcloud-command 6c04307e13 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-11 13:42:45 +00:00
Louis Chmn a4f396e648 fix(files): Do not show abort error to the user
Signed-off-by: Louis Chmn <louis@chmn.me>
2026-02-11 13:40:33 +00:00
provokateurin 5c47ce9b40 fix(SimpleContainer): Adjust return type for PHPStan
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-11 11:42:37 +01:00
provokateurin e8d4d435ed fix(IRegistrationContext): Use SimpleContainer in registerService factory
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-11 11:42:37 +01:00
Kate 615d343d96 Merge pull request #58256 from nextcloud/fix/iresult/fetch-all-conditional-return-type 2026-02-11 09:26:55 +01:00
provokateurin 83fbc64c99 fix(IResult): Use more accurate conditional return type for fetchAll
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-11 08:50:13 +01:00
Nextcloud bot 4a9e04962c fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-11 00:20:55 +00:00
Anna feaebeb97e Merge pull request #58223 from nextcloud/fix/oracle-truncate-table
fix: quote tablenames for truncating in oracle
2026-02-10 23:29:34 +01:00
grnd-alt bc5771b0ff fix: correctly quote tablenames for truncating with oracle
Signed-off-by: grnd-alt <git@belakkaf.net>
2026-02-10 22:48:02 +01:00
Josh 57b0630b20 fix(setup): add index properities_name_path_user by default
Added in #52175 but only to the missing indices listener. Resulted in new installations trigger warnings about database missing indices unnecessary. 

Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-10 14:27:43 -05:00
Sebastian Krupinski 63eb9679c2 Merge pull request #58228 from nextcloud/fix/group-shares-cleanup
fix: delete CalDav and CardDav shares upon group deletion
2026-02-10 11:49:15 -05:00
Kate 98cb8b6155 Merge pull request #55632 from nextcloud/feat/preview/expire-previews
feat(preview): Expire previews
2026-02-10 17:35:28 +01:00
Maximilian Martin 6e5baa6928 fix: delete CalDav and CardDav shares upon group deletion
Signed-off-by: Maximilian Martin <maximilian_martin@gmx.de>
2026-02-10 11:14:40 -05:00
Maksim Sukharev a096c89c66 Merge pull request #58218 from nextcloud/fix/57804/clear-status-this-week 2026-02-10 16:56:23 +01:00
nextcloud-command 6563214204 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-10 15:36:54 +00:00
Cristian Scheid 2ddf73f89f fix(user_status): use getFirstDay() from @nextcloud/l10n
Signed-off-by: Cristian Scheid <cristianscheid@gmail.com>
2026-02-10 16:27:51 +01:00
provokateurin fe9e43c165 feat(preview): Expire previews
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-10 15:35:38 +01:00
Ferdinand Thiessen 1a5679b176 Merge pull request #58208 from nextcloud/chore/update-files-4rc3
chore: update `@nextcloud/files` to v4.0.0-rc.3
2026-02-10 15:22:34 +01:00
Ferdinand Thiessen 7b7d74fda2 chore: compile assets
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-10 14:53:19 +01:00
Ferdinand Thiessen f075051f4a test: remove testing internal of libraries and test only app code
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-10 14:50:41 +01:00
Ferdinand Thiessen 0e361550f1 fix(files): add legacy wrapper for upload library
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-10 14:50:41 +01:00
Ferdinand Thiessen 38644873f2 refactor(files): migrate to files registry for reactive file actions
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-10 14:50:41 +01:00
Ferdinand Thiessen 643a815557 refactor(files): migrate file list actions to new files registry
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-10 14:50:41 +01:00
Ferdinand Thiessen c73b85aecb refactor(files): port file list headers to new files registry
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-10 14:50:41 +01:00
Ferdinand Thiessen 4a284f61e6 refactor(files): port filters store to new files registry
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-10 14:50:41 +01:00
Ferdinand Thiessen e088473929 refactor(files_sharing): adjust note to recipient files header
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-10 14:50:41 +01:00
Ferdinand Thiessen 29b47c93ab chore(deps): update @nextcloud/files to v4.0.0-rc.3
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-10 14:50:40 +01:00
github-actions[bot] 935cd2910f Merge pull request #58213 from nextcloud/dependabot/npm_and_yarn/build/frontend-legacy/axios-1.13.5
chore(deps): Bump axios from 1.12.2 to 1.13.5 in /build/frontend-legacy
2026-02-10 13:21:20 +00:00
nextcloud-command 422bca31bf chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-10 12:39:26 +00:00
dependabot[bot] adce834b4f chore(deps): Bump axios from 1.12.2 to 1.13.5 in /build/frontend-legacy
Bumps [axios](https://github.com/axios/axios) from 1.12.2 to 1.13.5.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.12.2...v1.13.5)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.13.5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-10 13:23:36 +01:00
Andy Scherzinger 7da7f50203 Merge pull request #58209 from nextcloud/carl/local-preview-fix
fix(preview): Fix scanning preview
2026-02-10 12:38:58 +01:00
Anna 8c01737a63 Merge pull request #58206 from nextcloud/fix/preview-637/cast-snowflake-id-to-int
fix(snowflake): cast lastId to string
2026-02-10 11:46:07 +01:00
Kate e0c282d531 Merge pull request #58195 from nextcloud/ci/rector-apply
ci: Add workflow to apply rector changes weekly
2026-02-10 10:36:25 +01:00
Nextcloud bot d65aa0b7c3 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-10 00:21:48 +00:00
Carl Schwan 543b46f3aa fix(preview): Fix scanning preview
Make sure we set the mimetype string representation and not int
representation.

Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-02-09 22:49:59 +01:00
Anna Larch 99a1150ec2 fix(snowflake): cast lastId to int
Signed-off-by: Anna Larch <anna@nextcloud.com>
2026-02-09 21:36:20 +01:00
Robin Appelman a3cc9754f8 feat: improve VerifyMountPointEvent event
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-02-09 18:42:30 +01:00
provokateurin 0469f57a3a ci: Add workflow to apply rector changes weekly
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-09 14:55:54 +01:00
provokateurin 97c09753c3 fix(AppFramework): Adjust types so PHPStan understands them
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-09 14:08:42 +01:00
Salvatore Martire 101819821a feat: add oc-ownerid and oc-permissions headers on PUT DAV requests
Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2026-02-09 10:47:57 +01:00
Salvatore Martire 62ab29960f refactor: extract logic to hide mounts and share information
The permission string for directories and files can contain M or S
depending if they are respectively coming from a mount or a share. This
information is not to be disclosed when the share is a public one.

Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2026-02-09 10:47:57 +01:00
Salvatore Martire 2eecf81833 fix: add user id header when redirecting to default app
Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2026-02-06 20:25:20 +01:00
Salvatore Martire 0e944c190d fix(dav): set user id header in response earlier
Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com>
2026-02-06 20:24:23 +01:00
Robin Appelman 2e9f6c37d5 fix: don't try to create preview folder if it already exists
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-02-05 15:22:54 +01:00
iLinaza d33cac0a2f fix: #45034 clear cached user groups on pre hooks
Signed-off-by: iLinaza <i.linaza@gmail.com>
2024-04-25 16:49:56 +02:00
3790 changed files with 61784 additions and 53751 deletions
+4 -4
View File
@@ -24,7 +24,7 @@ package.json @nextcloud/server-dependabot @next
package-lock.json @nextcloud/server-dependabot
# App maintainers
/apps/admin_audit/appinfo/info.xml @luka-nextcloud @blizzz
/apps/admin_audit/appinfo/info.xml @luka-nextcloud @samin-z
/apps/cloud_federation_api/appinfo/info.xml @nfebe @mejo-
/apps/comments/appinfo/info.xml @edward-ly @sorbaugh
/apps/contactsinteraction/appinfo/info.xml @kesselb @SebastianKrupinski
@@ -46,16 +46,16 @@ package-lock.json @nextcloud/server-dependabot
/apps/files_versions/appinfo/info.xml @artonge @icewind1991
/apps/oauth2/appinfo/info.xml @julien-nc @ChristophWurst
/apps/provisioning_api/appinfo/info.xml @provokateurin @nickvergessen
/apps/settings/appinfo/info.xml @JuliaKirschenheuter @sorbaugh
/apps/settings/appinfo/info.xml @hweihwang @sorbaugh
/apps/sharebymail/appinfo/info.xml @Altahrim @skjnldsv
/apps/systemtags/appinfo/info.xml @Antreesy @marcelklehr
/apps/theming/appinfo/info.xml @skjnldsv @juliusknorr
/apps/twofactor_backupcodes/appinfo/info.xml @miaulalala @ChristophWurst
/apps/updatenotification/appinfo/info.xml @JuliaKirschenheuter @sorbaugh
/apps/updatenotification/appinfo/info.xml @enjeck @sorbaugh
/apps/user_ldap/appinfo/info.xml @come-nc @blizzz
/apps/user_status/appinfo/info.xml @Antreesy @nickvergessen
/apps/weather_status/appinfo/info.xml @julien-nc @juliusknorr
/apps/webhook_listeners/appinfo/info.xml @come-nc @julien-nc
/apps/webhook_listeners/appinfo/info.xml @janepie @julien-nc
/apps/workflowengine/appinfo/info.xml @blizzz @juliusknorr
# Files frontend expertise
+1 -1
View File
@@ -73,7 +73,7 @@ body:
options:
- "32"
- "33"
- "master"
- "34 (master)"
validations:
required: true
- type: dropdown
-43
View File
@@ -165,46 +165,3 @@ updates:
# no major updates on stable branches
- dependency-name: "*"
update-types: ["version-update:semver-major"]
# Composer dependencies for linting and testing
- package-ecosystem: composer
target-branch: stable31
directories:
- "/"
- "/build/integration"
- "/vendor-bin/cs-fixer"
- "/vendor-bin/openapi-extractor"
- "/vendor-bin/phpunit"
- "/vendor-bin/psalm"
schedule:
interval: weekly
day: saturday
time: "04:00"
timezone: Europe/Paris
labels:
- "3. to review"
- "feature: dependencies"
ignore:
# only patch updates on stable branches
- dependency-name: "*"
update-types: ["version-update:semver-major", "version-update:semver-minor"]
# frontend dependencies
- package-ecosystem: npm
target-branch: stable31
directory: "/"
schedule:
interval: weekly
day: saturday
time: "04:00"
timezone: Europe/Paris
open-pull-requests-limit: 20
labels:
- "3. to review"
- "feature: dependencies"
# Disable automatic rebasing because without a build CI will likely fail anyway
rebase-strategy: "disabled"
ignore:
# no major updates on stable branches
- dependency-name: "*"
update-types: ["version-update:semver-major"]
+4
View File
@@ -23,3 +23,7 @@
- [ ] [Backports requested](https://github.com/nextcloud/backportbot/#usage) where applicable (ex: critical bugfixes)
- [ ] [Labels added](https://github.com/nextcloud/server/labels) where applicable (ex: bug/enhancement, `3. to review`, feature component)
- [ ] [Milestone added](https://github.com/nextcloud/server/milestones) for target branch/version (ex: 32.x for `stable32`)
## AI (if applicable)
- [ ] The content of this PR was partly or fully generated using AI
+7 -4
View File
@@ -20,7 +20,7 @@ jobs:
src: ${{ steps.changes.outputs.src }}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -58,7 +58,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -74,6 +74,9 @@ jobs:
autocheckers:
runs-on: ubuntu-latest-low
needs: changes
if: needs.changes.outputs.src != 'false'
strategy:
matrix:
php-versions: ['8.2']
@@ -88,7 +91,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -125,4 +128,4 @@ jobs:
steps:
- name: Summary status
run: if ${{ needs.autocheckers.result != 'success' || (needs.changes.outputs.src != 'false' && needs.autoloader.result != 'success') }}; then exit 1; fi
run: if ${{ needs.changes.outputs.src != 'false' && (needs.autocheckers.result != 'success' || needs.autoloader.result != 'success') }}; then exit 1; fi
@@ -21,7 +21,7 @@ jobs:
steps:
- name: Check requirement
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
+45
View File
@@ -0,0 +1,45 @@
# SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
# SPDX-License-Identifier: AGPL-3.0-or-later
name: Auto-label bug reports
on:
issues:
types: [opened]
jobs:
add-version-label:
if: contains(github.event.issue.title, '[Bug]')
runs-on: ubuntu-latest
permissions:
issues: write
steps:
- name: Extract version number and apply label
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
script: |
const body = context.payload.issue.body || '';
const normalizedBody = body.replace(/\r\n?/g, '\n');
let label = '';
// Extract Nextcloud Server version number from a block like:
// ### Nextcloud Server version
// 32
const versionMatch = normalizedBody.match(/### Nextcloud Server version\s*\n+([0-9]{1,3})\b/);
let nextcloudVersion = null;
if (versionMatch) {
nextcloudVersion = parseInt(versionMatch[1], 10);
label = nextcloudVersion + '-feedback';
}
if (label) {
try {
await github.rest.issues.addLabels({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
labels: [label]
});
} catch (error) {
core.setFailed(`Failed to add label "${label}": ${error.message || error}`);
}
}
+2 -2
View File
@@ -37,13 +37,13 @@ jobs:
persist-credentials: false
- name: Initialize CodeQL
uses: github/codeql-action/init@b20883b0cd1f46c72ae0ba6d1090936928f9fa30 # v4.32.0
uses: github/codeql-action/init@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }}
config-file: ./.github/codeql-config.yml
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@b20883b0cd1f46c72ae0ba6d1090936928f9fa30 # v4.32.0
uses: github/codeql-action/analyze@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
with:
category: "/language:${{matrix.language}}"
+1 -1
View File
@@ -124,7 +124,7 @@ jobs:
fallbackNpm: '^11.3'
- name: Set up node ${{ steps.package-engines-versions.outputs.nodeVersion }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ steps.package-engines-versions.outputs.nodeVersion }}
cache: npm
+30 -19
View File
@@ -14,6 +14,7 @@ jobs:
runs-on: ubuntu-latest
permissions:
contents: none
pull-requests: read
# On pull requests and if the comment starts with `/update-3rdparty`
if: github.event.issue.pull_request != '' && startsWith(github.event.comment.body, '/update-3rdparty')
@@ -27,8 +28,25 @@ jobs:
comment-id: ${{ github.event.comment.id }}
reactions: '+1'
# issue_comment events carry no pull_request context in their payload, so we
# must fetch the PR via the API. This also gives us base.ref for free, avoiding
# a second API call. The GITHUB_TOKEN needs pull-requests:read (granted above).
- name: Get pull request metadata
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
id: get-pr
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const pull = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.issue.number,
});
core.setOutput('head_repo', pull.data.head.repo?.full_name ?? '');
core.setOutput('base_ref', pull.data.base.ref);
- name: Disabled on forks
if: ${{ github.event.pull_request.head.repo.full_name != github.repository }}
if: steps.get-pr.outputs.head_repo != github.repository
run: |
echo 'Can not execute /update-3rdparty on forks'
exit 1
@@ -46,24 +64,17 @@ jobs:
ref: ${{ steps.comment-branch.outputs.head_ref }}
- name: Register server reference to fallback to master branch
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const baseRef = context.payload.pull_request.base.ref
if (baseRef === 'main' || baseRef === 'master') {
core.exportVariable('server_ref', 'master');
console.log('Setting server_ref to master');
} else {
const regex = /^stable(\d+)$/
const match = baseRef.match(regex)
if (match) {
core.exportVariable('server_ref', match[0]);
console.log('Setting server_ref to ' + match[0]);
} else {
console.log('Not based on master/main/stable*, so skipping pull 3rdparty command');
}
}
run: |
base_ref="${{ steps.get-pr.outputs.base_ref }}"
if [[ "$base_ref" == "main" || "$base_ref" == "master" ]]; then
echo "server_ref=master" >> "$GITHUB_ENV"
echo "Setting server_ref to master"
elif [[ "$base_ref" =~ ^stable[0-9]+$ ]]; then
echo "server_ref=$base_ref" >> "$GITHUB_ENV"
echo "Setting server_ref to $base_ref"
else
echo "Not based on master/main/stable*, so skipping pull 3rdparty command"
fi
- name: Setup git
run: |
+5 -16
View File
@@ -41,12 +41,6 @@ jobs:
PUPPETEER_SKIP_DOWNLOAD: true
steps:
- name: Disabled on forks
if: ${{ github.event.pull_request.head.repo.full_name != github.repository }}
run: |
echo 'Can not run cypress on forks'
exit 1
- name: Checkout server
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
@@ -72,7 +66,7 @@ jobs:
fallbackNpm: '^11.3'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
@@ -160,7 +154,7 @@ jobs:
path: ./
- name: Set up node ${{ needs.init.outputs.nodeVersion }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ needs.init.outputs.nodeVersion }}
@@ -171,15 +165,11 @@ jobs:
run: ./node_modules/cypress/bin/cypress install
- name: Run ${{ matrix.containers == 'component' && 'component' || 'E2E' }} cypress tests
uses: cypress-io/github-action@0f330ebf0d60f87608ed72f1d6232e5644aa3171 # v7.1.1
uses: cypress-io/github-action@783cb3f07983868532cabaedaa1e6c00ff4786a8 # v7.1.9
with:
# We already installed the dependencies in the init job
install: false
component: ${{ matrix.containers == 'component' }}
group: ${{ matrix.use-cypress-cloud && matrix.containers == 'component' && 'Run component' || matrix.use-cypress-cloud && 'Run E2E' || '' }}
# cypress env
ci-build-id: ${{ matrix.use-cypress-cloud && format('{0}-{1}', github.sha, github.run_number) || '' }}
tag: ${{ matrix.use-cypress-cloud && github.event_name || '' }}
env:
# Needs to be prefixed with CYPRESS_
CYPRESS_BRANCH: ${{ env.BRANCH }}
@@ -188,14 +178,13 @@ jobs:
# Needed for some specific code workarounds
TESTING: true
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
SPLIT: ${{ matrix.total-containers }}
SPLIT_INDEX: ${{ matrix.containers == 'component' && 0 || matrix.containers }}
SPLIT_RANDOM_SEED: ${{ github.run_id }}
SETUP_TESTING: ${{ matrix.containers == 'setup' && 'true' || '' }}
- name: Upload snapshots and videos
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
if: always()
with:
name: snapshots_${{ matrix.containers }}
@@ -218,7 +207,7 @@ jobs:
run: docker exec nextcloud-e2e-test-server_${{ env.APP_NAME }} tar -cvjf - data > data.tar
- name: Upload data archive
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
if: failure() && matrix.containers != 'component'
with:
name: nc_data_${{ matrix.containers }}
+3 -3
View File
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -81,7 +81,7 @@ jobs:
if [[ "${{ matrix.ftpd }}" == 'pure-ftpd' ]]; then docker run --name ftp -d --net host -e "PUBLICHOST=localhost" -e FTP_USER_NAME=test -e FTP_USER_PASS=test -e FTP_USER_HOME=/home/test -v /tmp/ftp:/home/test -v /tmp/ftp:/etc/pure-ftpd/passwd stilliard/pure-ftpd; fi
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -115,7 +115,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-files-external-ftp
+5 -5
View File
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -80,7 +80,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -115,7 +115,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-files-external-s3
@@ -169,7 +169,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -197,7 +197,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-files-external-s3
+4 -4
View File
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -73,11 +73,11 @@ jobs:
- name: Set up sftpd
run: |
sudo mkdir /tmp/sftp
sudo chown -R 0777 /tmp/sftp
sudo chmod -R 0777 /tmp/sftp
if [[ '${{ matrix.sftpd }}' == 'openssh' ]]; then docker run -p 2222:22 --name sftp -d -v /tmp/sftp:/home/test atmoz/sftp 'test:test:::data'; fi
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -104,7 +104,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-files-external-sftp
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
+3 -3
View File
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -81,7 +81,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -116,7 +116,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-files-external-smb
+3 -3
View File
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -76,7 +76,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -108,7 +108,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-files-external-webdav
+3 -3
View File
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -70,7 +70,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -97,7 +97,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-files-external-generic
@@ -73,7 +73,7 @@ jobs:
fi
- name: Set up php 8.2
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
timeout-minutes: 5
with:
php-version: 8.2
+57 -57
View File
@@ -19,7 +19,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -52,69 +52,69 @@ jobs:
name: ${{ matrix.service }} (${{ matrix.endpoint }} endpoint) php${{ matrix.php-versions }}
steps:
- name: Checkout server
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
- name: Checkout server
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, redis, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
coverage: 'none'
ini-file: development
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, redis, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
coverage: 'none'
ini-file: development
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Python
uses: LizardByte/actions/actions/setup_python@09a6e10dc8175f2933c20bdf35fde0a193a9c00e # v2026.129.194351
with:
python-version: '2.7'
- name: Set up Python
uses: LizardByte/actions/actions/setup_python@0affa4f7bcb27562658960eee840eff8ff844578 # v2026.328.161128
with:
python-version: '2.7'
- name: Set up CalDAVTester
run: |
git clone --depth=1 https://github.com/apple/ccs-caldavtester.git CalDAVTester
git clone --depth=1 https://github.com/apple/ccs-pycalendar.git pycalendar
- name: Set up CalDAVTester
run: |
git clone --depth=1 https://github.com/apple/ccs-caldavtester.git CalDAVTester
git clone --depth=1 https://github.com/apple/ccs-pycalendar.git pycalendar
- name: Set up Nextcloud
run: |
mkdir data
./occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-host=127.0.0.1 --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
# disable the trashbin, so recurrent deletion of the same object works
./occ config:app:set dav calendarRetentionObligation --value=0
# Prepare users
OC_PASS=user01 ./occ user:add --password-from-env user01
OC_PASS=user02 ./occ user:add --password-from-env user02
# Prepare calendars
./occ dav:create-calendar user01 calendar
./occ dav:create-calendar user01 shared
./occ dav:create-calendar user02 calendar
# Prepare address books
./occ dav:create-addressbook user01 addressbook
./occ dav:create-addressbook user02 addressbook
- name: Set up Nextcloud
run: |
mkdir data
./occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-host=127.0.0.1 --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
# disable the trashbin, so recurrent deletion of the same object works
./occ config:app:set dav calendarRetentionObligation --value=0
# Prepare users
OC_PASS=user01 ./occ user:add --password-from-env user01
OC_PASS=user02 ./occ user:add --password-from-env user02
# Prepare calendars
./occ dav:create-calendar user01 calendar
./occ dav:create-calendar user01 shared
./occ dav:create-calendar user02 calendar
# Prepare address books
./occ dav:create-addressbook user01 addressbook
./occ dav:create-addressbook user02 addressbook
- name: Run Nextcloud
run: |
php -S localhost:8888 &
- name: Run Nextcloud
run: |
php -S localhost:8888 &
- name: Run CalDAVTester
run: |
cp "apps/dav/tests/testsuits/caldavtest/serverinfo-${{ matrix.endpoint }}${{ matrix.endpoint == 'old' && (matrix.service == 'CardDAV' && '-carddav' || '-caldav') || '' }}-endpoint.xml" "apps/dav/tests/testsuits/caldavtest/serverinfo.xml"
pushd CalDAVTester
PYTHONPATH="../pycalendar/src" python testcaldav.py --print-details-onfail --basedir "../apps/dav/tests/testsuits/caldavtest" -o cdt.txt \
"${{ matrix.service }}/current-user-principal.xml" \
"${{ matrix.service }}/sync-report.xml" \
${{ matrix.endpoint == 'new' && format('{0}/sharing-{1}.xml', matrix.service, matrix.service == 'CalDAV' && 'calendars' || 'addressbooks') || ';' }}
popd
- name: Run CalDAVTester
run: |
cp "apps/dav/tests/testsuits/caldavtest/serverinfo-${{ matrix.endpoint }}${{ matrix.endpoint == 'old' && (matrix.service == 'CardDAV' && '-carddav' || '-caldav') || '' }}-endpoint.xml" "apps/dav/tests/testsuits/caldavtest/serverinfo.xml"
pushd CalDAVTester
PYTHONPATH="../pycalendar/src" python testcaldav.py --print-details-onfail --basedir "../apps/dav/tests/testsuits/caldavtest" -o cdt.txt \
"${{ matrix.service }}/current-user-principal.xml" \
"${{ matrix.service }}/sync-report.xml" \
${{ matrix.endpoint == 'new' && format('{0}/sharing-{1}.xml', matrix.service, matrix.service == 'CalDAV' && 'calendars' || 'addressbooks') || ';' }}
popd
- name: Print Nextcloud logs
if: always()
run: |
cat data/nextcloud.log
- name: Print Nextcloud logs
if: always()
run: |
cat data/nextcloud.log
caldav-integration-summary:
permissions:
+2 -2
View File
@@ -19,7 +19,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -58,7 +58,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
+2 -3
View File
@@ -19,7 +19,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -82,7 +82,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -95,7 +95,6 @@ jobs:
- name: Wait for S3
run: |
sleep 10
curl -f -m 1 --retry-connrefused --retry 10 --retry-delay 10 http://localhost:9000/minio/health/ready
- name: Set up Nextcloud
+2 -2
View File
@@ -25,7 +25,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -121,7 +121,7 @@ jobs:
ref: ${{ matrix.activity-versions }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
+2 -2
View File
@@ -28,7 +28,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -68,7 +68,7 @@ jobs:
fallbackNpm: '^11.3'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
+5 -2
View File
@@ -25,7 +25,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -44,6 +44,9 @@ jobs:
lint:
runs-on: ubuntu-latest
needs: changes
if: needs.changes.outputs.src != 'false'
name: php-cs
steps:
@@ -53,7 +56,7 @@ jobs:
persist-credentials: false
- name: Set up php
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
timeout-minutes: 5
with:
php-version: 8.2
+2 -2
View File
@@ -23,7 +23,7 @@ jobs:
outputs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -58,7 +58,7 @@ jobs:
persist-credentials: false
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
+44 -1
View File
@@ -18,9 +18,37 @@ concurrency:
cancel-in-progress: true
jobs:
changes:
runs-on: ubuntu-latest-low
permissions:
contents: read
pull-requests: read
outputs:
src: ${{ steps.changes.outputs.src }}
steps:
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
filters: |
src:
- '.github/workflows/**'
- '**/src/**'
- '**/appinfo/info.xml'
- 'package.json'
- 'package-lock.json'
- '**.css'
- '**.scss'
- '**.vue'
lint:
runs-on: ubuntu-latest
needs: changes
if: needs.changes.outputs.src != 'false'
name: stylelint
steps:
@@ -37,7 +65,7 @@ jobs:
fallbackNpm: '^11.3'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
@@ -51,3 +79,18 @@ jobs:
- name: Lint
run: npm run stylelint
summary:
permissions:
contents: none
runs-on: ubuntu-latest-low
needs: [changes, lint]
if: always()
# This is the summary, we just avoid to rename it so that branch protection rules still match
name: stylelint
steps:
- name: Summary status
run: if ${{ needs.changes.outputs.src != 'false' && needs.lint.result != 'success' }}; then exit 1; fi
+2 -2
View File
@@ -29,7 +29,7 @@ jobs:
src: ${{ steps.changes.outputs.src }}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -71,7 +71,7 @@ jobs:
fallbackNpm: '^11.3'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
+3 -6
View File
@@ -31,7 +31,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -70,7 +70,7 @@ jobs:
fallbackNpm: '^11.3'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
@@ -83,14 +83,11 @@ jobs:
run: |
npm ci
# - name: Test
# run: npm run test --if-present
- name: Test and process coverage
run: npm run test:coverage
- name: Collect coverage
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./coverage/lcov.info,./coverage/legacy/lcov.info
+2 -2
View File
@@ -28,7 +28,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -68,7 +68,7 @@ jobs:
fallbackNpm: '^11.3'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
+1 -1
View File
@@ -49,7 +49,7 @@ jobs:
fallbackNpm: '^11.3'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
+3 -3
View File
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -85,7 +85,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -117,7 +117,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-azure
+3 -4
View File
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -86,7 +86,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -111,7 +111,6 @@ jobs:
- name: Wait for S3
run: |
sleep 10
curl -f -m 1 --retry-connrefused --retry 10 --retry-delay 10 http://localhost:9000/minio/health/ready
- name: PHPUnit
@@ -123,7 +122,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-s3
+3 -3
View File
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -83,7 +83,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -113,7 +113,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-swift
+1 -1
View File
@@ -31,7 +31,7 @@ jobs:
persist-credentials: false
- name: Set up php
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
timeout-minutes: 5
with:
php-version: '8.2'
+11 -10
View File
@@ -15,7 +15,13 @@ jobs:
performance-testing:
runs-on: ubuntu-latest
if: ${{ github.repository_owner != 'nextcloud-gmbh' }}
# Skip entirely on fork PRs so the job result is 'skipped' rather than
# 'failure'. The profiler action uses github.event.pull_request.head.repo.clone_url
# and GITHUB_TOKEN in ways that do not work reliably from forks, and a
# clean skip is far less confusing for contributors than a mid-run error.
if: >-
github.repository_owner != 'nextcloud-gmbh' &&
github.event.pull_request.head.repo.full_name == github.repository
permissions:
pull-requests: write
@@ -28,11 +34,6 @@ jobs:
name: performance-${{ matrix.php-versions }}
steps:
- name: Disabled on forks
if: ${{ github.event.pull_request.head.repo.full_name != github.repository }}
run: |
echo 'Can not run performance tests on forks'
exit 1
- name: Checkout server before PR
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
@@ -42,7 +43,7 @@ jobs:
ref: ${{ github.event.pull_request.base.ref }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -63,7 +64,7 @@ jobs:
ref: ${{ github.event.pull_request.head.ref }}
- name: Run before measurements
uses: nextcloud/profiler@6801ee10fc80f10b444388fb6ca9b36ad8a2ea83
uses: nextcloud/profiler@6a74c915048285b35b8e1cd96c0835a635945044
with:
run: |
curl -s -X PROPFIND -u test:test http://localhost:8080/remote.php/dav/files/test
@@ -85,7 +86,7 @@ jobs:
- name: Run after measurements
id: compare
uses: nextcloud/profiler@6801ee10fc80f10b444388fb6ca9b36ad8a2ea83
uses: nextcloud/profiler@6a74c915048285b35b8e1cd96c0835a635945044
with:
run: |
curl -s -X PROPFIND -u test:test http://localhost:8080/remote.php/dav/files/test
@@ -99,7 +100,7 @@ jobs:
- name: Upload profiles
if: always()
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f
with:
name: profiles
path: |
+1 -1
View File
@@ -56,4 +56,4 @@ jobs:
- name: PHPUnit
uses: docker://ghcr.io/nextcloud/continuous-integration-php8.4-32bit:latest
with:
args: /bin/sh -c "composer run test -- --exclude-group PRIMARY-azure,PRIMARY-s3,PRIMARY-swift,Memcached,Redis,RoutingWeirdness"
args: /bin/sh -c "composer run test -- --exclude-group PRIMARY-azure --exclude-group PRIMARY-s3 --exclude-group PRIMARY-swift --exclude-group Memcached --exclude-group Redis --exclude-group RoutingWeirdness"
+3 -3
View File
@@ -31,7 +31,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -98,7 +98,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -132,7 +132,7 @@ jobs:
- name: Upload db code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.db.xml
flags: phpunit-mariadb
+3 -3
View File
@@ -28,7 +28,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -78,7 +78,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -104,7 +104,7 @@ jobs:
- name: Upload code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.xml
flags: phpunit-memcached
+3 -3
View File
@@ -28,7 +28,7 @@ jobs:
src: ${{ steps.changes.outputs.src }}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -127,7 +127,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -162,7 +162,7 @@ jobs:
- name: Upload db code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.db.xml
flags: phpunit-mysql
+3 -3
View File
@@ -31,7 +31,7 @@ jobs:
src: ${{ steps.changes.outputs.src }}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -98,7 +98,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -132,7 +132,7 @@ jobs:
- name: Upload db code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.db.xml
flags: phpunit-mysql
+3 -3
View File
@@ -30,7 +30,7 @@ jobs:
src: ${{ steps.changes.outputs.src }}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -81,7 +81,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -110,7 +110,7 @@ jobs:
- name: Upload nodb code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.nodb.xml
flags: phpunit-nodb
@@ -21,7 +21,7 @@ jobs:
src: ${{ steps.changes.outputs.src}}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -78,7 +78,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -104,7 +104,7 @@ jobs:
curl -f -m 1 --retry-connrefused --retry 10 --retry-delay 10 http://localhost:9000/minio/health/ready
- name: PHPUnit
run: composer run test:db
run: composer run test:db -- --log-junit junit.xml
- name: S3 logs
if: always()
+3 -3
View File
@@ -31,7 +31,7 @@ jobs:
src: ${{ steps.changes.outputs.src }}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -105,7 +105,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -132,7 +132,7 @@ jobs:
- name: Upload db code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.db.xml
flags: phpunit-oci
+3 -3
View File
@@ -31,7 +31,7 @@ jobs:
src: ${{ steps.changes.outputs.src }}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -98,7 +98,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -127,7 +127,7 @@ jobs:
- name: Upload db code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.db.xml
flags: phpunit-postgres
+3 -3
View File
@@ -31,7 +31,7 @@ jobs:
src: ${{ steps.changes.outputs.src }}
steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
@@ -81,7 +81,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
timeout-minutes: 5
with:
php-version: ${{ matrix.php-versions }}
@@ -114,7 +114,7 @@ jobs:
- name: Upload db code coverage
if: ${{ !cancelled() && matrix.coverage }}
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
with:
files: ./clover.db.xml
flags: phpunit-sqlite
+70
View File
@@ -0,0 +1,70 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
#
# SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
# SPDX-License-Identifier: MIT
name: Apply rector changes
on:
workflow_dispatch:
schedule:
# At 14:30 on Sundays
- cron: '30 14 * * 0'
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
php-versions: [ '8.2' ]
name: rector-apply
steps:
- name: Checkout
id: checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
ref: ${{ github.event.repository.default_branch }}
- name: Set up php${{ matrix.php-versions }}
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
with:
php-version: ${{ matrix.php-versions }}
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
coverage: none
ini-file: development
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Install dependencies
run: |
composer remove nextcloud/ocp --dev --no-scripts
composer i
git restore lib/composer/composer
- name: Rector
run: composer run rector
- name: Create Pull Request
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
commit-message: 'refactor: Apply rector changes'
committer: GitHub <noreply@github.com>
author: nextcloud-command <nextcloud-command@users.noreply.github.com>
signoff: true
branch: automated/noid/rector-changes
title: 'Apply rector changes'
labels: |
technical debt
3. to review
+1 -1
View File
@@ -26,7 +26,7 @@ jobs:
submodules: true
- name: Set up php
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
with:
php-version: '8.2'
extensions: apcu,ctype,curl,dom,fileinfo,ftp,gd,imagick,intl,json,ldap,mbstring,openssl,pdo_sqlite,posix,sqlite,xml,zip
+1 -1
View File
@@ -20,7 +20,7 @@ jobs:
issues: write
steps:
- uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # v9
- uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v9
with:
repo-token: ${{ secrets.COMMAND_BOT_PAT }}
stale-issue-message: >
+65 -11
View File
@@ -21,10 +21,35 @@ concurrency:
cancel-in-progress: true
jobs:
changes:
runs-on: ubuntu-latest-low
outputs:
src: ${{ steps.changes.outputs.src }}
steps:
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
id: changes
continue-on-error: true
with:
filters: |
src:
- '.github/workflows/**'
- '3rdparty/**'
- '**/appinfo/**'
- '**/lib/**'
- '**/templates/**'
- 'vendor/**'
- 'vendor-bin/**'
- 'composer.json'
- 'composer.lock'
- '**.php'
static-code-analysis:
runs-on: ubuntu-latest
if: ${{ github.event_name != 'push' && github.repository_owner != 'nextcloud-gmbh' }}
needs: changes
if: ${{ needs.changes.outputs.src != 'false' && github.event_name != 'push' && github.repository_owner != 'nextcloud-gmbh' }}
steps:
- name: Checkout
@@ -34,7 +59,7 @@ jobs:
submodules: true
- name: Set up php
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: '8.2'
@@ -56,7 +81,8 @@ jobs:
static-code-analysis-security:
runs-on: ubuntu-latest
if: ${{ github.repository_owner != 'nextcloud-gmbh' }}
needs: changes
if: ${{ needs.changes.outputs.src != 'false' && github.repository_owner != 'nextcloud-gmbh' }}
permissions:
security-events: write
@@ -69,7 +95,7 @@ jobs:
submodules: true
- name: Set up php
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: '8.2'
@@ -88,14 +114,15 @@ jobs:
- name: Upload Security Analysis results to GitHub
if: always()
uses: github/codeql-action/upload-sarif@b20883b0cd1f46c72ae0ba6d1090936928f9fa30 # v3
uses: github/codeql-action/upload-sarif@c10b8064de6f491fea524254123dbe5e09572f13 # v3
with:
sarif_file: results.sarif
static-code-analysis-ocp:
runs-on: ubuntu-latest
if: ${{ github.event_name != 'push' && github.repository_owner != 'nextcloud-gmbh' }}
needs: changes
if: ${{ needs.changes.outputs.src != 'false' && github.event_name != 'push' && github.repository_owner != 'nextcloud-gmbh' }}
steps:
- name: Checkout
@@ -105,7 +132,7 @@ jobs:
submodules: true
- name: Set up php
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: '8.2'
@@ -127,7 +154,8 @@ jobs:
static-code-analysis-ncu:
runs-on: ubuntu-latest
if: ${{ github.event_name != 'push' && github.repository_owner != 'nextcloud-gmbh' }}
needs: changes
if: ${{ needs.changes.outputs.src != 'false' && github.event_name != 'push' && github.repository_owner != 'nextcloud-gmbh' }}
steps:
- name: Checkout
@@ -137,7 +165,7 @@ jobs:
submodules: true
- name: Set up php
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
timeout-minutes: 5
with:
php-version: '8.2'
@@ -155,7 +183,8 @@ jobs:
static-code-analysis-strict:
runs-on: ubuntu-latest
if: ${{ github.event_name != 'push' && github.repository_owner != 'nextcloud-gmbh' }}
needs: changes
if: ${{ needs.changes.outputs.src != 'false' && github.event_name != 'push' && github.repository_owner != 'nextcloud-gmbh' }}
steps:
- name: Checkout
@@ -165,7 +194,7 @@ jobs:
submodules: true
- name: Set up php
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 #v2.36.0
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f #v2.37.0
with:
php-version: '8.2'
extensions: ctype,curl,dom,fileinfo,gd,imagick,intl,json,mbstring,openssl,pdo_sqlite,posix,sqlite,xml,zip
@@ -178,3 +207,28 @@ jobs:
- name: Psalm
run: composer run psalm:strict -- --threads=1 --monochrome --no-progress --output-format=github
summary:
permissions:
contents: none
runs-on: ubuntu-latest-low
needs: [changes, static-code-analysis, static-code-analysis-security, static-code-analysis-ocp, static-code-analysis-ncu, static-code-analysis-strict]
if: always()
name: static-code-analysis-summary
steps:
- name: Summary status
run: |
if ${{ needs.changes.outputs.src != 'false' && (
needs.static-code-analysis-security.result != 'success' ||
(github.event_name != 'push' && (
needs.static-code-analysis.result != 'success' ||
needs.static-code-analysis-ocp.result != 'success' ||
needs.static-code-analysis-ncu.result != 'success' ||
needs.static-code-analysis-strict.result != 'success'
))
) }}; then
exit 1
fi
@@ -115,7 +115,7 @@ jobs:
committer: GitHub <noreply@github.com>
author: nextcloud-command <nextcloud-command@users.noreply.github.com>
signoff: true
branch: "automated/noid/${{ matrix.branches }}-update-min-supported-desktop-version"
branch: "automated/noid/update-min-supported-desktop-version"
title: "chore: Update minimum supported desktop version to ${{ steps.extract-version.outputs.VERSION }}"
base: "master"
body: |
+5 -4
View File
@@ -17,16 +17,17 @@ node_modules/
# ignore all apps except core ones
/apps*/*
!/apps/admin_audit
!/apps/appstore
!/apps/cloud_federation_api
!/apps/comments
!/apps/contactsinteraction
!/apps/dashboard
!/apps/dav
!/apps/files
!/apps/encryption
!/apps/federation
!/apps/federatedfilesharing
!/apps/sharebymail
!/apps/encryption
!/apps/files
!/apps/files_external
!/apps/files_reminders
!/apps/files_sharing
@@ -38,9 +39,9 @@ node_modules/
!/apps/profile
!/apps/provisioning_api
!/apps/settings
!/apps/sharebymail
!/apps/systemtags
!/apps/testing
!/apps/admin_audit
!/apps/updatenotification
!/apps/theming
!/apps/twofactor_backupcodes
+3 -6
View File
@@ -129,11 +129,10 @@
## Rule: Map /remote* --> /remote.php* including the query string
##
## Context:
## - XXX: `QSA` seems unnecessary (no-op) here (query string is passed by default when the replacement URI doesn't contain a query string)
## - XXX: Is this even used anymore? Seems a relic from <NC12
##
RewriteRule ^remote/(.*) remote.php [QSA,L]
RewriteRule ^remote/(.*) remote.php [L]
##
## Rule: Prevent access to non-public files
@@ -148,21 +147,19 @@
## - Intentionally excludes URIs used for HTTPS certificate verifications
## - RFC 8555 / ACME HTTP Challenges (acme-challenge)
## - File-based Validations (pki-validation)
## - XXX: `QSA` seems unnecessary (no-op) here (query string is passed by default when the replacement URI doesn't contain a query string)
## - XXX: Sometimes we are using `/index.php` and other times `index.php` as our replacement URI; this may be incorrect
##
RewriteRule ^\.well-known/(?!acme-challenge|pki-validation) /index.php [QSA,L]
RewriteRule ^\.well-known/(?!acme-challenge|pki-validation) /index.php [L]
##
## Rule: Map the ocm-provider handling to our main frontend controller (/index.php)
##
## Context:
## - XXX: `QSA` seems unnecessary (no-op) here (query string is passed by default when the replacement URI doesn't contain a query string)
## - XXX: Sometimes we are using `/index.php` and other times `index.php` as our replacement URI; this may be incorrect
##
RewriteRule ^ocm-provider/?$ index.php [QSA,L]
RewriteRule ^ocm-provider/?$ index.php [L]
##
## Rule: Prevent access to more non-public files
+35
View File
@@ -4,6 +4,7 @@
# Global exclude
.editorconfig
.envrc
.git
.git-blame-ignore-revs
.gitattributes
@@ -11,12 +12,44 @@
.gitignore
.gitmodules
.idea
.jshint
.jshintrc
.l10nignore
.mailmap
.nextcloudignore
.noopenapi
.npmignore
.php-cs-fixer*
.pre-commit-config.yaml
.tag
.tx
CHANGELOG.md
CODE_OF_CONDUCT.md
COPYING-README
DESIGN.md
Makefile
README.md
SECURITY.md
codecov.yml
cs-fixer
csfixer
custom.d.ts
cypress
cypress.config.ts
eslint.config.js
flake.lock
flake.nix
openapi-extractor
phpunit
psalm
psalm*.xml
rector
stylelint.config.js
tests
tsconfig.json
vite.config.ts
vitest.config.ts
window.d.ts
# Server specific
/.devcontainer
@@ -27,3 +60,5 @@ tests
/config/config.php
/contribute
/data
/openapi.json
/vendor-bin
+6
View File
@@ -8,6 +8,12 @@ source_file = translationfiles/templates/admin_audit.pot
source_lang = en
type = PO
[o:nextcloud:p:nextcloud:r:appstore]
file_filter = translationfiles/<lang>/appstore.po
source_file = translationfiles/templates/appstore.pot
source_lang = en
type = PO
[o:nextcloud:p:nextcloud:r:cloud_federation_api]
file_filter = translationfiles/<lang>/cloud_federation_api.po
source_file = translationfiles/templates/cloud_federation_api.pot
+7
View File
@@ -0,0 +1,7 @@
OC.L10N.register(
"admin_audit",
{
"Auditing / Logging" : "নিরীক্ষা",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "নেক্সটক্লাউডের নিরীক্ষামূলক সক্ষমতা প্রদান করে যেমন লগিং ফাইল অ্যাক্সেস বা অন্য কোনো জরুরী পদক্ষেপসমূহ"
},
"nplurals=2; plural=(n != 1);");
+5
View File
@@ -0,0 +1,5 @@
{ "translations": {
"Auditing / Logging" : "নিরীক্ষা",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "নেক্সটক্লাউডের নিরীক্ষামূলক সক্ষমতা প্রদান করে যেমন লগিং ফাইল অ্যাক্সেস বা অন্য কোনো জরুরী পদক্ষেপসমূহ"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+7
View File
@@ -0,0 +1,7 @@
OC.L10N.register(
"admin_audit",
{
"Auditing / Logging" : "Аудит / Лог",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Nextcloud-д файл нэвтрэлт болон мэдрэмтгий үйлдлүүдийг бүртгэх зэрэг лог хөтлөх чадварыг олгодог."
},
"nplurals=2; plural=(n != 1);");
+5
View File
@@ -0,0 +1,5 @@
{ "translations": {
"Auditing / Logging" : "Аудит / Лог",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Nextcloud-д файл нэвтрэлт болон мэдрэмтгий үйлдлүүдийг бүртгэх зэрэг лог хөтлөх чадварыг олгодог."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+16
View File
@@ -0,0 +1,16 @@
version = 1
SPDX-PackageName = "nextcloud"
SPDX-PackageSupplier = "Nextcloud <info@nextcloud.com>"
SPDX-PackageDownloadLocation = "https://github.com/nextcloud/server"
[[annotations]]
path = ["tests/fixtures/categories.json", "tests/fixtures/categories-api-response.json"]
precedence = "aggregate"
SPDX-FileCopyrightText = "2026 Nextcloud GmbH and Nextcloud contributors"
SPDX-License-Identifier = "CC-BY-SA-4.0"
[[annotations]]
path = ["img/app.svg"]
precedence = "aggregate"
SPDX-FileCopyrightText = "2018-2024 Google LLC"
SPDX-License-Identifier = "Apache-2.0"
+22
View File
@@ -0,0 +1,22 @@
<?xml version="1.0"?>
<!--
- SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>settings</id>
<name>Nextcloud Appstore</name>
<summary>Nextcloud Appstore</summary>
<description>Nextcloud Appstore</description>
<version>1.0.0</version>
<licence>agpl</licence>
<author>Nextcloud</author>
<namespace>Appstore</namespace>
<category>customization</category>
<bugs>https://github.com/nextcloud/server/issues</bugs>
<dependencies>
<nextcloud min-version="33" max-version="33"/>
</dependencies>
</info>
+22
View File
@@ -0,0 +1,22 @@
<?php
// autoload.php @generated by Composer
if (PHP_VERSION_ID < 50600) {
if (!headers_sent()) {
header('HTTP/1.1 500 Internal Server Error');
}
$err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
if (!ini_get('display_errors')) {
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
fwrite(STDERR, $err);
} elseif (!headers_sent()) {
echo $err;
}
}
throw new RuntimeException($err);
}
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInitAppstore::getLoader();
+13
View File
@@ -0,0 +1,13 @@
{
"config" : {
"vendor-dir": ".",
"optimize-autoloader": true,
"classmap-authoritative": true,
"autoloader-suffix": "Appstore"
},
"autoload" : {
"psr-4": {
"OCA\\Appstore\\": "../lib/"
}
}
}
+18
View File
@@ -0,0 +1,18 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "d751713988987e9331980363e24189ce",
"packages": [],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": {},
"prefer-stable": false,
"prefer-lowest": false,
"platform": {},
"platform-dev": {},
"plugin-api-version": "2.6.0"
}
@@ -0,0 +1,579 @@
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer\Autoload;
/**
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
*
* $loader = new \Composer\Autoload\ClassLoader();
*
* // register classes with namespaces
* $loader->add('Symfony\Component', __DIR__.'/component');
* $loader->add('Symfony', __DIR__.'/framework');
*
* // activate the autoloader
* $loader->register();
*
* // to enable searching the include path (eg. for PEAR packages)
* $loader->setUseIncludePath(true);
*
* In this example, if you try to use a class in the Symfony\Component
* namespace or one of its children (Symfony\Component\Console for instance),
* the autoloader will first look for the class under the component/
* directory, and it will then fallback to the framework/ directory if not
* found before giving up.
*
* This class is loosely based on the Symfony UniversalClassLoader.
*
* @author Fabien Potencier <fabien@symfony.com>
* @author Jordi Boggiano <j.boggiano@seld.be>
* @see https://www.php-fig.org/psr/psr-0/
* @see https://www.php-fig.org/psr/psr-4/
*/
class ClassLoader
{
/** @var \Closure(string):void */
private static $includeFile;
/** @var string|null */
private $vendorDir;
// PSR-4
/**
* @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
* @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
* @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
* List of PSR-0 prefixes
*
* Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
*
* @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
* @var list<string>
*/
private $fallbackDirsPsr0 = array();
/** @var bool */
private $useIncludePath = false;
/**
* @var array<string, string>
*/
private $classMap = array();
/** @var bool */
private $classMapAuthoritative = false;
/**
* @var array<string, bool>
*/
private $missingClasses = array();
/** @var string|null */
private $apcuPrefix;
/**
* @var array<string, self>
*/
private static $registeredLoaders = array();
/**
* @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
$this->vendorDir = $vendorDir;
self::initializeIncludeClosure();
}
/**
* @return array<string, list<string>>
*/
public function getPrefixes()
{
if (!empty($this->prefixesPsr0)) {
return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
}
return array();
}
/**
* @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
return $this->prefixDirsPsr4;
}
/**
* @return list<string>
*/
public function getFallbackDirs()
{
return $this->fallbackDirsPsr0;
}
/**
* @return list<string>
*/
public function getFallbackDirsPsr4()
{
return $this->fallbackDirsPsr4;
}
/**
* @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
return $this->classMap;
}
/**
* @param array<string, string> $classMap Class to filename map
*
* @return void
*/
public function addClassMap(array $classMap)
{
if ($this->classMap) {
$this->classMap = array_merge($this->classMap, $classMap);
} else {
$this->classMap = $classMap;
}
}
/**
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
* @param string $prefix The prefix
* @param list<string>|string $paths The PSR-0 root directories
* @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
$paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
$paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
$paths
);
}
return;
}
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
$this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
$paths
);
}
}
/**
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param list<string>|string $paths The PSR-4 base directories
* @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
* @return void
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
$paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
$paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
$paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
// Register directories for a new namespace.
$length = strlen($prefix);
if ('\\' !== $prefix[$length - 1]) {
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
$this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
$paths
);
}
}
/**
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
* @param string $prefix The prefix
* @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
public function set($prefix, $paths)
{
if (!$prefix) {
$this->fallbackDirsPsr0 = (array) $paths;
} else {
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
}
}
/**
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
* @return void
*/
public function setPsr4($prefix, $paths)
{
if (!$prefix) {
$this->fallbackDirsPsr4 = (array) $paths;
} else {
$length = strlen($prefix);
if ('\\' !== $prefix[$length - 1]) {
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
$this->prefixDirsPsr4[$prefix] = (array) $paths;
}
}
/**
* Turns on searching the include path for class files.
*
* @param bool $useIncludePath
*
* @return void
*/
public function setUseIncludePath($useIncludePath)
{
$this->useIncludePath = $useIncludePath;
}
/**
* Can be used to check if the autoloader uses the include path to check
* for classes.
*
* @return bool
*/
public function getUseIncludePath()
{
return $this->useIncludePath;
}
/**
* Turns off searching the prefix and fallback directories for classes
* that have not been registered with the class map.
*
* @param bool $classMapAuthoritative
*
* @return void
*/
public function setClassMapAuthoritative($classMapAuthoritative)
{
$this->classMapAuthoritative = $classMapAuthoritative;
}
/**
* Should class lookup fail if not found in the current class map?
*
* @return bool
*/
public function isClassMapAuthoritative()
{
return $this->classMapAuthoritative;
}
/**
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
*
* @param string|null $apcuPrefix
*
* @return void
*/
public function setApcuPrefix($apcuPrefix)
{
$this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
}
/**
* The APCu prefix in use, or null if APCu caching is not enabled.
*
* @return string|null
*/
public function getApcuPrefix()
{
return $this->apcuPrefix;
}
/**
* Registers this instance as an autoloader.
*
* @param bool $prepend Whether to prepend the autoloader or not
*
* @return void
*/
public function register($prepend = false)
{
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
if (null === $this->vendorDir) {
return;
}
if ($prepend) {
self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
} else {
unset(self::$registeredLoaders[$this->vendorDir]);
self::$registeredLoaders[$this->vendorDir] = $this;
}
}
/**
* Unregisters this instance as an autoloader.
*
* @return void
*/
public function unregister()
{
spl_autoload_unregister(array($this, 'loadClass'));
if (null !== $this->vendorDir) {
unset(self::$registeredLoaders[$this->vendorDir]);
}
}
/**
* Loads the given class or interface.
*
* @param string $class The name of the class
* @return true|null True if loaded, null otherwise
*/
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
$includeFile = self::$includeFile;
$includeFile($file);
return true;
}
return null;
}
/**
* Finds the path to the file where the class is defined.
*
* @param string $class The name of the class
*
* @return string|false The path if found, false otherwise
*/
public function findFile($class)
{
// class map lookup
if (isset($this->classMap[$class])) {
return $this->classMap[$class];
}
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
return false;
}
if (null !== $this->apcuPrefix) {
$file = apcu_fetch($this->apcuPrefix.$class, $hit);
if ($hit) {
return $file;
}
}
$file = $this->findFileWithExtension($class, '.php');
// Search for Hack files if we are running on HHVM
if (false === $file && defined('HHVM_VERSION')) {
$file = $this->findFileWithExtension($class, '.hh');
}
if (null !== $this->apcuPrefix) {
apcu_add($this->apcuPrefix.$class, $file);
}
if (false === $file) {
// Remember that this class does not exist.
$this->missingClasses[$class] = true;
}
return $file;
}
/**
* Returns the currently registered loaders keyed by their corresponding vendor directories.
*
* @return array<string, self>
*/
public static function getRegisteredLoaders()
{
return self::$registeredLoaders;
}
/**
* @param string $class
* @param string $ext
* @return string|false
*/
private function findFileWithExtension($class, $ext)
{
// PSR-4 lookup
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
$first = $class[0];
if (isset($this->prefixLengthsPsr4[$first])) {
$subPath = $class;
while (false !== $lastPos = strrpos($subPath, '\\')) {
$subPath = substr($subPath, 0, $lastPos);
$search = $subPath . '\\';
if (isset($this->prefixDirsPsr4[$search])) {
$pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
foreach ($this->prefixDirsPsr4[$search] as $dir) {
if (file_exists($file = $dir . $pathEnd)) {
return $file;
}
}
}
}
}
// PSR-4 fallback dirs
foreach ($this->fallbackDirsPsr4 as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
return $file;
}
}
// PSR-0 lookup
if (false !== $pos = strrpos($class, '\\')) {
// namespaced class name
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
} else {
// PEAR-like class name
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
}
if (isset($this->prefixesPsr0[$first])) {
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
if (0 === strpos($class, $prefix)) {
foreach ($dirs as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
return $file;
}
}
}
}
}
// PSR-0 fallback dirs
foreach ($this->fallbackDirsPsr0 as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
return $file;
}
}
// PSR-0 include paths.
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
return $file;
}
return false;
}
/**
* @return void
*/
private static function initializeIncludeClosure()
{
if (self::$includeFile !== null) {
return;
}
/**
* Scope isolated include.
*
* Prevents access to $this/self from included files.
*
* @param string $file
* @return void
*/
self::$includeFile = \Closure::bind(static function($file) {
include $file;
}, null, null);
}
}
@@ -0,0 +1,396 @@
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer;
use Composer\Autoload\ClassLoader;
use Composer\Semver\VersionParser;
/**
* This class is copied in every Composer installed project and available to all
*
* See also https://getcomposer.org/doc/07-runtime.md#installed-versions
*
* To require its presence, you can require `composer-runtime-api ^2.0`
*
* @final
*/
class InstalledVersions
{
/**
* @var string|null if set (by reflection by Composer), this should be set to the path where this class is being copied to
* @internal
*/
private static $selfDir = null;
/**
* @var mixed[]|null
* @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
*/
private static $installed;
/**
* @var bool
*/
private static $installedIsLocalDir;
/**
* @var bool|null
*/
private static $canGetVendors;
/**
* @var array[]
* @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/
private static $installedByVendor = array();
/**
* Returns a list of all package names which are present, either by being installed, replaced or provided
*
* @return string[]
* @psalm-return list<string>
*/
public static function getInstalledPackages()
{
$packages = array();
foreach (self::getInstalled() as $installed) {
$packages[] = array_keys($installed['versions']);
}
if (1 === \count($packages)) {
return $packages[0];
}
return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
}
/**
* Returns a list of all package names with a specific type e.g. 'library'
*
* @param string $type
* @return string[]
* @psalm-return list<string>
*/
public static function getInstalledPackagesByType($type)
{
$packagesByType = array();
foreach (self::getInstalled() as $installed) {
foreach ($installed['versions'] as $name => $package) {
if (isset($package['type']) && $package['type'] === $type) {
$packagesByType[] = $name;
}
}
}
return $packagesByType;
}
/**
* Checks whether the given package is installed
*
* This also returns true if the package name is provided or replaced by another package
*
* @param string $packageName
* @param bool $includeDevRequirements
* @return bool
*/
public static function isInstalled($packageName, $includeDevRequirements = true)
{
foreach (self::getInstalled() as $installed) {
if (isset($installed['versions'][$packageName])) {
return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false;
}
}
return false;
}
/**
* Checks whether the given package satisfies a version constraint
*
* e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
*
* Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
*
* @param VersionParser $parser Install composer/semver to have access to this class and functionality
* @param string $packageName
* @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
* @return bool
*/
public static function satisfies(VersionParser $parser, $packageName, $constraint)
{
$constraint = $parser->parseConstraints((string) $constraint);
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
return $provided->matches($constraint);
}
/**
* Returns a version constraint representing all the range(s) which are installed for a given package
*
* It is easier to use this via isInstalled() with the $constraint argument if you need to check
* whether a given version of a package is installed, and not just whether it exists
*
* @param string $packageName
* @return string Version constraint usable with composer/semver
*/
public static function getVersionRanges($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
$ranges = array();
if (isset($installed['versions'][$packageName]['pretty_version'])) {
$ranges[] = $installed['versions'][$packageName]['pretty_version'];
}
if (array_key_exists('aliases', $installed['versions'][$packageName])) {
$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
}
if (array_key_exists('replaced', $installed['versions'][$packageName])) {
$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
}
if (array_key_exists('provided', $installed['versions'][$packageName])) {
$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
}
return implode(' || ', $ranges);
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
*/
public static function getVersion($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
if (!isset($installed['versions'][$packageName]['version'])) {
return null;
}
return $installed['versions'][$packageName]['version'];
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
*/
public static function getPrettyVersion($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
if (!isset($installed['versions'][$packageName]['pretty_version'])) {
return null;
}
return $installed['versions'][$packageName]['pretty_version'];
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
*/
public static function getReference($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
if (!isset($installed['versions'][$packageName]['reference'])) {
return null;
}
return $installed['versions'][$packageName]['reference'];
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
*/
public static function getInstallPath($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @return array
* @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
*/
public static function getRootPackage()
{
$installed = self::getInstalled();
return $installed[0]['root'];
}
/**
* Returns the raw installed.php data for custom implementations
*
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
* @return array[]
* @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
*/
public static function getRawData()
{
@trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
if (null === self::$installed) {
// only require the installed.php file if this file is loaded from its dumped location,
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
if (substr(__DIR__, -8, 1) !== 'C') {
self::$installed = include __DIR__ . '/installed.php';
} else {
self::$installed = array();
}
}
return self::$installed;
}
/**
* Returns the raw data of all installed.php which are currently loaded for custom implementations
*
* @return array[]
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/
public static function getAllRawData()
{
return self::getInstalled();
}
/**
* Lets you reload the static array from another file
*
* This is only useful for complex integrations in which a project needs to use
* this class but then also needs to execute another project's autoloader in process,
* and wants to ensure both projects have access to their version of installed.php.
*
* A typical case would be PHPUnit, where it would need to make sure it reads all
* the data it needs from this class, then call reload() with
* `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
* the project in which it runs can then also use this class safely, without
* interference between PHPUnit's dependencies and the project's dependencies.
*
* @param array[] $data A vendor/composer/installed.php data set
* @return void
*
* @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
*/
public static function reload($data)
{
self::$installed = $data;
self::$installedByVendor = array();
// when using reload, we disable the duplicate protection to ensure that self::$installed data is
// always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not,
// so we have to assume it does not, and that may result in duplicate data being returned when listing
// all installed packages for example
self::$installedIsLocalDir = false;
}
/**
* @return string
*/
private static function getSelfDir()
{
if (self::$selfDir === null) {
self::$selfDir = strtr(__DIR__, '\\', '/');
}
return self::$selfDir;
}
/**
* @return array[]
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/
private static function getInstalled()
{
if (null === self::$canGetVendors) {
self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
}
$installed = array();
$copiedLocalDir = false;
if (self::$canGetVendors) {
$selfDir = self::getSelfDir();
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
$vendorDir = strtr($vendorDir, '\\', '/');
if (isset(self::$installedByVendor[$vendorDir])) {
$installed[] = self::$installedByVendor[$vendorDir];
} elseif (is_file($vendorDir.'/composer/installed.php')) {
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
$required = require $vendorDir.'/composer/installed.php';
self::$installedByVendor[$vendorDir] = $required;
$installed[] = $required;
if (self::$installed === null && $vendorDir.'/composer' === $selfDir) {
self::$installed = $required;
self::$installedIsLocalDir = true;
}
}
if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) {
$copiedLocalDir = true;
}
}
}
if (null === self::$installed) {
// only require the installed.php file if this file is loaded from its dumped location,
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
if (substr(__DIR__, -8, 1) !== 'C') {
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
$required = require __DIR__ . '/installed.php';
self::$installed = $required;
} else {
self::$installed = array();
}
}
if (self::$installed !== array() && !$copiedLocalDir) {
$installed[] = self::$installed;
}
return $installed;
}
}
+21
View File
@@ -0,0 +1,21 @@
Copyright (c) Nils Adermann, Jordi Boggiano
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
@@ -0,0 +1,16 @@
<?php
// autoload_classmap.php @generated by Composer
$vendorDir = dirname(__DIR__);
$baseDir = $vendorDir;
return array(
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
'OCA\\Appstore\\AppInfo\\Application' => $baseDir . '/../lib/AppInfo/Application.php',
'OCA\\Appstore\\Controller\\ApiController' => $baseDir . '/../lib/Controller/ApiController.php',
'OCA\\Appstore\\Controller\\AppSettingsController' => $baseDir . '/../lib/Controller/AppSettingsController.php',
'OCA\\Appstore\\Controller\\DiscoverController' => $baseDir . '/../lib/Controller/DiscoverController.php',
'OCA\\Appstore\\Controller\\PageController' => $baseDir . '/../lib/Controller/PageController.php',
'OCA\\Appstore\\Search\\AppSearch' => $baseDir . '/../lib/Search/AppSearch.php',
);
@@ -0,0 +1,9 @@
<?php
// autoload_namespaces.php @generated by Composer
$vendorDir = dirname(__DIR__);
$baseDir = $vendorDir;
return array(
);
@@ -0,0 +1,10 @@
<?php
// autoload_psr4.php @generated by Composer
$vendorDir = dirname(__DIR__);
$baseDir = $vendorDir;
return array(
'OCA\\Appstore\\' => array($baseDir . '/../lib'),
);
@@ -0,0 +1,37 @@
<?php
// autoload_real.php @generated by Composer
class ComposerAutoloaderInitAppstore
{
private static $loader;
public static function loadClassLoader($class)
{
if ('Composer\Autoload\ClassLoader' === $class) {
require __DIR__ . '/ClassLoader.php';
}
}
/**
* @return \Composer\Autoload\ClassLoader
*/
public static function getLoader()
{
if (null !== self::$loader) {
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInitAppstore', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInitAppstore', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInitAppstore::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->register(true);
return $loader;
}
}
@@ -0,0 +1,42 @@
<?php
// autoload_static.php @generated by Composer
namespace Composer\Autoload;
class ComposerStaticInitAppstore
{
public static $prefixLengthsPsr4 = array (
'O' =>
array (
'OCA\\Appstore\\' => 13,
),
);
public static $prefixDirsPsr4 = array (
'OCA\\Appstore\\' =>
array (
0 => __DIR__ . '/..' . '/../lib',
),
);
public static $classMap = array (
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
'OCA\\Appstore\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php',
'OCA\\Appstore\\Controller\\ApiController' => __DIR__ . '/..' . '/../lib/Controller/ApiController.php',
'OCA\\Appstore\\Controller\\AppSettingsController' => __DIR__ . '/..' . '/../lib/Controller/AppSettingsController.php',
'OCA\\Appstore\\Controller\\DiscoverController' => __DIR__ . '/..' . '/../lib/Controller/DiscoverController.php',
'OCA\\Appstore\\Controller\\PageController' => __DIR__ . '/..' . '/../lib/Controller/PageController.php',
'OCA\\Appstore\\Search\\AppSearch' => __DIR__ . '/..' . '/../lib/Search/AppSearch.php',
);
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInitAppstore::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitAppstore::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitAppstore::$classMap;
}, null, ClassLoader::class);
}
}
@@ -0,0 +1,5 @@
{
"packages": [],
"dev": false,
"dev-package-names": []
}
@@ -0,0 +1,23 @@
<?php return array(
'root' => array(
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => '3efb1d80e9851e0c33311a7722f523e020654691',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
'dev' => false,
),
'versions' => array(
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => '3efb1d80e9851e0c33311a7722f523e020654691',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
'dev_requirement' => false,
),
),
);

Before

Width:  |  Height:  |  Size: 321 B

After

Width:  |  Height:  |  Size: 321 B

+30
View File
@@ -0,0 +1,30 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Appstore\AppInfo;
use OCP\AppFramework\App;
use OCP\AppFramework\Bootstrap\IBootContext;
use OCP\AppFramework\Bootstrap\IBootstrap;
use OCP\AppFramework\Bootstrap\IRegistrationContext;
class Application extends App implements IBootstrap {
public const APP_ID = 'appstore';
/**
* @param array $urlParams
*/
public function __construct(array $urlParams = []) {
parent::__construct(self::APP_ID, $urlParams);
}
public function register(IRegistrationContext $context): void {
}
public function boot(IBootContext $context): void {
}
}
@@ -0,0 +1,440 @@
<?php
declare(strict_types=1);
/*!
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Appstore\Controller;
use OC\App\AppManager;
use OC\App\AppStore\Bundles\BundleFetcher;
use OC\App\AppStore\Fetcher\AppFetcher;
use OC\App\AppStore\Fetcher\CategoryFetcher;
use OC\App\AppStore\Version\VersionParser;
use OC\App\DependencyAnalyzer;
use OC\Installer;
use OCA\Appstore\AppInfo\Application;
use OCP\App\AppPathNotFoundException;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\Attribute\ApiRoute;
use OCP\AppFramework\Http\Attribute\OpenAPI;
use OCP\AppFramework\Http\Attribute\PasswordConfirmationRequired;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCS\OCSException;
use OCP\AppFramework\OCSController;
use OCP\IAppConfig;
use OCP\IConfig;
use OCP\IGroup;
use OCP\IGroupManager;
use OCP\IRequest;
use OCP\L10N\IFactory;
use OCP\Server;
use OCP\Support\Subscription\IRegistry;
use Psr\Log\LoggerInterface;
#[OpenAPI(scope: OpenAPI::SCOPE_ADMINISTRATION)]
class ApiController extends OCSController {
/** @var array */
private $allApps = [];
public function __construct(
IRequest $request,
private IConfig $config,
private IAppConfig $appConfig,
private AppManager $appManager,
private DependencyAnalyzer $dependencyAnalyzer,
private CategoryFetcher $categoryFetcher,
private AppFetcher $appFetcher,
private IFactory $l10nFactory,
private BundleFetcher $bundleFetcher,
private Installer $installer,
private IRegistry $subscriptionRegistry,
private LoggerInterface $logger,
) {
parent::__construct(Application::APP_ID, $request);
}
/**
* Get all available categories
*/
#[ApiRoute('GET', '/api/v1/apps/categories')]
public function listCategories(): DataResponse {
$currentLanguage = substr($this->l10nFactory->findLanguage(), 0, 2);
$categories = $this->categoryFetcher->get();
$categories = array_map(fn ($category) => [
'id' => $category['id'],
'displayName' => $category['translations'][$currentLanguage]['name'] ?? $category['translations']['en']['name'],
], $categories);
return new DataResponse(array_values($categories));
}
/**
* Get all available apps
*/
#[ApiRoute('GET', '/api/v1/apps')]
public function listApps(): DataResponse {
$apps = $this->getAllApps();
$ignoreMaxApps = $this->config->getSystemValue('app_install_overwrite', []);
if (!is_array($ignoreMaxApps)) {
$this->logger->warning('The value given for app_install_overwrite is not an array. Ignoring...');
$ignoreMaxApps = [];
}
// Extend existing app details
$apps = array_map(function (array $appData) use ($ignoreMaxApps) {
if (isset($appData['appstoreData'])) {
$appstoreData = $appData['appstoreData'];
$appData['screenshot'] = $this->createProxyPreviewUrl($appstoreData['screenshots'][0]['url'] ?? '');
$appData['category'] = $appstoreData['categories'];
$appData['releases'] = $appstoreData['releases'];
}
$newVersion = $this->installer->isUpdateAvailable($appData['id']);
if ($newVersion) {
$appData['update'] = $newVersion;
}
// fix groups to be an array
$groups = [];
if (is_string($appData['groups'])) {
$groups = json_decode($appData['groups']);
// ensure 'groups' is an array
if (!is_array($groups)) {
$groups = [$groups];
}
}
$appData['groups'] = $groups;
// analyze dependencies
$ignoreMax = in_array($appData['id'], $ignoreMaxApps);
$missing = $this->dependencyAnalyzer->analyze($appData, $ignoreMax);
$appData['missingDependencies'] = $missing;
$appData['missingMinNextcloudVersion'] = !isset($appData['dependencies']['nextcloud']['@attributes']['min-version']);
$appData['missingMaxNextcloudVersion'] = !isset($appData['dependencies']['nextcloud']['@attributes']['max-version']);
$appData['isCompatible'] = $this->dependencyAnalyzer->isMarkedCompatible($appData);
$appData['internal'] = in_array($appData['id'], $this->appManager->getAlwaysEnabledApps());
return $appData;
}, $apps);
usort($apps, $this->sortApps(...));
return new DataResponse(array_values($apps));
}
/**
* Enable one apps
*
* App will be enabled for specific groups only if $groups is defined
*
* @param string $appId - The app to enable
* @param array $groups - The groups to enable the app for
* @return DataResponse
*/
#[PasswordConfirmationRequired]
#[ApiRoute('POST', '/api/v1/apps/enable')]
public function enableApp(string $appId, array $groups = []): DataResponse {
try {
$updateRequired = false;
$appId = $this->appManager->cleanAppId($appId);
// Check if app is already downloaded
if (!$this->installer->isDownloaded($appId)) {
$this->installer->downloadApp($appId);
}
$this->installer->installApp($appId);
if (count($groups) > 0) {
$this->appManager->enableAppForGroups($appId, $this->getGroupList($groups));
} else {
$this->appManager->enableApp($appId);
}
$updateRequired = $updateRequired || $this->appManager->isUpgradeRequired($appId);
return new DataResponse(['update_required' => $updateRequired]);
} catch (\Throwable $e) {
$this->logger->error('could not enable app', ['exception' => $e]);
throw new OCSException('could not enable app', Http::STATUS_INTERNAL_SERVER_ERROR, $e);
}
}
/**
* Disable an app
*/
#[PasswordConfirmationRequired]
#[ApiRoute('POST', '/api/v1/apps/disable')]
public function disableApp(string $appId): DataResponse {
try {
$appId = $this->appManager->cleanAppId($appId);
$this->appManager->disableApp($appId);
return new DataResponse([]);
} catch (\Exception $e) {
$this->logger->error('could not disable app', ['exception' => $e]);
throw new OCSException('could not disable app', Http::STATUS_INTERNAL_SERVER_ERROR, $e);
}
}
/**
* Uninstall an app
*/
#[PasswordConfirmationRequired]
#[ApiRoute('POST', '/api/v1/apps/uninstall')]
public function uninstallApp(string $appId): DataResponse {
$appId = $this->appManager->cleanAppId($appId);
$result = $this->installer->removeApp($appId);
if ($result !== false) {
// If this app was force enabled, remove the force-enabled-state
$this->appManager->removeOverwriteNextcloudRequirement($appId);
$this->appManager->clearAppsCache();
return new DataResponse([]);
}
throw new OCSException('could not remove app', Http::STATUS_INTERNAL_SERVER_ERROR);
}
/**
* Update an app
*/
#[PasswordConfirmationRequired]
#[ApiRoute('POST', '/api/v1/apps/update')]
public function updateApp(string $appId): DataResponse {
$appId = $this->appManager->cleanAppId($appId);
$this->config->setSystemValue('maintenance', true);
try {
$result = $this->installer->updateAppstoreApp($appId);
$this->config->setSystemValue('maintenance', false);
if ($result === false) {
throw new \Exception('Update failed');
}
} catch (\Exception $ex) {
$this->config->setSystemValue('maintenance', false);
throw new OCSException('could not update app', Http::STATUS_INTERNAL_SERVER_ERROR, $ex);
}
return new DataResponse([]);
}
/**
* Force enable an app.
*
* @return JSONResponse
*/
#[PasswordConfirmationRequired]
#[ApiRoute('POST', '/api/v1/apps/force')]
public function force(string $appId): DataResponse {
$appId = $this->appManager->cleanAppId($appId);
$this->appManager->overwriteNextcloudRequirement($appId);
return new DataResponse([]);
}
/**
* Convert URL to proxied URL so CSP is no problem
*/
private function createProxyPreviewUrl(string $url): string {
if ($url === '') {
return '';
}
return 'https://usercontent.apps.nextcloud.com/' . base64_encode($url);
}
private function fetchApps() {
$appClass = new \OC_App();
$apps = $appClass->listAllApps();
foreach ($apps as $app) {
$app['installed'] = true;
if (isset($app['screenshot'][0])) {
$appScreenshot = $app['screenshot'][0] ?? null;
if (is_array($appScreenshot)) {
// Screenshot with thumbnail
$appScreenshot = $appScreenshot['@value'];
}
$app['screenshot'] = $this->createProxyPreviewUrl($appScreenshot);
}
$this->allApps[$app['id']] = $app;
}
$apps = $this->getAppsForCategory('');
$supportedApps = $this->subscriptionRegistry->delegateGetSupportedApps();
foreach ($apps as $app) {
$app['appstore'] = true;
if (!array_key_exists($app['id'], $this->allApps)) {
$this->allApps[$app['id']] = $app;
} else {
$this->allApps[$app['id']] = array_merge($app, $this->allApps[$app['id']]);
}
if (in_array($app['id'], $supportedApps)) {
$this->allApps[$app['id']]['level'] = \OC_App::supportedApp;
}
}
// add bundle information
$bundles = $this->bundleFetcher->getBundles();
foreach ($bundles as $bundle) {
foreach ($bundle->getAppIdentifiers() as $identifier) {
foreach ($this->allApps as &$app) {
if ($app['id'] === $identifier) {
$app['bundleIds'][] = $bundle->getIdentifier();
continue;
}
}
}
}
}
private function getAllApps() {
if (empty($this->allApps)) {
$this->fetchApps();
}
return $this->allApps;
}
/**
* Get all apps for a category from the app store
*
* @param string $requestedCategory
* @return array
* @throws \Exception
*/
private function getAppsForCategory($requestedCategory = ''): array {
$versionParser = new VersionParser();
$formattedApps = [];
$apps = $this->appFetcher->get();
foreach ($apps as $app) {
// Skip all apps not in the requested category
if ($requestedCategory !== '') {
$isInCategory = false;
foreach ($app['categories'] as $category) {
if ($category === $requestedCategory) {
$isInCategory = true;
}
}
if (!$isInCategory) {
continue;
}
}
if (!isset($app['releases'][0]['rawPlatformVersionSpec'])) {
continue;
}
$nextcloudVersion = $versionParser->getVersion($app['releases'][0]['rawPlatformVersionSpec']);
$nextcloudVersionDependencies = [];
if ($nextcloudVersion->getMinimumVersion() !== '') {
$nextcloudVersionDependencies['nextcloud']['@attributes']['min-version'] = $nextcloudVersion->getMinimumVersion();
}
if ($nextcloudVersion->getMaximumVersion() !== '') {
$nextcloudVersionDependencies['nextcloud']['@attributes']['max-version'] = $nextcloudVersion->getMaximumVersion();
}
$phpVersion = $versionParser->getVersion($app['releases'][0]['rawPhpVersionSpec']);
try {
$this->appManager->getAppPath($app['id']);
$existsLocally = true;
} catch (AppPathNotFoundException) {
$existsLocally = false;
}
$phpDependencies = [];
if ($phpVersion->getMinimumVersion() !== '') {
$phpDependencies['php']['@attributes']['min-version'] = $phpVersion->getMinimumVersion();
}
if ($phpVersion->getMaximumVersion() !== '') {
$phpDependencies['php']['@attributes']['max-version'] = $phpVersion->getMaximumVersion();
}
if (isset($app['releases'][0]['minIntSize'])) {
$phpDependencies['php']['@attributes']['min-int-size'] = $app['releases'][0]['minIntSize'];
}
$authors = '';
foreach ($app['authors'] as $key => $author) {
$authors .= $author['name'];
if ($key !== count($app['authors']) - 1) {
$authors .= ', ';
}
}
$currentLanguage = substr($this->l10nFactory->findLanguage(), 0, 2);
$enabledValue = $this->appConfig->getValueString($app['id'], 'enabled', 'no');
$groups = null;
if ($enabledValue !== 'no' && $enabledValue !== 'yes') {
$groups = $enabledValue;
}
$currentVersion = '';
if ($this->appManager->isEnabledForAnyone($app['id'])) {
$currentVersion = $this->appManager->getAppVersion($app['id']);
} else {
$currentVersion = $app['releases'][0]['version'];
}
$formattedApps[] = [
'id' => $app['id'],
'app_api' => false,
'name' => $app['translations'][$currentLanguage]['name'] ?? $app['translations']['en']['name'],
'description' => $app['translations'][$currentLanguage]['description'] ?? $app['translations']['en']['description'],
'summary' => $app['translations'][$currentLanguage]['summary'] ?? $app['translations']['en']['summary'],
'license' => $app['releases'][0]['licenses'],
'author' => $authors,
'shipped' => $this->appManager->isShipped($app['id']),
'internal' => in_array($app['id'], $this->appManager->getAlwaysEnabledApps()),
'version' => $currentVersion,
'types' => [],
'documentation' => [
'admin' => $app['adminDocs'],
'user' => $app['userDocs'],
'developer' => $app['developerDocs']
],
'website' => $app['website'],
'bugs' => $app['issueTracker'],
'dependencies' => array_merge(
$nextcloudVersionDependencies,
$phpDependencies
),
'level' => ($app['isFeatured'] === true) ? 200 : 100,
'missingMaxNextcloudVersion' => false,
'missingMinNextcloudVersion' => false,
'screenshot' => isset($app['screenshots'][0]['url']) ? 'https://usercontent.apps.nextcloud.com/' . base64_encode($app['screenshots'][0]['url']) : '',
'score' => $app['ratingOverall'],
'ratingNumOverall' => $app['ratingNumOverall'],
'ratingNumThresholdReached' => $app['ratingNumOverall'] > 5,
'removable' => $existsLocally,
'active' => $this->appManager->isEnabledForUser($app['id']),
'needsDownload' => !$existsLocally,
'groups' => $groups,
'fromAppStore' => true,
'appstoreData' => $app,
];
}
return $formattedApps;
}
private function getGroupList(array $groups) {
$groupManager = Server::get(IGroupManager::class);
$groupsList = [];
foreach ($groups as $group) {
$groupItem = $groupManager->get($group);
if ($groupItem instanceof IGroup) {
$groupsList[] = $groupManager->get($group);
}
}
return $groupsList;
}
private function sortApps($a, $b) {
$a = (string)$a['name'];
$b = (string)$b['name'];
if ($a === $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
}
@@ -0,0 +1,181 @@
<?php
declare(strict_types=1);
/*!
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Appstore\Controller;
use OC\App\AppStore\Fetcher\AppDiscoverFetcher;
use OCA\Appstore\AppInfo\Application;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\Attribute\FrontpageRoute;
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
use OCP\AppFramework\Http\Attribute\OpenAPI;
use OCP\AppFramework\Http\FileDisplayResponse;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\NotFoundResponse;
use OCP\Files\AppData\IAppDataFactory;
use OCP\Files\IAppData;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
use OCP\Files\SimpleFS\ISimpleFile;
use OCP\Files\SimpleFS\ISimpleFolder;
use OCP\Http\Client\IClientService;
use OCP\IRequest;
use OCP\IUserSession;
use OCP\Security\RateLimiting\ILimiter;
use Psr\Log\LoggerInterface;
#[OpenAPI(scope: OpenAPI::SCOPE_IGNORE)]
class DiscoverController extends Controller {
private IAppData $appData;
public function __construct(
IRequest $request,
IAppDataFactory $appDataFactory,
private IClientService $clientService,
private AppDiscoverFetcher $discoverFetcher,
private LoggerInterface $logger,
) {
parent::__construct(Application::APP_ID, $request);
$this->appData = $appDataFactory->get(Application::APP_ID);
}
/**
* Get all active entries for the app discover section
*/
#[NoCSRFRequired]
#[FrontpageRoute('GET', '/api/v1/discover')]
public function getAppDiscoverJSON(): JSONResponse {
$data = $this->discoverFetcher->get(true);
return new JSONResponse(array_values($data));
}
/**
* Get a image for the app discover section - this is proxied for privacy and CSP reasons
*
* @param string $fileName - The image file name
*/
#[NoCSRFRequired]
#[FrontpageRoute('GET', '/api/v1/discover/media')]
public function getAppDiscoverMedia(string $fileName, ILimiter $limiter, IUserSession $session): FileDisplayResponse|NotFoundResponse {
$getEtag = $this->discoverFetcher->getETag() ?? date('Y-m');
$etag = trim($getEtag, '"');
$folder = null;
try {
$folder = $this->appData->getFolder('app-discover-cache');
$this->cleanUpImageCache($folder, $etag);
} catch (\Throwable $e) {
$folder = $this->appData->newFolder('app-discover-cache');
}
// Get the current cache folder
try {
$folder = $folder->getFolder($etag);
} catch (NotFoundException $e) {
$folder = $folder->newFolder($etag);
}
$info = pathinfo($fileName);
$hashName = md5($fileName);
$allFiles = $folder->getDirectoryListing();
// Try to find the file
$file = array_filter($allFiles, function (ISimpleFile $file) use ($hashName) {
return str_starts_with($file->getName(), $hashName);
});
// Get the first entry
$file = reset($file);
// If not found request from Web
if ($file === false) {
$user = $session->getUser();
// this route is not public thus we can assume a user is logged-in
assert($user !== null);
// Register a user request to throttle fetching external data
// this will prevent using the server for DoS of other systems.
$limiter->registerUserRequest(
'settings-discover-media',
// allow up to 24 media requests per hour
// this should be a sane default when a completely new section is loaded
// keep in mind browsers request all files from a source-set
24,
60 * 60,
$user,
);
if (!$this->checkCanDownloadMedia($fileName)) {
$this->logger->warning('Tried to load media files for app discover section from untrusted source');
return new NotFoundResponse(Http::STATUS_BAD_REQUEST);
}
try {
$client = $this->clientService->newClient();
$fileResponse = $client->get($fileName);
$contentType = $fileResponse->getHeader('Content-Type');
$extension = $info['extension'] ?? '';
$file = $folder->newFile($hashName . '.' . base64_encode($contentType) . '.' . $extension, $fileResponse->getBody());
} catch (\Throwable $e) {
$this->logger->warning('Could not load media file for app discover section', ['media_src' => $fileName, 'exception' => $e]);
return new NotFoundResponse();
}
} else {
// File was found so we can get the content type from the file name
$contentType = base64_decode(explode('.', $file->getName())[1] ?? '');
}
$response = new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => $contentType]);
// cache for 7 days
$response->cacheFor(604800, false, true);
return $response;
}
private function checkCanDownloadMedia(string $filename): bool {
$urlInfo = parse_url($filename);
if (!isset($urlInfo['host']) || !isset($urlInfo['path'])) {
return false;
}
// Always allowed hosts
if ($urlInfo['host'] === 'nextcloud.com') {
return true;
}
// Hosts that need further verification
// Github is only allowed if from our organization
$ALLOWED_HOSTS = ['github.com', 'raw.githubusercontent.com'];
if (!in_array($urlInfo['host'], $ALLOWED_HOSTS)) {
return false;
}
if (str_starts_with($urlInfo['path'], '/nextcloud/') || str_starts_with($urlInfo['path'], '/nextcloud-gmbh/')) {
return true;
}
return false;
}
/**
* Remove orphaned folders from the image cache that do not match the current etag
* @param ISimpleFolder $folder The folder to clear
* @param string $etag The etag (directory name) to keep
*/
private function cleanUpImageCache(ISimpleFolder $folder, string $etag): void {
// Cleanup old cache folders
$allFiles = $folder->getDirectoryListing();
foreach ($allFiles as $dir) {
try {
if ($dir->getName() !== $etag) {
$dir->delete();
}
} catch (NotPermittedException $e) {
// ignore folder for now
}
}
}
}
@@ -0,0 +1,110 @@
<?php
declare(strict_types=1);
/*!
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Appstore\Controller;
use OC\App\AppManager;
use OC\App\AppStore\Bundles\BundleFetcher;
use OC\Installer;
use OCA\AppAPI\Service\ExAppsPageService;
use OCA\Appstore\AppInfo\Application;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\Attribute\FrontpageRoute;
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
use OCP\AppFramework\Http\Attribute\OpenAPI;
use OCP\AppFramework\Http\ContentSecurityPolicy;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Services\IInitialState;
use OCP\IConfig;
use OCP\IL10N;
use OCP\INavigationManager;
use OCP\IRequest;
use OCP\IURLGenerator;
use OCP\Server;
use OCP\Util;
#[OpenAPI(scope: OpenAPI::SCOPE_IGNORE)]
class PageController extends Controller {
public function __construct(
IRequest $request,
private IL10N $l10n,
private IConfig $config,
private Installer $installer,
private AppManager $appManager,
private IURLGenerator $urlGenerator,
private IInitialState $initialState,
private BundleFetcher $bundleFetcher,
private INavigationManager $navigationManager,
) {
parent::__construct(Application::APP_ID, $request);
}
/**
* @psalm-suppress UndefinedClass AppAPI is shipped since 30.0.1
*
* @return TemplateResponse
*/
#[NoCSRFRequired]
#[FrontpageRoute('GET', '/settings/apps', root: '')]
#[FrontpageRoute('GET', '/settings/apps/{category}', defaults: ['category' => ''], root: '')]
#[FrontpageRoute('GET', '/settings/apps/{category}/{id}', defaults: ['category' => '', 'id' => ''], root: '')]
public function viewApps(): TemplateResponse {
$this->navigationManager->setActiveEntry('core_apps');
$this->initialState->provideInitialState('appstoreEnabled', $this->config->getSystemValueBool('appstoreenabled', true));
$this->initialState->provideInitialState('appstoreBundles', $this->getBundles());
$this->initialState->provideInitialState('appstoreDeveloperDocs', $this->urlGenerator->linkToDocs('developer-manual'));
$this->initialState->provideInitialState('appstoreUpdateCount', count($this->getAppsWithUpdates()));
if ($this->appManager->isEnabledForAnyone('app_api')) {
try {
Server::get(ExAppsPageService::class)->provideAppApiState($this->initialState);
} catch (\Psr\Container\NotFoundExceptionInterface|\Psr\Container\ContainerExceptionInterface $e) {
}
}
$policy = new ContentSecurityPolicy();
$policy->addAllowedImageDomain('https://usercontent.apps.nextcloud.com');
$templateResponse = new TemplateResponse(Application::APP_ID, 'empty', ['pageTitle' => $this->l10n->t('App store')]);
$templateResponse->setContentSecurityPolicy($policy);
Util::addStyle(Application::APP_ID, 'main');
Util::addScript(Application::APP_ID, 'main');
return $templateResponse;
}
private function getAppsWithUpdates() {
$appClass = new \OC_App();
$apps = $appClass->listAllApps();
foreach ($apps as $key => $app) {
$newVersion = $this->installer->isUpdateAvailable($app['id']);
if ($newVersion === false) {
unset($apps[$key]);
}
}
return $apps;
}
private function getBundles() {
$result = [];
$bundles = $this->bundleFetcher->getBundles();
foreach ($bundles as $bundle) {
$result[] = [
'name' => $bundle->getName(),
'id' => $bundle->getIdentifier(),
'appIdentifiers' => $bundle->getAppIdentifiers()
];
}
return $result;
}
}
@@ -6,8 +6,9 @@ declare(strict_types=1);
* SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Settings\Search;
namespace OCA\Appstore\Search;
use OCA\Appstore\AppInfo\Application;
use OCP\IL10N;
use OCP\INavigationManager;
use OCP\IUser;
@@ -24,7 +25,7 @@ class AppSearch implements IProvider {
}
public function getId(): string {
return 'settings_apps';
return Application::APP_ID;
}
public function getName(): string {
@@ -32,7 +33,7 @@ class AppSearch implements IProvider {
}
public function getOrder(string $route, array $routeParameters): int {
return $route === 'settings.AppSettings.viewApps' ? -50 : 100;
return $route === 'appstore.AppSettings.viewApps' ? -50 : 100;
}
public function search(IUser $user, ISearchQuery $query): SearchResult {
+104
View File
@@ -0,0 +1,104 @@
{
"openapi": "3.0.3",
"info": {
"title": "settings-administration",
"version": "0.0.1",
"description": "Nextcloud settings",
"license": {
"name": "agpl"
}
},
"components": {
"securitySchemes": {
"basic_auth": {
"type": "http",
"scheme": "basic"
},
"bearer_auth": {
"type": "http",
"scheme": "bearer"
}
},
"schemas": {}
},
"paths": {
"/index.php/settings/admin/log/download": {
"get": {
"operationId": "log_settings-download",
"summary": "download logfile",
"description": "This endpoint requires admin access",
"tags": [
"log_settings"
],
"security": [
{
"bearer_auth": []
},
{
"basic_auth": []
}
],
"responses": {
"200": {
"description": "Logfile returned",
"headers": {
"Content-Disposition": {
"schema": {
"type": "string",
"enum": [
"attachment; filename=\"nextcloud.log\""
]
}
}
},
"content": {
"application/octet-stream": {
"schema": {
"type": "string",
"format": "binary"
}
}
}
},
"401": {
"description": "Current user is not logged in",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string"
}
}
}
}
}
},
"403": {
"description": "Logged in account must be an admin",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string"
}
}
}
}
}
}
}
}
}
},
"tags": []
}
@@ -0,0 +1,2 @@
SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
SPDX-License-Identifier: AGPL-3.0-or-later
+709
View File
@@ -0,0 +1,709 @@
{
"openapi": "3.0.3",
"info": {
"title": "settings-full",
"version": "0.0.1",
"description": "Nextcloud settings",
"license": {
"name": "agpl"
}
},
"components": {
"securitySchemes": {
"basic_auth": {
"type": "http",
"scheme": "basic"
},
"bearer_auth": {
"type": "http",
"scheme": "bearer"
}
},
"schemas": {
"DeclarativeForm": {
"type": "object",
"required": [
"id",
"priority",
"section_type",
"section_id",
"storage_type",
"title",
"app",
"fields"
],
"properties": {
"id": {
"type": "string"
},
"priority": {
"type": "integer",
"format": "int64"
},
"section_type": {
"type": "string",
"enum": [
"admin",
"personal"
]
},
"section_id": {
"type": "string"
},
"storage_type": {
"type": "string",
"enum": [
"internal",
"external"
]
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"doc_url": {
"type": "string"
},
"app": {
"type": "string"
},
"fields": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DeclarativeFormField"
}
}
}
},
"DeclarativeFormField": {
"type": "object",
"required": [
"id",
"title",
"type",
"default",
"value"
],
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"text",
"password",
"email",
"tel",
"url",
"number",
"checkbox",
"multi-checkbox",
"radio",
"select",
"multi-select"
]
},
"placeholder": {
"type": "string"
},
"label": {
"type": "string"
},
"default": {
"type": "object"
},
"options": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "object",
"required": [
"name",
"value"
],
"properties": {
"name": {
"type": "string"
},
"value": {
"type": "object"
}
}
}
]
}
},
"value": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer",
"format": "int64"
},
{
"type": "number",
"format": "double"
},
{
"type": "boolean"
},
{
"type": "array",
"items": {
"type": "string"
}
}
]
},
"sensitive": {
"type": "boolean"
}
}
},
"OCSMeta": {
"type": "object",
"required": [
"status",
"statuscode"
],
"properties": {
"status": {
"type": "string"
},
"statuscode": {
"type": "integer"
},
"message": {
"type": "string"
},
"totalitems": {
"type": "string"
},
"itemsperpage": {
"type": "string"
}
}
}
}
},
"paths": {
"/index.php/settings/admin/log/download": {
"get": {
"operationId": "log_settings-download",
"summary": "download logfile",
"description": "This endpoint requires admin access",
"tags": [
"log_settings"
],
"security": [
{
"bearer_auth": []
},
{
"basic_auth": []
}
],
"responses": {
"200": {
"description": "Logfile returned",
"headers": {
"Content-Disposition": {
"schema": {
"type": "string",
"enum": [
"attachment; filename=\"nextcloud.log\""
]
}
}
},
"content": {
"application/octet-stream": {
"schema": {
"type": "string",
"format": "binary"
}
}
}
},
"401": {
"description": "Current user is not logged in",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string"
}
}
}
}
}
},
"403": {
"description": "Logged in account must be an admin",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string"
}
}
}
}
}
}
}
}
},
"/ocs/v2.php/settings/api/declarative/value": {
"post": {
"operationId": "declarative_settings-set-value",
"summary": "Sets a declarative settings value",
"tags": [
"declarative_settings"
],
"security": [
{
"bearer_auth": []
},
{
"basic_auth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"app",
"formId",
"fieldId",
"value"
],
"properties": {
"app": {
"type": "string",
"description": "ID of the app"
},
"formId": {
"type": "string",
"description": "ID of the form"
},
"fieldId": {
"type": "string",
"description": "ID of the field"
},
"value": {
"type": "object",
"description": "Value to be saved"
}
}
}
}
}
},
"parameters": [
{
"name": "OCS-APIRequest",
"in": "header",
"description": "Required to be true for the API request to pass",
"required": true,
"schema": {
"type": "boolean",
"default": true
}
}
],
"responses": {
"200": {
"description": "Value set successfully",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {
"nullable": true
}
}
}
}
}
}
}
},
"500": {
"description": "Not logged in or not an admin user",
"content": {
"text/plain": {
"schema": {
"type": "string"
}
}
}
},
"400": {
"description": "Invalid arguments to save value",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {}
}
}
}
}
}
}
},
"401": {
"description": "Current user is not logged in",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {}
}
}
}
}
}
}
}
}
}
},
"/ocs/v2.php/settings/api/declarative/value-sensitive": {
"post": {
"operationId": "declarative_settings-set-sensitive-value",
"summary": "Sets a declarative settings value. Password confirmation is required for sensitive values.",
"description": "This endpoint requires password confirmation",
"tags": [
"declarative_settings"
],
"security": [
{
"bearer_auth": []
},
{
"basic_auth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"app",
"formId",
"fieldId",
"value"
],
"properties": {
"app": {
"type": "string",
"description": "ID of the app"
},
"formId": {
"type": "string",
"description": "ID of the form"
},
"fieldId": {
"type": "string",
"description": "ID of the field"
},
"value": {
"type": "object",
"description": "Value to be saved"
}
}
}
}
}
},
"parameters": [
{
"name": "OCS-APIRequest",
"in": "header",
"description": "Required to be true for the API request to pass",
"required": true,
"schema": {
"type": "boolean",
"default": true
}
}
],
"responses": {
"200": {
"description": "Value set successfully",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {
"nullable": true
}
}
}
}
}
}
}
},
"500": {
"description": "Not logged in or not an admin user",
"content": {
"text/plain": {
"schema": {
"type": "string"
}
}
}
},
"400": {
"description": "Invalid arguments to save value",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {}
}
}
}
}
}
}
},
"401": {
"description": "Current user is not logged in",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {}
}
}
}
}
}
}
}
}
}
},
"/ocs/v2.php/settings/api/declarative/forms": {
"get": {
"operationId": "declarative_settings-get-forms",
"summary": "Gets all declarative forms with the values prefilled.",
"tags": [
"declarative_settings"
],
"security": [
{
"bearer_auth": []
},
{
"basic_auth": []
}
],
"parameters": [
{
"name": "OCS-APIRequest",
"in": "header",
"description": "Required to be true for the API request to pass",
"required": true,
"schema": {
"type": "boolean",
"default": true
}
}
],
"responses": {
"200": {
"description": "Forms returned",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DeclarativeForm"
}
}
}
}
}
}
}
}
},
"500": {
"description": "",
"content": {
"text/plain": {
"schema": {
"type": "string"
}
}
}
},
"401": {
"description": "Current user is not logged in",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {}
}
}
}
}
}
}
}
}
}
}
},
"tags": []
}
+2
View File
@@ -0,0 +1,2 @@
SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
SPDX-License-Identifier: AGPL-3.0-or-later
+632
View File
@@ -0,0 +1,632 @@
{
"openapi": "3.0.3",
"info": {
"title": "settings",
"version": "0.0.1",
"description": "Nextcloud settings",
"license": {
"name": "agpl"
}
},
"components": {
"securitySchemes": {
"basic_auth": {
"type": "http",
"scheme": "basic"
},
"bearer_auth": {
"type": "http",
"scheme": "bearer"
}
},
"schemas": {
"DeclarativeForm": {
"type": "object",
"required": [
"id",
"priority",
"section_type",
"section_id",
"storage_type",
"title",
"app",
"fields"
],
"properties": {
"id": {
"type": "string"
},
"priority": {
"type": "integer",
"format": "int64"
},
"section_type": {
"type": "string",
"enum": [
"admin",
"personal"
]
},
"section_id": {
"type": "string"
},
"storage_type": {
"type": "string",
"enum": [
"internal",
"external"
]
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"doc_url": {
"type": "string"
},
"app": {
"type": "string"
},
"fields": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DeclarativeFormField"
}
}
}
},
"DeclarativeFormField": {
"type": "object",
"required": [
"id",
"title",
"type",
"default",
"value"
],
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"text",
"password",
"email",
"tel",
"url",
"number",
"checkbox",
"multi-checkbox",
"radio",
"select",
"multi-select"
]
},
"placeholder": {
"type": "string"
},
"label": {
"type": "string"
},
"default": {
"type": "object"
},
"options": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string"
},
{
"type": "object",
"required": [
"name",
"value"
],
"properties": {
"name": {
"type": "string"
},
"value": {
"type": "object"
}
}
}
]
}
},
"value": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer",
"format": "int64"
},
{
"type": "number",
"format": "double"
},
{
"type": "boolean"
},
{
"type": "array",
"items": {
"type": "string"
}
}
]
},
"sensitive": {
"type": "boolean"
}
}
},
"OCSMeta": {
"type": "object",
"required": [
"status",
"statuscode"
],
"properties": {
"status": {
"type": "string"
},
"statuscode": {
"type": "integer"
},
"message": {
"type": "string"
},
"totalitems": {
"type": "string"
},
"itemsperpage": {
"type": "string"
}
}
}
}
},
"paths": {
"/ocs/v2.php/settings/api/declarative/value": {
"post": {
"operationId": "declarative_settings-set-value",
"summary": "Sets a declarative settings value",
"tags": [
"declarative_settings"
],
"security": [
{
"bearer_auth": []
},
{
"basic_auth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"app",
"formId",
"fieldId",
"value"
],
"properties": {
"app": {
"type": "string",
"description": "ID of the app"
},
"formId": {
"type": "string",
"description": "ID of the form"
},
"fieldId": {
"type": "string",
"description": "ID of the field"
},
"value": {
"type": "object",
"description": "Value to be saved"
}
}
}
}
}
},
"parameters": [
{
"name": "OCS-APIRequest",
"in": "header",
"description": "Required to be true for the API request to pass",
"required": true,
"schema": {
"type": "boolean",
"default": true
}
}
],
"responses": {
"200": {
"description": "Value set successfully",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {
"nullable": true
}
}
}
}
}
}
}
},
"500": {
"description": "Not logged in or not an admin user",
"content": {
"text/plain": {
"schema": {
"type": "string"
}
}
}
},
"400": {
"description": "Invalid arguments to save value",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {}
}
}
}
}
}
}
},
"401": {
"description": "Current user is not logged in",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {}
}
}
}
}
}
}
}
}
}
},
"/ocs/v2.php/settings/api/declarative/value-sensitive": {
"post": {
"operationId": "declarative_settings-set-sensitive-value",
"summary": "Sets a declarative settings value. Password confirmation is required for sensitive values.",
"description": "This endpoint requires password confirmation",
"tags": [
"declarative_settings"
],
"security": [
{
"bearer_auth": []
},
{
"basic_auth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"app",
"formId",
"fieldId",
"value"
],
"properties": {
"app": {
"type": "string",
"description": "ID of the app"
},
"formId": {
"type": "string",
"description": "ID of the form"
},
"fieldId": {
"type": "string",
"description": "ID of the field"
},
"value": {
"type": "object",
"description": "Value to be saved"
}
}
}
}
}
},
"parameters": [
{
"name": "OCS-APIRequest",
"in": "header",
"description": "Required to be true for the API request to pass",
"required": true,
"schema": {
"type": "boolean",
"default": true
}
}
],
"responses": {
"200": {
"description": "Value set successfully",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {
"nullable": true
}
}
}
}
}
}
}
},
"500": {
"description": "Not logged in or not an admin user",
"content": {
"text/plain": {
"schema": {
"type": "string"
}
}
}
},
"400": {
"description": "Invalid arguments to save value",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {}
}
}
}
}
}
}
},
"401": {
"description": "Current user is not logged in",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {}
}
}
}
}
}
}
}
}
}
},
"/ocs/v2.php/settings/api/declarative/forms": {
"get": {
"operationId": "declarative_settings-get-forms",
"summary": "Gets all declarative forms with the values prefilled.",
"tags": [
"declarative_settings"
],
"security": [
{
"bearer_auth": []
},
{
"basic_auth": []
}
],
"parameters": [
{
"name": "OCS-APIRequest",
"in": "header",
"description": "Required to be true for the API request to pass",
"required": true,
"schema": {
"type": "boolean",
"default": true
}
}
],
"responses": {
"200": {
"description": "Forms returned",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DeclarativeForm"
}
}
}
}
}
}
}
}
},
"500": {
"description": "",
"content": {
"text/plain": {
"schema": {
"type": "string"
}
}
}
},
"401": {
"description": "Current user is not logged in",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"ocs"
],
"properties": {
"ocs": {
"type": "object",
"required": [
"meta",
"data"
],
"properties": {
"meta": {
"$ref": "#/components/schemas/OCSMeta"
},
"data": {}
}
}
}
}
}
}
}
}
}
}
},
"tags": []
}
+2
View File
@@ -0,0 +1,2 @@
SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
SPDX-License-Identifier: AGPL-3.0-or-later
+61
View File
@@ -0,0 +1,61 @@
<!--
- SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
<script setup lang="ts">
import { t } from '@nextcloud/l10n'
import { computed } from 'vue'
import { useRoute } from 'vue-router'
import NcAppContent from '@nextcloud/vue/components/NcAppContent'
import NcContent from '@nextcloud/vue/components/NcContent'
import AppstoreNavigation from './views/AppstoreNavigation.vue'
import AppstoreSidebar from './views/AppstoreSidebar.vue'
import { APPSTORE_CATEGORY_NAMES } from './constants.ts'
const route = useRoute()
const currentCategory = computed(() => {
if (route.params.category) {
return [route.params.category].flat()[0]!
}
if (route.name === 'apps-bundles') {
return 'bundles'
}
return 'discover'
})
const heading = computed(() => APPSTORE_CATEGORY_NAMES[currentCategory.value] ?? currentCategory.value)
const pageTitle = computed(() => `${heading.value} - ${t('appstore', 'App store')}`)
const showSidebar = computed(() => !!route.params.id)
</script>
<template>
<NcContent appName="appstore">
<AppstoreNavigation />
<NcAppContent
:class="$style.appstoreApp__content"
:pageHeading="t('appstore', 'App store')"
:pageTitle>
<h2 v-if="heading" :class="$style.appstoreApp__heading">
{{ heading }}
</h2>
<router-view />
</NcAppContent>
<AppstoreSidebar v-if="showSidebar" />
</NcContent>
</template>
<style module>
.appstoreApp__content {
padding-inline-end: var(--body-container-margin);
}
.appstoreApp__heading {
margin-block-start: var(--app-navigation-padding);
margin-inline-start: calc(var(--default-clickable-area) + var(--app-navigation-padding) * 2);
min-height: var(--default-clickable-area);
line-height: var(--default-clickable-area);
vertical-align: center;
}
</style>
+112
View File
@@ -0,0 +1,112 @@
/*!
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/**
* Helper for localized values
*/
export type ILocalizedValue<T> = Record<string, T | undefined> & { en: T }
export interface IAppDiscoverElement {
/**
* Type of the element
*/
type: typeof APP_DISCOVER_KNOWN_TYPES[number]
/**
* Identifier for this element
*/
id: string
/**
* Order of this element to pin elements (smaller = shown on top)
*/
order?: number
/**
* Optional, localized, headline for the element
*/
headline?: ILocalizedValue<string>
/**
* Optional link target for the element
*/
link?: string
/**
* Optional date when this element will get valid (only show since then)
*/
date?: number
/**
* Optional date when this element will be invalid (only show until then)
*/
expiryDate?: number
}
/** Wrapper for media source and MIME type */
type MediaSource = { src: string, mime: string }
/**
* Media content type for posts
*/
interface IAppDiscoverMediaContent {
/**
* The media source to show - either one or a list of sources with their MIME type for fallback options
*/
src: MediaSource | MediaSource[]
/**
* Alternative text for the media
*/
alt: string
/**
* Optional link target for the media (e.g. to the full video)
*/
link?: string
}
/**
* Wrapper for post media
*/
interface IAppDiscoverMedia {
/**
* The alignment of the media element
*/
alignment?: 'start' | 'end' | 'center'
/**
* The (localized) content
*/
content: ILocalizedValue<IAppDiscoverMediaContent>
}
/**
* An app element only used for the showcase type
*/
export interface IAppDiscoverApp {
/** The App ID */
type: 'app'
appId: string
}
export interface IAppDiscoverPost extends IAppDiscoverElement {
type: 'post'
text?: ILocalizedValue<string>
media?: IAppDiscoverMedia
}
export interface IAppDiscoverShowcase extends IAppDiscoverElement {
type: 'showcase'
content: (IAppDiscoverPost | IAppDiscoverApp)[]
}
export interface IAppDiscoverCarousel extends IAppDiscoverElement {
type: 'carousel'
text?: ILocalizedValue<string>
content: IAppDiscoverPost[]
}
export type IAppDiscoverElements = IAppDiscoverPost | IAppDiscoverCarousel | IAppDiscoverShowcase
@@ -27,7 +27,16 @@ export interface IAppstoreAppRelease {
}
}
export interface IAppstoreApp {
export interface IAppstoreAppData extends Record<string, unknown> {
ratingOverall: number
ratingNumOverall: number
ratingRecent: number
ratingNumRecent: number
releases: IAppstoreAppRelease[]
}
export interface IAppstoreAppResponse {
id: string
name: string
summary: string
@@ -38,24 +47,36 @@ export interface IAppstoreApp {
version: string
category: string | string[]
preview?: string
icon?: string
screenshot?: string
app_api: boolean
/**
* Groups this app is limited to.
* (only available if app is already installed)
*/
groups?: string[]
score: number
ratingNumThresholdReached: boolean
app_api: false
active: boolean
internal: boolean
removable: boolean
installed: boolean
canInstall: boolean
canUnInstall: boolean
isCompatible: boolean
needsDownload: boolean
missingDependencies?: string[]
update?: string
appstoreData: Record<string, never>
appstoreData?: IAppstoreAppData
releases?: IAppstoreAppRelease[]
}
export interface IAppstoreApp extends IAppstoreAppResponse {
loading?: boolean
}
export interface IComputeDevice {
id: string
label: string
@@ -81,10 +102,10 @@ export interface IDeployDaemon {
export interface IExAppStatus {
action: string
deploy: number
deploy_start_time: number
error: string
deploy_start_time?: number
error?: string
init: number
init_start_time: number
init_start_time?: number
type: string
}
@@ -111,8 +132,9 @@ export interface IAppstoreExAppRelease extends IAppstoreAppRelease {
}
export interface IAppstoreExApp extends IAppstoreApp {
app_api: true
daemon: IDeployDaemon | null | undefined
status: IExAppStatus | Record<string, never>
error: string
error?: string
releases: IAppstoreExAppRelease[]
}
+64
View File
@@ -0,0 +1,64 @@
<!--
- SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
<script setup lang="ts">
import type { IAppstoreApp, IAppstoreExApp } from '../apps.d.ts'
import { mdiCogOutline } from '@mdi/js'
import { computed, ref, watch } from 'vue'
import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
const { app, noFallback, size = 20 } = defineProps<{
app: IAppstoreApp | IAppstoreExApp
noFallback?: boolean
size?: number
}>()
const isSvg = computed(() => app.icon?.endsWith('.svg'))
const svgIcon = ref<string>('')
watch(() => app.icon, async () => {
svgIcon.value = ''
if (app.icon?.endsWith('.svg')) {
const response = await fetch(app.icon)
if (response.ok) {
svgIcon.value = await response.text()
}
}
}, { immediate: true })
</script>
<template>
<span :class="$style.appIcon">
<NcIconSvgWrapper
v-if="svgIcon"
:size
:svg="svgIcon" />
<img
v-else-if="app.icon && !isSvg"
:class="$style.appIcon__image"
alt=""
:src="app.icon"
:height="size"
:width="size">
<NcIconSvgWrapper
v-else-if="!noFallback"
:path="mdiCogOutline"
:size />
</span>
</template>
<style module>
.appIcon {
display: inline-flex;
justify-content: center;
}
.appImage__image {
filter: var(--invert-if-dark);
object-fit: cover;
height: 100%;
width: 100%;
}
</style>
+66
View File
@@ -0,0 +1,66 @@
<!--
- SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
<script setup lang="ts">
import type { IAppstoreApp, IAppstoreExApp } from '../apps.d.ts'
import { mdiCogOutline } from '@mdi/js'
import { NcLoadingIcon } from '@nextcloud/vue'
import { ref, watchEffect } from 'vue'
import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
const props = defineProps<{
app: IAppstoreApp | IAppstoreExApp
}>()
const isError = ref(false)
const isLoading = ref(true)
watchEffect(() => {
if (props.app.screenshot) {
isError.value = false
isLoading.value = true
const image = new Image()
image.onload = () => {
isLoading.value = false
}
image.onerror = () => {
isError.value = true
isLoading.value = false
}
image.src = props.app.screenshot
} else {
isLoading.value = false
isError.value = false
}
})
</script>
<template>
<div :class="$style.appImage">
<NcIconSvgWrapper
v-if="isError || !props.app.screenshot"
:size="80"
:path="mdiCogOutline" />
<NcLoadingIcon v-else-if="isLoading" :size="80" />
<img :class="$style.appImage__image" :src="props.app.screenshot" alt="">
</div>
</template>
<style module>
.appImage {
display: flex;
justify-content: center;
width: 100%;
height: 100%;
}
.appImage__image {
object-fit: cover;
height: 100%;
width: 100%;
}
</style>
@@ -2,19 +2,9 @@
- SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
<template>
<span
v-if="isSupported || isFeatured"
class="app-level-badge"
:class="{ 'app-level-badge--supported': isSupported }"
:title="badgeTitle">
<NcIconSvgWrapper :path="badgeIcon" :size="20" inline />
{{ badgeText }}
</span>
</template>
<script setup lang="ts">
import { mdiCheck, mdiStarShootingOutline } from '@mdi/js'
import { mdiStar, mdiStarShootingOutline } from '@mdi/js'
import { translate as t } from '@nextcloud/l10n'
import { computed } from 'vue'
import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
@@ -28,15 +18,27 @@ const props = defineProps<{
const isSupported = computed(() => props.level === 300)
const isFeatured = computed(() => props.level === 200)
const badgeIcon = computed(() => isSupported.value ? mdiStarShootingOutline : mdiCheck)
const badgeText = computed(() => isSupported.value ? t('settings', 'Supported') : t('settings', 'Featured'))
const badgeIcon = computed(() => isSupported.value
? mdiStarShootingOutline
: mdiStar)
const badgeText = computed(() => isSupported.value ? t('appstore', 'Supported') : t('appstore', 'Featured'))
const badgeTitle = computed(() => isSupported.value
? t('settings', 'This app is supported via your current Nextcloud subscription.')
: t('settings', 'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.'))
? t('appstore', 'This app is supported via your current Nextcloud subscription.')
: t('appstore', 'Featured apps are developed by and within the community. They offer central functionality and are ready for production use.'))
</script>
<style scoped lang="scss">
.app-level-badge {
<template>
<span
v-if="isSupported || isFeatured"
:class="[ $style.appLevelBadge, { [$style.appLevelBadge__supported]: isSupported } ]"
:title="badgeTitle">
<NcIconSvgWrapper :path="badgeIcon" :size="20" inline />
{{ badgeText }}
</span>
</template>
<style module>
.appLevelBadge {
color: var(--color-text-maxcontrast);
background-color: transparent;
border: 1px solid var(--color-text-maxcontrast);
@@ -44,14 +46,14 @@ const badgeTitle = computed(() => isSupported.value
display: flex;
flex-direction: row;
gap: 6px;
gap: var(--default-grid-baseline);
padding: 3px 6px;
width: fit-content;
}
&--supported {
background-color: var(--color-success);
border-color: var(--color-border-success);
color: var(--color-success-text);
}
.appLevelBadge__supported {
background-color: var(--color-success);
border-color: var(--color-border-success);
color: var(--color-success-text);
}
</style>
+83
View File
@@ -0,0 +1,83 @@
<!--
- SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
<script setup lang="ts">
/**
* This component either shows a native link to the installed app or external size
* or a router link to the appstore page of the app if not installed
*/
import type { RouterLinkProps } from 'vue-router'
import type { INavigationEntry } from '../../../../core/src/types/navigation.d.ts'
import { loadState } from '@nextcloud/initial-state'
import { generateUrl } from '@nextcloud/router'
import { ref, watchEffect } from 'vue'
import { RouterLink, useRoute } from 'vue-router'
const props = defineProps<{
href: string
}>()
const route = useRoute()
const knownRoutes = Object.fromEntries(loadState<INavigationEntry[]>('core', 'apps').map((app) => [app.app ?? app.id, app.href]))
const routerProps = ref<RouterLinkProps>()
const linkProps = ref<Record<string, string>>()
watchEffect(() => {
const match = props.href.match(/^app:(\/\/)?([^/]+)(\/.+)?$/)
routerProps.value = undefined
linkProps.value = undefined
// not an app url
if (match === null) {
linkProps.value = {
href: props.href,
target: '_blank',
rel: 'noreferrer noopener',
}
return
}
const appId = match[2]!
// Check if specific route was requested
if (match[3]) {
// we do no know anything about app internal path so we only allow generic app paths
linkProps.value = {
href: generateUrl(`/apps/${appId}${match[3]}`),
}
return
}
// If we know any route for that app we open it
if (appId in knownRoutes) {
linkProps.value = {
href: knownRoutes[appId]!,
}
return
}
// Fallback to show the app store entry
routerProps.value = {
to: {
name: 'apps-details',
params: {
category: route.params?.category ?? 'discover',
id: appId,
},
},
}
})
</script>
<template>
<a v-if="linkProps" v-bind="linkProps">
<slot />
</a>
<RouterLink v-else-if="routerProps" v-bind="routerProps">
<slot />
</RouterLink>
</template>
@@ -19,36 +19,36 @@
}">
<template v-if="useListView">
<div v-if="showUpdateAll" class="apps-list__toolbar">
{{ n('settings', '%n app has an update available', '%n apps have an update available', counter) }}
{{ n('appstore', '%n app has an update available', '%n apps have an update available', counter) }}
<NcButton
v-if="showUpdateAll"
id="app-list-update-all"
variant="primary"
@click="updateAll">
{{ n('settings', 'Update', 'Update all', counter) }}
{{ n('appstore', 'Update', 'Update all', counter) }}
</NcButton>
</div>
<div v-if="!showUpdateAll" class="apps-list__toolbar">
{{ t('settings', 'All apps are up-to-date.') }}
{{ t('appstore', 'All apps are up-to-date.') }}
</div>
<TransitionGroup name="apps-list" tag="table" class="apps-list__list-container">
<tr key="app-list-view-header">
<th>
<span class="hidden-visually">{{ t('settings', 'Icon') }}</span>
<span class="hidden-visually">{{ t('appstore', 'Icon') }}</span>
</th>
<th>
<span class="hidden-visually">{{ t('settings', 'Name') }}</span>
<span class="hidden-visually">{{ t('appstore', 'Name') }}</span>
</th>
<th>
<span class="hidden-visually">{{ t('settings', 'Version') }}</span>
<span class="hidden-visually">{{ t('appstore', 'Version') }}</span>
</th>
<th>
<span class="hidden-visually">{{ t('settings', 'Level') }}</span>
<span class="hidden-visually">{{ t('appstore', 'Level') }}</span>
</th>
<th>
<span class="hidden-visually">{{ t('settings', 'Actions') }}</span>
<span class="hidden-visually">{{ t('appstore', 'Actions') }}</span>
</th>
</tr>
<AppItem
@@ -64,30 +64,30 @@
class="apps-list__list-container">
<tr key="app-list-view-header">
<th id="app-table-col-icon">
<span class="hidden-visually">{{ t('settings', 'Icon') }}</span>
<span class="hidden-visually">{{ t('appstore', 'Icon') }}</span>
</th>
<th id="app-table-col-name">
<span class="hidden-visually">{{ t('settings', 'Name') }}</span>
<span class="hidden-visually">{{ t('appstore', 'Name') }}</span>
</th>
<th id="app-table-col-version">
<span class="hidden-visually">{{ t('settings', 'Version') }}</span>
<span class="hidden-visually">{{ t('appstore', 'Version') }}</span>
</th>
<th id="app-table-col-level">
<span class="hidden-visually">{{ t('settings', 'Level') }}</span>
<span class="hidden-visually">{{ t('appstore', 'Level') }}</span>
</th>
<th id="app-table-col-actions">
<span class="hidden-visually">{{ t('settings', 'Actions') }}</span>
<span class="hidden-visually">{{ t('appstore', 'Actions') }}</span>
</th>
</tr>
<template v-for="bundle in bundles">
<tr :key="bundle.id">
<template v-for="bundle in bundles" :key="bundle.id">
<tr>
<th :id="`app-table-rowgroup-${bundle.id}`" colspan="5" scope="rowgroup">
<div class="apps-list__bundle-heading">
<span class="apps-list__bundle-header">
{{ bundle.name }}
</span>
<NcButton variant="secondary" @click="toggleBundle(bundle.id)">
{{ t('settings', bundleToggleText(bundle.id)) }}
{{ t('appstore', bundleToggleText(bundle.id)) }}
</NcButton>
</div>
</th>
@@ -115,23 +115,23 @@
<div class="apps-list__list-container">
<table v-if="search !== '' && searchApps.length > 0" class="apps-list__list-container">
<caption class="apps-list__bundle-header">
{{ t('settings', 'Results from other categories') }}
{{ t('appstore', 'Results from other categories') }}
</caption>
<tr key="app-list-view-header">
<th>
<span class="hidden-visually">{{ t('settings', 'Icon') }}</span>
<span class="hidden-visually">{{ t('appstore', 'Icon') }}</span>
</th>
<th>
<span class="hidden-visually">{{ t('settings', 'Name') }}</span>
<span class="hidden-visually">{{ t('appstore', 'Name') }}</span>
</th>
<th>
<span class="hidden-visually">{{ t('settings', 'Version') }}</span>
<span class="hidden-visually">{{ t('appstore', 'Version') }}</span>
</th>
<th>
<span class="hidden-visually">{{ t('settings', 'Level') }}</span>
<span class="hidden-visually">{{ t('appstore', 'Level') }}</span>
</th>
<th>
<span class="hidden-visually">{{ t('settings', 'Actions') }}</span>
<span class="hidden-visually">{{ t('appstore', 'Actions') }}</span>
</th>
</tr>
<AppItem
@@ -145,7 +145,7 @@
<div v-if="search !== '' && !loading && searchApps.length === 0 && apps.length === 0" id="apps-list-empty" class="emptycontent emptycontent-search">
<div id="app-list-empty-icon" class="icon-settings-dark" />
<h2>{{ t('settings', 'No apps found for your version') }}</h2>
<h2>{{ t('appstore', 'No apps found for your version') }}</h2>
</div>
</div>
</template>
@@ -157,7 +157,7 @@ import NcButton from '@nextcloud/vue/components/NcButton'
import AppItem from './AppList/AppItem.vue'
import OfficeSuiteSwitcher from './AppList/OfficeSuiteSwitcher.vue'
import { getOfficeSuiteById, OFFICE_SUITES } from '../constants/OfficeSuites.js'
import logger from '../logger.ts'
import logger from '../utils/logger.ts'
import AppManagement from '../mixins/AppManagement.js'
import { useAppApiStore } from '../store/app-api-store.ts'
import { useAppsStore } from '../store/apps-store.ts'
@@ -314,9 +314,9 @@ export default {
bundleToggleText() {
return (id) => {
if (this.allBundlesEnabled(id)) {
return t('settings', 'Disable all')
return t('appstore', 'Disable all')
}
return t('settings', 'Download and enable all')
return t('appstore', 'Download and enable all')
}
},
},
@@ -0,0 +1,108 @@
<!--
- SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
<template>
<li
:class="[$style.appListItem, {
[$style.appListItem_selected]: isSelected,
}]">
<div class="app-image app-image-icon">
<div v-if="!app?.app_api && !props.app.preview" class="icon-settings-dark" />
<NcIconSvgWrapper
v-else-if="app.app_api && !props.app.preview"
:path="mdiCogOutline"
:size="24"
style="min-width: auto; min-height: auto; height: 100%;" />
<svg
v-else-if="app.preview && !app.app_api"
width="32"
height="32"
viewBox="0 0 32 32">
<image
x="0"
y="0"
width="32"
height="32"
preserveAspectRatio="xMinYMin meet"
:xlink:href="app.preview"
class="app-icon" />
</svg>
</div>
<div class="app-name">
<router-link
class="app-name--link"
:to="{
name: 'apps-details',
params: {
category: category,
id: app.id,
},
}"
:aria-label="t('appstore', 'Show details for {appName} app', { appName: app.name })">
{{ app.name }}
</router-link>
</div>
<AppListVersion :app />
<div class="app-level">
<AppLevelBadge :level="app.level" />
</div>
</li>
</template>
<script setup lang="ts">
import type { IAppstoreApp } from '../../apps.d.ts'
import { mdiCogOutline } from '@mdi/js'
import { t } from '@nextcloud/l10n'
import { ref, watchEffect } from 'vue'
import { useRoute } from 'vue-router'
import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
import AppLevelBadge from './AppLevelBadge.vue'
import AppListVersion from './AppListVersion.vue'
const props = defineProps<{
app: IAppstoreApp
category: string
}>()
const route = useRoute()
const isSelected = ref(false)
watchEffect(() => {
isSelected.value = props.app.id === route.params.id
})
const screenshotLoaded = ref(false)
watchEffect(() => {
if (props.app.screenshot) {
const image = new Image()
image.onload = () => {
screenshotLoaded.value = true
}
image.src = props.app.screenshot
}
})
</script>
<style module>
.appListItem {
--app-item-padding: calc(var(--default-grid-baseline) * 2);
--app-item-height: calc(var(--default-clickable-area) + var(--app-item-padding) * 2);
> * {
vertical-align: middle;
border-bottom: 1px solid var(--color-border);
padding: var(--app-item-padding);
height: var(--app-item-height);
}
}
.appListItem:hover {
background-color: var(--color-background-dark);
}
.appListItem_selected {
background-color: var(--color-background-dark);
}
</style>
@@ -0,0 +1,27 @@
<!--
- SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
<script setup lang="ts">
import type { IAppstoreApp } from '../../apps.d.ts'
defineProps<{
app: IAppstoreApp
}>()
</script>
<template>
<div :class="$style.appListVersion">
<span v-if="app.version">{{ app.version }}</span>
<span v-else-if="app.appstoreData?.releases[0]?.version">
{{ app.appstoreData.releases[0].version }}
</span>
</div>
</template>
<style module>
.appListVersion {
color: var(--color-text-maxcontrast);
}
</style>
@@ -53,7 +53,7 @@
id: app.id,
},
}"
:aria-label="t('settings', 'Show details for {appName} app', { appName: app.name })">
:aria-label="t('appstore', 'Show details for {appName} app', { appName: app.name })">
{{ app.name }}
</router-link>
</component>
@@ -92,7 +92,7 @@
:disabled="installing || isLoading || !defaultDeployDaemonAccessible || isManualInstall"
:title="updateButtonText"
@click.stop="update(app.id)">
{{ t('settings', 'Update to {update}', { update: app.update }) }}
{{ t('appstore', 'Update to {update}', { update: app.update }) }}
</NcButton>
<NcButton
v-if="app.canUnInstall"
@@ -100,7 +100,7 @@
variant="tertiary"
:disabled="installing || isLoading"
@click.stop="remove(app.id)">
{{ t('settings', 'Remove') }}
{{ t('appstore', 'Remove') }}
</NcButton>
<NcButton
v-if="app.active"
@@ -129,7 +129,7 @@
<DaemonSelectionDialog
v-if="app?.app_api && showSelectDaemonModal"
:show.sync="showSelectDaemonModal"
v-model:show="showSelectDaemonModal"
:app="app" />
</component>
</component>
@@ -139,13 +139,12 @@
import { mdiCogOutline } from '@mdi/js'
import NcButton from '@nextcloud/vue/components/NcButton'
import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
import DaemonSelectionDialog from '../AppAPI/DaemonSelectionDialog.vue'
import SvgFilterMixin from '../SvgFilterMixin.vue'
import DaemonSelectionDialog from '../DaemonSelectionDialog/DaemonSelectionDialog.vue'
import AppLevelBadge from './AppLevelBadge.vue'
import AppScore from './AppScore.vue'
import AppManagement from '../../mixins/AppManagement.js'
import { useAppApiStore } from '../../store/app-api-store.ts'
import { useAppsStore } from '../../store/apps-store.js'
import { useAppsStore } from '../../store/apps.ts'
import { useAppApiStore } from '../../store/exApps.ts'
export default {
name: 'AppItem',
@@ -157,7 +156,7 @@ export default {
DaemonSelectionDialog,
},
mixins: [AppManagement, SvgFilterMixin],
mixins: [AppManagement],
props: {
app: {
type: Object,
@@ -281,7 +280,6 @@ export default {
</script>
<style scoped lang="scss">
@use '../../../../../core/css/variables.scss' as variables;
@use 'sass:math';
.app-item {
@@ -364,7 +362,7 @@ export default {
}
/* Hide actions on a small screen. Click on app opens fill-screen sidebar with the buttons */
@media only screen and (max-width: math.div(variables.$breakpoint-mobile, 2)) {
@media only screen and (max-width: 512px) {
.app-actions {
display: none;
}
@@ -437,7 +435,7 @@ export default {
}
}
@media only screen and (max-width: variables.$breakpoint-mobile) {
@media only screen and (max-width: 1024px) {
width: 50%;
}

Some files were not shown because too many files have changed in this diff Show More