diff --git a/Dockerfile b/Dockerfile index 4478d3f8322dc89af197bfbfda22f0176b5008bb..37934c84710ff5a8d2565feaacaba34f0447ae46 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,25 +1,25 @@ -FROM nextcloud:31.0.10-fpm AS nextcloud +FROM nextcloud:32.0.6-fpm AS nextcloud ARG BASE_DIR="/usr/src/nextcloud" ARG TMP_PATCH_DIR="/tmp/build_patches" -ARG CONTACTS_URL="https://gitlab.e.foundation/api/v4/projects/1238/packages/generic/contacts/v7.2.0+murena-20251111/contacts-v7.2.0+murena-20251111.tar.gz" -ARG CALENDAR_URL="https://gitlab.e.foundation/api/v4/projects/1199/packages/generic/calendar/v5.3.5+murena-20251016/calendar-v5.3.5+murena-20251016.tar.gz" -ARG THEME_HELPER_URL="https://gitlab.e.foundation/api/v4/projects/952/packages/generic/ecloud-theme-helper/v9.0.0/ecloud-theme-helper-v9.0.0.tar.gz" -ARG LAUNCHER_URL="https://gitlab.e.foundation/api/v4/projects/927/packages/generic/murena_launcher/v9.0.0/murena_launcher-v9.0.0.tar.gz" -ARG DASHBOARD_URL="https://gitlab.e.foundation/api/v4/projects/1195/packages/generic/murena-dashboard/v9.0.0/murena-dashboard-v9.0.0.tar.gz" -ARG SNAPPY_URL="https://gitlab.e.foundation/api/v4/projects/1367/packages/generic/snappymail/v2.38.2+murena-20251117/snappymail-v2.38.2+murena-20251117.tar.gz" -ARG OIDC_LOGIN_URL="https://gitlab.e.foundation/api/v4/projects/1496/packages/generic/oidc_login/v3.2.2+murena-20251028/oidc_login-v3.2.2+murena-20251028.tar.gz" +ARG CONTACTS_URL="https://gitlab.e.foundation/api/v4/projects/1238/packages/generic/contacts/v7.3.12+murena-20260325/contacts-v7.3.12+murena-20260325.tar.gz" +ARG CALENDAR_URL="https://gitlab.e.foundation/api/v4/projects/1199/packages/generic/calendar/v5.5.11+murena-20260107/calendar-v5.5.11+murena-20260107.tar.gz" +ARG THEME_HELPER_URL="https://gitlab.e.foundation/api/v4/projects/952/packages/generic/ecloud-theme-helper/v11.0.0-beta.1/ecloud-theme-helper-v11.0.0-beta.1.tar.gz" +ARG LAUNCHER_URL="https://gitlab.e.foundation/api/v4/projects/927/packages/generic/murena_launcher/v10.0.0-beta/murena_launcher-v10.0.0-beta.tar.gz" +ARG DASHBOARD_URL="https://gitlab.e.foundation/api/v4/projects/1195/packages/generic/murena-dashboard/v10.0.0-beta/murena-dashboard-v10.0.0-beta.tar.gz" +ARG SNAPPY_URL="https://gitlab.e.foundation/api/v4/projects/1367/packages/generic/snappymail/v2.38.2+murena-20260322/snappymail-v2.38.2+murena-20260322.tar.gz" +ARG OIDC_LOGIN_URL="https://gitlab.e.foundation/api/v4/projects/1496/packages/generic/oidc_login/v3.2.2+murena-20260323/oidc_login-v3.2.2+murena-20260323.tar.gz" ARG SNAPPY_THEME_VERSION="https://gitlab.e.foundation/api/v4/projects/1377/packages/generic/snappymail/v4.0.5/snappymail-v4.0.5.tar.gz" -ARG EA_URL="https://gitlab.e.foundation/api/v4/projects/648/packages/generic/ecloud-accounts/v13.0.0/ecloud-accounts-v13.0.0.tar.gz" -ARG EMAIL_RECOVERY_URL="https://gitlab.e.foundation/api/v4/projects/868/packages/generic/email-recovery/v12.2.0/email-recovery-v12.2.0.tar.gz" -ARG USER_MIGRATION_URL="https://gitlab.e.foundation/api/v4/projects/1468/packages/generic/user_migration/8.0.0+murena-20251020/user_migration-8.0.0+murena-20251020.tar.gz" +ARG EA_URL="https://gitlab.e.foundation/api/v4/projects/648/packages/generic/ecloud-accounts/v14.0.0-beta/ecloud-accounts-v14.0.0-beta.tar.gz" +ARG EMAIL_RECOVERY_URL="https://gitlab.e.foundation/api/v4/projects/868/packages/generic/email-recovery/v13.0.0-beta/email-recovery-v13.0.0-beta.tar.gz" +ARG USER_MIGRATION_URL="https://gitlab.e.foundation/api/v4/projects/1468/packages/generic/user_migration/8.0.0+murena-20251216/user_migration-8.0.0+murena-20251216.tar.gz" -ARG NOTES_URL="https://github.com/nextcloud-releases/notes/releases/download/v4.11.0/notes-v4.11.0.tar.gz" -ARG MEMORIES_URL="https://github.com/pulsejet/memories/releases/download/v7.5.2/memories.tar.gz" +ARG NOTES_URL="https://github.com/nextcloud-releases/notes/releases/download/v4.13.1/notes-v4.13.1.tar.gz" +ARG MEMORIES_URL="https://github.com/pulsejet/memories/releases/download/v7.8.2/memories.tar.gz" ARG DROP_ACCOUNT_URL="https://packages.framasoft.org/projects/nextcloud-apps/drop-account/drop_account-2.7.1.tar.gz" ARG GOOGLE_INTEGRATION_URL="https://github.com/nextcloud-releases/integration_google/releases/download/v4.2.0/integration_google-v4.2.0.tar.gz" -RUN sed -i 's/31,0,10,2/31,0,10,11/' ${BASE_DIR}/version.php +RUN sed -i 's/32,0,6,1/32,0,6,10/' ${BASE_DIR}/version.php COPY custom_entrypoint.sh / RUN chmod +x /custom_entrypoint.sh RUN mkdir -p /var/www/skeleton/Documents && mkdir -p /var/www/skeleton/Images @@ -74,7 +74,7 @@ RUN apt-get -y remove unzip RUN sed -i "s/\$systemConfig->setValue('theme', '');/\$systemConfig->setValue('theme', 'eCloud');/g" ${BASE_DIR}/lib/base.php # Disable editor feature of media viewer -RUN sed -i 's/canEdit(){return!this.isMobile\&\&L()/canEdit(){return!this.isMobile\&\&false\&\&L()/' ${BASE_DIR}/apps/viewer/js/viewer-main.mjs +RUN sed -i 's/canEdit(){return!this.isMobile\&\&this.canDownload/canEdit(){return!this.isMobile\&\&false\&\&this.canDownload/' ${BASE_DIR}/apps/viewer/js/viewer-main.mjs ENTRYPOINT ["/custom_entrypoint.sh"] @@ -107,6 +107,7 @@ RUN patch -u ${BASE_DIR}/lib/private/Template/JSResourceLocator.php -i ${TMP_PAT RUN patch -u ${BASE_DIR}/lib/private/L10N/Factory.php -i ${TMP_PATCH_DIR}/032-select-lang-from-session.patch # UserConfigChangedEvent Ref: https://github.com/nextcloud/server/pull/42039 RUN cd ${BASE_DIR} && patch -p1 < ${TMP_PATCH_DIR}/036-user-config-change-event.patch +RUN patch -u ${BASE_DIR}/custom_apps/integration_google/lib/Service/GoogleDriveAPIService.php -i ${TMP_PATCH_DIR}/039-fix-slow-google-import-job.patch RUN rm -rf ${TMP_PATCH_DIR} @@ -141,8 +142,8 @@ RUN sed -i 's/ in Nextcloud/ /' ${BASE_DIR}/custom_apps/integration_google/js/in RUN sed -i 's/Nextcloud administrator/administrator/' ${BASE_DIR}/custom_apps/integration_google/js/integration_google-personalSettings.mjs -# Fix the navbar entries -RUN sed -i 's/this.appLimit=e/this.appLimit=this.appList.length/' ${BASE_DIR}/dist/core-main.js +# Fix the navbar entries - Not needed in NC 30 & onward +#RUN sed -i 's/this.appLimit=e/this.appLimit=this.appList.length/' ${BASE_DIR}/dist/core-main.js # Fix total quota value for users in settings and files RUN sed -i "s/'total'/'quota'/" ${BASE_DIR}/apps/settings/lib/Settings/Personal/PersonalInfo.php @@ -154,8 +155,8 @@ RUN sed -i "s/\['total'\]/\['quota'\]/" ${BASE_DIR}/apps/provisioning_api/lib/Co From selfhost as ecloud ARG BASE_DIR="/usr/src/nextcloud" ARG TMP_PATCH_DIR="/tmp/build_patches" -ARG THEME_VERSION="https://gitlab.e.foundation/api/v4/projects/315/packages/generic/eCloud/v31.0.3/eCloud-v31.0.3.tar.gz" -ARG LDAP_WRITE_SUPPORT_VERSION="1.13.0" +ARG THEME_VERSION="https://gitlab.e.foundation/api/v4/projects/315/packages/generic/eCloud/v32.0.1/eCloud-v32.0.1.tar.gz" +ARG LDAP_WRITE_SUPPORT_VERSION="1.14.0" ARG IS_SELFHOST=false RUN curl -fsSL -o ldap_write_support.tar.gz \ @@ -173,12 +174,12 @@ RUN patch -u ${BASE_DIR}/lib/private/Notification/Manager.php -i ${TMP_PATCH_DIR #RUN cd ${BASE_DIR} && patch -u ${BASE_DIR}/apps/user_ldap/lib/User_LDAP.php -i ${TMP_PATCH_DIR}/023-ldap-check-pwd-optimization.patch - already added in nc31 RUN patch -u ${BASE_DIR}/lib/private/User/Manager.php -i ${TMP_PATCH_DIR}/025-optimize-get-by-email.patch RUN patch -u ${BASE_DIR}/apps/dav/lib/Connector/Sabre/Principal.php -i ${TMP_PATCH_DIR}/027-displayname-user-leak-dav.patch -RUN patch -u ${BASE_DIR}/apps/dav/lib/HookManager.php -i ${TMP_PATCH_DIR}/028-default-task-calendar.patch +RUN patch -u ${BASE_DIR}/apps/dav/lib/Listener/UserEventsListener.php -i ${TMP_PATCH_DIR}/028-default-task-calendar.patch RUN patch -u ${BASE_DIR}/apps/provisioning_api/lib/Controller/UsersController.php -i ${TMP_PATCH_DIR}/029-restrict-user-to-change-primary-email.patch RUN patch -u ${BASE_DIR}/lib/private/Security/VerificationToken/VerificationToken.php -i ${TMP_PATCH_DIR}/033-verification-token-private.patch RUN patch -u ${BASE_DIR}/lib/private/AppFramework/Middleware/Security/CORSMiddleware.php -i ${TMP_PATCH_DIR}/034-oidc-bearer-token-auth.patch #RUN patch -u ${BASE_DIR}/custom_apps/snappymail/app/snappymail/v/2.38.2+murena-20251112/app/libraries/RainLoop/Actions/Contacts.php -i ${TMP_PATCH_DIR}/037-snappymail-contact.patch -RUN cd ${BASE_DIR} && patch -p0 < ${TMP_PATCH_DIR}/038-appdata-folder-based-on-config.patch +#RUN cd ${BASE_DIR} && patch -p0 < ${TMP_PATCH_DIR}/038-appdata-folder-based-on-config.patch RUN rm -rf ${TMP_PATCH_DIR} @@ -192,7 +193,7 @@ RUN sed -i 's/$this->getAvatarImage($user)/null/' ${BASE_DIR}/apps/dav/lib/CardD # RUN cd ${BASE_DIR}/dist && sed -i 's/resetPassword:!1/resetPassword:!1||Z.showResetPassword==="1"/' core-login.js # add attr about how many notifications to notif icon -RUN sed -i 's/attrs:{id:"notifications",/attrs:{id:"notifications","data-has-notifications":0!==u.notifications.length,/' ${BASE_DIR}/apps/notifications/js/NotificationsApp-CL5l4zBd.chunk.mjs +RUN sed -i 's/key:0,id:"notifications",/key:0,id:"notifications","data-has-notifications":0!==i.notifications.length,/' ${BASE_DIR}/apps/notifications/js/NotificationsApp-hrGoV45R.chunk.mjs # Rename Memories to Gallery RUN sed -i 's/Memories<\/name>/Gallery<\/name>/g' ${BASE_DIR}/custom_apps/memories/appinfo/info.xml @@ -205,7 +206,9 @@ RUN cd ${BASE_DIR}/custom_apps/memories/js && sed -i 's/Memories Settings/Galler RUN cd ${BASE_DIR}/custom_apps/calendar && sed -i 's/"GROUP","INDIVIDUAL"/"INDIVIDUAL"/g' js/calendar-main.js RUN cd ${BASE_DIR}/custom_apps/calendar && sed -i 's/{name:\[a,"displayname"\]},//' js/calendar-main.js RUN cd ${BASE_DIR}/custom_apps/notes && sed -i 's/OCA\\Notes\\Migration\\EditorHint<\/step>//g' appinfo/info.xml -RUN cd ${BASE_DIR}/apps/theming && sed -i 's/OCA\\Theming\\Migration\\MigrateUserConfig<\/step>//g' appinfo/info.xml + +# Not needed for NC-32 +#RUN cd ${BASE_DIR}/apps/theming && sed -i 's/OCA\\Theming\\Migration\\MigrateUserConfig<\/step>//g' appinfo/info.xml # sharing search by email #RUN cd ${BASE_DIR}/custom_apps/contacts && sed -i 's/kM.principalPropertySearchByDisplayname(t);/kM.principalPropertySearch(\[{name:\["http:\/\/sabredav.org\/ns","email-address"\]\}],t,"anyof");/g' js/contacts-main.js @@ -221,7 +224,7 @@ RUN sed -i 's/$this->changeAvatar/\/\/ $this->changeAvatar/' ${BASE_DIR}/custom_ RUN sed -i '/OCA\\DAV\\Migration\\CalDAVRemoveEmptyValue<\/step>/d' ${BASE_DIR}/apps/dav/appinfo/info.xml # Hide `Play sound when a call started (requires Nextcloud Talk)` checkbox from notification setting -RUN sed -i 's/attrs:{checked:r\.config\.sound_talk}/staticClass:"notification_talk",attrs:{checked:r\.config\.sound_talk}/g' ${BASE_DIR}/apps/notifications/js/notifications-settings.mjs +RUN sed -i 's/c\.config\.sound_talk=p),l\.updateSettings]/c\.config\.sound_talk=p),l\.updateSettings],class:"notification_talk"/g' ${BASE_DIR}/apps/notifications/js/notifications-settings.mjs # Hide `Navigation bar settings` from theming RUN sed -i 's/{attrs:{name:t.t("theming","Navigation bar settings")}}/{staticClass:"navigation-bar-settings",attrs:{name:t.t("theming","Navigation bar settings")}}/g' ${BASE_DIR}/dist/theming-personal-theming.js diff --git a/patches/002-login-without-domain.patch b/patches/002-login-without-domain.patch index 5021b6d20bb8965735ca6a1abdefbfc6b05fee20..746b12afac9711252676afb3be3b72277757d83f 100644 --- a/patches/002-login-without-domain.patch +++ b/patches/002-login-without-domain.patch @@ -7,9 +7,9 @@ This patch auto append the domain handled by nc, configured in env var. only the admin user (also configured in env var) will not have his login appended with a @domain suffix diff --git ./core/Controller/LoginController.php ./core/Controller/LoginController-new.php ---- ./core/Controller/LoginController.php 2024-04-26 15:08:54.979407062 +0530 -+++ ./core/Controller/LoginController-new.php 2024-04-26 15:16:48.582366408 +0530 -@@ -315,6 +315,27 @@ +--- ./core/Controller/LoginController.php 2026-03-23 17:46:38.368004410 +0600 ++++ ./core/Controller/LoginController-new.php 2026-03-23 17:56:15.665110462 +0600 +@@ -341,6 +341,27 @@ ); } @@ -37,7 +37,7 @@ diff --git ./core/Controller/LoginController.php ./core/Controller/LoginControll $data = new LoginData( $this->request, $user, -@@ -327,7 +348,7 @@ +@@ -354,7 +375,7 @@ if (!$result->isSuccess()) { return $this->createLoginFailedResponse( $data->getUsername(), @@ -47,8 +47,8 @@ diff --git ./core/Controller/LoginController.php ./core/Controller/LoginControll $result->getErrorMessage() ); ---- ./core/Controller/WebAuthnController.php 2023-04-21 15:18:58.813220092 +0530 -+++ ./core/Controller/WebAuthnController-new.php 2023-04-21 15:24:40.036538414 +0530 +--- ./core/Controller/WebAuthnController.php 2026-03-23 18:12:33.546326153 +0600 ++++ ./core/Controller/WebAuthnController-new.php 2026-03-23 18:12:26.157698882 +0600 @@ -48,6 +48,27 @@ $this->logger->debug('Converting login name to UID'); @@ -61,7 +61,7 @@ diff --git ./core/Controller/LoginController.php ./core/Controller/LoginControll + $mainDomainSuffix = !empty($mainDomain) ? '@' . $mainDomain : ''; + $admin_username = $_ENV["NEXTCLOUD_ADMIN_USER"]; + $is_admin = strcmp($uid, $admin_username) === 0; -+ ++ + if (!$is_admin && str_ends_with($uid, $legacyDomainSuffix)) { + $uid = str_replace($legacyDomainSuffix, '', $uid); + } @@ -78,9 +78,9 @@ diff --git ./core/Controller/LoginController.php ./core/Controller/LoginControll '\OCA\Files_Sharing\API\Server2Server', 'preLoginNameUsedAsUserName', ---- ./lib/private/User/Session.php 2023-04-21 15:27:00.417034490 +0530 -+++ ./lib/private/User/Session-new.php 2023-04-21 15:28:18.309111435 +0530 -@@ -383,6 +383,10 @@ +--- ./lib/private/User/Session.php 2026-03-23 17:46:39.585001447 +0600 ++++ ./lib/private/User/Session-new.php 2026-03-23 17:59:52.577453313 +0600 +@@ -384,6 +384,10 @@ $remoteAddress = $request->getRemoteAddress(); $currentDelay = $throttler->sleepDelayOrThrowOnMax($remoteAddress, 'login'); @@ -90,4 +90,4 @@ diff --git ./core/Controller/LoginController.php ./core/Controller/LoginControll + if ($this->manager instanceof PublicEmitter) { $this->manager->emit('\OC\User', 'preLogin', [$user, $password]); - } \ No newline at end of file + } diff --git a/patches/003-contact-search-removal.patch b/patches/003-contact-search-removal.patch index aef513aa0fa8c8cd328a7b840706b3e13aa700ef..0f9de5ca35f29dadbfaae82b49f184deb3d86a76 100644 --- a/patches/003-contact-search-removal.patch +++ b/patches/003-contact-search-removal.patch @@ -5,10 +5,10 @@ Subject: [PATCH] remove user search icon in header tab This patch removes the top right icon enabling the global user search function available to all in nextcloud. diff --git layout.user.php layout.user.php-new ---- ./core/templates/layout.user.php 2023-03-28 14:54:05.873566570 +0530 -+++ ./core/templates/layout.user-new.php 2023-03-28 14:54:35.044218831 +0530 +--- ./core/templates/layout.user.php 2026-03-23 17:46:38.739003512 +0600 ++++ ./core/templates/layout.user-new.php 2026-03-24 10:20:10.404364930 +0600 @@ -76,7 +76,6 @@ -
+
-
diff --git a/patches/005-autocomplete-user-leak-core.patch b/patches/005-autocomplete-user-leak-core.patch index dad34cca20b9430860d87f8bf02733b2097034ef..2df11046529e0d4c51f0e3bac96002f35d45156d 100644 --- a/patches/005-autocomplete-user-leak-core.patch +++ b/patches/005-autocomplete-user-leak-core.patch @@ -14,22 +14,20 @@ this filtering works in conjunction with the autocomplete feature disabled in ne diff --git lib/private/Collaboration/Collaborators/UserPlugin.php lib/private/Collaboration/Collaborators/UserPlugin-new.php --- lib/private/Collaboration/Collaborators/UserPlugin.php 2025-02-13 19:30:40 +++ lib/private/Collaboration/Collaborators/UserPlugin-new.php 2025-03-07 12:48:50 -@@ -159,8 +159,8 @@ - && $lowerSearch !== '' - && ( - strtolower($uid) === $lowerSearch -- || strtolower($userDisplayName) === $lowerSearch -- || ($this->shareeEnumerationFullMatchIgnoreSecondDisplayName && trim(strtolower(preg_replace('/ \(.*\)$/', '', $userDisplayName))) === $lowerSearch) -+ //|| strtolower($userDisplayName) === $lowerSearch -+ //|| ($this->shareeEnumerationFullMatchIgnoreSecondDisplayName && trim(strtolower(preg_replace('/ \(.*\)$/', '', $userDisplayName))) === $lowerSearch) - || ($this->shareeEnumerationFullMatchEmail && strtolower($userEmail ?? '') === $lowerSearch) - ) - ) { +@@ -90,7 +90,7 @@ + $lowerSearch = mb_strtolower($search); + + // Re-use the results from earlier if possible +- $usersByDisplayName ??= $this->userManager->searchDisplayName($search, $limit, $offset); ++ $usersByDisplayName = []; + foreach ($usersByDisplayName as $user) { + if ($user->isEnabled() && (mb_strtolower($user->getDisplayName()) === $lowerSearch || ($shareeEnumerationFullMatchIgnoreSecondDisplayName && trim(mb_strtolower(preg_replace('/ \(.*\)$/', '', $user->getDisplayName()))) === $lowerSearch))) { + $users[$user->getUID()] = ['exact', $user]; diff --git lib/private/Collaboration/Collaborators/MailPlugin.php lib/private/Collaboration/Collaborators/MailPlugin-new.php --- lib/private/Collaboration/Collaborators/MailPlugin.php 2025-02-13 19:30:40 +++ lib/private/Collaboration/Collaborators/MailPlugin-new.php 2025-03-07 12:55:25 -@@ -18,6 +18,7 @@ +@@ -19,6 +19,7 @@ use OCP\IUserSession; use OCP\Mail\IMailer; use OCP\Share\IShare; @@ -37,18 +35,15 @@ diff --git lib/private/Collaboration/Collaborators/MailPlugin.php lib/private/Co class MailPlugin implements ISearchPlugin { protected bool $shareWithGroupOnly; -@@ -40,8 +41,10 @@ - private KnownUserService $knownUserService, - private IUserSession $userSession, - private IMailer $mailer, -+ private IUserManager $userManager, - private mixed $shareWithGroupOnlyExcludeGroupsList = [], - ) { -+ $this->userManager = $userManager; - $this->shareeEnumeration = $this->config->getAppValue('core', 'shareapi_allow_share_dialog_user_enumeration', 'yes') === 'yes'; - $this->shareWithGroupOnly = $this->config->getAppValue('core', 'shareapi_only_share_with_group_members', 'no') === 'yes'; - $this->shareeEnumerationInGroupOnly = $this->shareeEnumeration && $this->config->getAppValue('core', 'shareapi_restrict_user_enumeration_to_group', 'no') === 'yes'; -@@ -200,27 +203,63 @@ +@@ -60,6 +61,7 @@ + * {@inheritdoc} + */ + public function search($search, $limit, $offset, ISearchResult $searchResult): bool { ++ $userManager = \OC::$server->get(IUserManager::class); + if ($this->shareeEnumerationFullMatch && !$this->shareeEnumerationFullMatchEmail) { + return false; + } +@@ -211,27 +213,63 @@ if ($exactEmailMatch) { $searchResult->markExactIdMatch($emailType); } @@ -62,7 +57,7 @@ diff --git lib/private/Collaboration/Collaborators/MailPlugin.php lib/private/Co - 'shareWith' => $emailAddress, - ], - ]; -+ $isUserinInstance = $this->userManager->get($emailAddress); ++ $isUserinInstance = $userManager->get($emailAddress); + if ($isUserinInstance === null) { + // /e/ user is not in ecloud + $result['exact'][] = [ @@ -101,7 +96,7 @@ diff --git lib/private/Collaboration/Collaborators/MailPlugin.php lib/private/Co - 'shareWith' => $emailAddress, - ], - ]; -+ $isUserinInstance = $this->userManager->get($emailAddress); ++ $isUserinInstance = $userManager->get($emailAddress); + if ($isUserinInstance === null) { + // /e/ user is not in ecloud + $result['wide'][] = [ diff --git a/patches/006-recovery-email-changes.patch b/patches/006-recovery-email-changes.patch index 80d37255f6b4b552baddd1026d4ea1fb11a5cda7..ff92ba8eeed5530a650fbbac28145b4658cf2b30 100644 --- a/patches/006-recovery-email-changes.patch +++ b/patches/006-recovery-email-changes.patch @@ -1,6 +1,6 @@ ---- ./core/Controller/LostController.php 2023-05-05 18:38:07.080445742 +0530 -+++ ./core/Controller/LostController-new.php 2023-05-05 18:48:27.385043088 +0530 -@@ -126,7 +126,24 @@ +--- ./core/Controller/LostController.php 2026-03-23 17:46:38.368004410 +0600 ++++ ./core/Controller/LostController-new.php 2026-03-23 19:00:49.176323284 +0600 +@@ -127,7 +127,23 @@ protected function checkPasswordResetToken(string $token, string $userId): void { try { $user = $this->userManager->get($userId); @@ -22,12 +22,11 @@ + $user = $this->userManager->get($userId); + $recoveryEmail = $this->config->getUserValue($userId, 'email-recovery', 'recovery-email', ''); + $this->verificationToken->check($token, $user, 'lostpassword', $user ? $recoveryEmail : '', true); -+ } catch (InvalidTokenException $e) { $error = $e->getCode() === InvalidTokenException::TOKEN_EXPIRED ? $this->l10n->t('Could not reset password because the token is expired') -@@ -236,9 +253,22 @@ - * @throws \OCP\PreConditionNotMetException +@@ -237,9 +253,23 @@ + * @throws PreConditionNotMetException */ protected function sendEmail(string $input): void { + $legacyDomain = $this->config->getSystemValue('legacy_domain', ''); @@ -45,9 +44,8 @@ + } $user = $this->findUserByIdOrMail($input); $email = $user->getEMailAddress(); -- + + $email = $this->config->getUserValue($user->getUID(), 'email-recovery', 'recovery-email', ''); if (empty($email)) { throw new ResetPasswordException('Could not send reset e-mail since there is no email for username ' . $input); } - diff --git a/patches/007-remove-dev-notice.patch b/patches/007-remove-dev-notice.patch index a1ef8a3e8f84e11e3fdc1359cc6e2c00a1e98975..af256c3db5ea9cbd1b54b2b54a72ea2bb3763d6e 100644 --- a/patches/007-remove-dev-notice.patch +++ b/patches/007-remove-dev-notice.patch @@ -5,9 +5,9 @@ Subject: [PATCH] Remove development notice portion in personal info settings This patch removes the development notice portion in personal info settings diff --git ./apps/settings/lib/Settings/Personal/ServerDevNotice.php ./apps/settings/lib/Settings/Personal/ServerDevNotice-new.php ---- ./apps/settings/lib/Settings/Personal/ServerDevNotice.php 2022-03-23 12:22:57.000000000 +0100 -+++ ./apps/settings/lib/Settings/Personal/ServerDevNotice.php-new 2022-03-23 12:23:25.000000000 +0100 -@@ -81,11 +81,7 @@ +--- ./apps/settings/lib/Settings/Personal/ServerDevNotice.php 2026-03-23 17:46:38.150004938 +0600 ++++ ./apps/settings/lib/Settings/Personal/ServerDevNotice-new.php 2026-03-23 19:06:54.783056705 +0600 +@@ -59,11 +59,7 @@ * @return string|null the section ID, e.g. 'sharing' */ public function getSection(): ?string { diff --git a/patches/009-help-links.patch b/patches/009-help-links.patch index 874325a09137a49100f3978b1029cf91a7b6839a..799595231f38ee1f51ab947bc1cf34d532dc975f 100644 --- a/patches/009-help-links.patch +++ b/patches/009-help-links.patch @@ -5,9 +5,9 @@ Subject: [PATCH] Changes help links to point to the correct links This patch updated/adds changes to the "Settings" app's help template, controller and stylesheet to make sure the correct help links are shown ---- ./apps/settings/lib/Controller/HelpController.php 2025-03-07 11:04:18 -+++ ./apps/settings/lib/Controller/HelpController-new.php 2025-03-07 11:04:21 -@@ -103,6 +103,7 @@ +--- ./apps/settings/lib/Controller/HelpController.php 2026-03-13 18:50:33.011416152 +0600 ++++ ./apps/settings/lib/Controller/HelpController-new.php 2026-03-23 22:22:02.188613774 +0600 +@@ -79,6 +79,7 @@ 'urlAdminDocs' => $urlAdminDocs, 'mode' => $mode, 'pageTitle' => $pageTitle, @@ -16,9 +16,9 @@ help links are shown 'legalNoticeUrl' => $legalNoticeUrl, 'privacyUrl' => $privacyUrl, ---- ./apps/settings/templates/help.php 2025-03-13 21:19:20 -+++ ./apps/settings/templates/help-new.php 2025-03-26 13:04:36 -@@ -9,84 +9,47 @@ +--- ./apps/settings/templates/help.php 2026-03-23 17:46:38.175004877 +0600 ++++ ./apps/settings/templates/help-new.php 2026-03-23 22:37:53.260944930 +0600 +@@ -9,84 +9,50 @@
---- ./apps/settings/css/help.css 2021-08-20 14:16:57.951439620 +0530 -+++ ./apps/settings/css/help-new.css 2021-08-20 17:02:43.549016337 +0530 -.help-content__body > .button { +--- ./apps/settings/css/help.css 2026-03-13 18:50:32.974975631 +0600 ++++ ./apps/settings/css/help-new.css 2026-03-23 22:51:18.824345235 +0600 +@@ -56,3 +56,13 @@ + .help-content__body > .button { margin: 20px; -+} + } ++ +#content #app-navigation { -+ transform: none; -+ width: max-content; ++ transform: none; ++ width: max-content; +} + +#app-navigation:not(.vue) > ul > li > a { -+ padding: 0 12px 0 44px; - } \ No newline at end of file ++ padding: 0 12px 0 44px; ++} ++ diff --git a/patches/010-disable-app-store-upgrade.patch b/patches/010-disable-app-store-upgrade.patch index 07ab975af8b837c0761e9a716286e4d20c05d26d..4c78d38e24d7929e794a1be25281b229e893df2e 100644 --- a/patches/010-disable-app-store-upgrade.patch +++ b/patches/010-disable-app-store-upgrade.patch @@ -6,18 +6,19 @@ This patch disables checking the app store for app updates during "occ upgrade" --- ./lib/private/Updater.php 2021-11-16 12:12:35.631823438 +0530 +++ ./lib/private/Updater-new.php 2021-11-16 12:14:28.445155684 +0530 -@@ -240,11 +240,11 @@ - $appManager = \OC::$server->getAppManager(); +@@ -239,12 +239,13 @@ + \OC::$server->get(AppFetcher::class)->setVersion($currentVersion); // upgrade appstore apps -- $this->upgradeAppStoreApps($appManager->getInstalledApps()); -+ /* $this->upgradeAppStoreApps($appManager->getInstalledApps()); - $autoDisabledApps = $appManager->getAutoDisabledApps(); +- $this->upgradeAppStoreApps($this->appManager->getEnabledApps()); ++ // $this->upgradeAppStoreApps($this->appManager->getEnabledApps()); + /** @var AppManager $this->appManager */ ++ /* + $autoDisabledApps = $this->appManager->getAutoDisabledApps(); if (!empty($autoDisabledApps)) { $this->upgradeAppStoreApps(array_keys($autoDisabledApps), $autoDisabledApps); - } + } */ // install new shipped apps on upgrade - $errors = Installer::installShippedApps(true); - + $errors = $this->installer->installShippedApps(true); diff --git a/patches/011-privacy-settings.patch b/patches/011-privacy-settings.patch index 7d669d32a05eb5e8823f179405aa14c52b0fdf03..a7fdd621d6f097a88c787f88e92614142fa4d836 100644 --- a/patches/011-privacy-settings.patch +++ b/patches/011-privacy-settings.patch @@ -41,13 +41,11 @@ This patch removes certain unnecessary sections from the "privacy" section in pe --- ./apps/privacy/lib/Controller/PersonalController.php 2024-08-01 12:57:29 +0530 +++ ./apps/privacy/lib/Controller/PersonalController-new.php 2024-08-01 12:57:03 +0530 -@@ -87,7 +87,7 @@ - 'internal' => false, +@@ -88,6 +88,7 @@ ]; } -- + + $uids = []; return new JSONResponse($uids, Http::STATUS_OK); } } -\ No newline at end of file diff --git a/patches/013-revert-token-password-update.patch b/patches/013-revert-token-password-update.patch index 32af56388fbda6560d537d8be6c45c665241a78a..7b9f25bda935f59c3155a9208547f7472ac48eac 100644 --- a/patches/013-revert-token-password-update.patch +++ b/patches/013-revert-token-password-update.patch @@ -5,18 +5,17 @@ Subject: [PATCH] Reverts token password update on each login NC 21 started updating password of each and every token on each login. This introduces a huge load on database. This patch reverts to only update when there are expired tokens. ---- ./lib/private/Authentication/Token/PublicKeyTokenProvider.php 2024-07-25 17:51:37 +0530 -+++ ./lib/private/Authentication/Token/PublicKeyTokenProvider-new.php 2024-07-25 17:53:16 +0530 -@@ -504,6 +504,11 @@ +--- ./lib/private/Authentication/Token/PublicKeyTokenProvider.php 2026-03-23 17:46:39.518001611 +0600 ++++ ./lib/private/Authentication/Token/PublicKeyTokenProvider-new.php 2026-03-24 00:00:01.266417815 +0600 +@@ -519,6 +519,11 @@ } public function updatePasswords(string $uid, string $password) { + if (!$this->mapper->hasExpiredTokens($uid)) { + //Nothing to do here + return; -+ } ++ } + // prevent setting an empty pw as result of pw-less-login if ($password === '' || !$this->config->getSystemValueBool('auth.storeCryptedPassword', true)) { return; - diff --git a/patches/014-add-mail-usage.patch b/patches/014-add-mail-usage.patch index a8bf3a1d113bd5017c6d24fbd65ab36c071f3b1e..918f53f323e855bf4479f930499260017f0ca6e8 100644 --- a/patches/014-add-mail-usage.patch +++ b/patches/014-add-mail-usage.patch @@ -1,6 +1,6 @@ ---- lib/private/legacy/OC_Helper.php 2025-05-25 16:00:00.880495300 +0530 -+++ lib/private/legacy/OC_Helper-new.php 2025-05-25 16:02:00.970495300 +0530 -@@ -512,6 +512,13 @@ +--- ./lib/private/legacy/OC_Helper.php 2026-03-23 17:46:39.587001442 +0600 ++++ ./lib/private/legacy/OC_Helper-new.php 2026-03-24 00:06:16.021120690 +0600 +@@ -286,6 +286,13 @@ } try { $free = $sourceStorage->free_space($rootInfo->getInternalPath()); @@ -14,11 +14,11 @@ if (is_bool($free)) { $free = 0.0; } -@@ -547,7 +554,6 @@ +@@ -321,7 +328,6 @@ */ $isRemoteShare = $storage->instanceOfStorage(\OCA\Files_Sharing\External\Storage::class); - $ownerId = $storage->getOwner($path); $ownerDisplayName = ''; - if ($isRemoteShare === false && $ownerId !== false) { \ No newline at end of file + if ($isRemoteShare === false && $ownerId !== false) { diff --git a/patches/015-email-mail-template.patch b/patches/015-email-mail-template.patch index 3b0a77b862d6ea16f5cb230265d87bb38b5b1c66..82bbe5f17ff829380aced93e6ad2cba5a45f0d09 100644 --- a/patches/015-email-mail-template.patch +++ b/patches/015-email-mail-template.patch @@ -5,17 +5,17 @@ Subject: [PATCH] In the invitation modifying a recurring event highlight whether This patch helps in indentifying that For a recurring event, the invitee knows without a doubt whether the modification pushed by the updated invitation is a one time thing or a modification of all future events. ---- ./apps/dav/lib/CalDAV/Schedule/IMipPlugin.php 2024-03-18 11:18:20 -+++ ./apps/dav/lib/CalDAV/Schedule/IMipPlugin-new.php 2024-03-11 11:18:22 -@@ -149,7 +149,30 @@ - /** @var VEvent $oldVevent */ +--- ./apps/dav/lib/CalDAV/Schedule/IMipPlugin.php 2026-03-23 17:46:37.629006189 +0600 ++++ ./apps/dav/lib/CalDAV/Schedule/IMipPlugin-new.php 2026-03-24 09:30:02.299251689 +0600 +@@ -148,6 +148,30 @@ $oldVevent = !empty($modified['old']) && is_array($modified['old']) ? array_pop($modified['old']) : null; $isModified = isset($oldVevent); -+ $recurrenceId = $vEvent->{'RECURRENCE-ID'}; + ++ $recurrenceId = $vEvent->{'RECURRENCE-ID'}; + if (isset($recurrenceId) && $modified['sentOld'] === 1 && !empty($oldVevent)) { + $dateTime = $recurrenceId->getValue(); + $recurrenceArray = explode('T', $dateTime); - ++ + $oldVEventStart = $oldVevent->DTSTART; + $oldStartDateTime = $oldVEventStart->getValue(); + $startDateTimeArray = explode('T', $oldStartDateTime); @@ -38,7 +38,7 @@ This patch helps in indentifying that For a recurring event, the invitee knows w // No changed events after all - this shouldn't happen if there is significant change yet here we are // The scheduling status is debatable if (empty($vEvent)) { -@@ -217,12 +240,35 @@ +@@ -215,12 +239,36 @@ $data['invitee_name'] = ($senderName ?: $sender); $fromEMail = Util::getDefaultEmailAddress('invitations-noreply'); @@ -68,6 +68,7 @@ This patch helps in indentifying that For a recurring event, the invitee knows w + if ($method !== self::METHOD_CANCEL && $method !== self::METHOD_REPLY && count($vEvent) > 1) { + $template->addHeadingBanner('#EFFFDB', '#293618', $l10n->t('This recurring event has been updated, please review the information below:')); + } ++ + $sequence = $vEvent->SEQUENCE ? $vEvent->SEQUENCE->getValue() : NULL; + if (($sequence && $method !== self::METHOD_CANCEL && $method !== self::METHOD_REPLY && ($sequence > 2)) || isset($vEvent->{'RECURRENCE-ID'})) { + $template->addHeadingBanner('#EFFFDB', '#293618', $l10n->t('This event has been updated, please review the information below:')); @@ -75,21 +76,20 @@ This patch helps in indentifying that For a recurring event, the invitee knows w $this->imipService->addBulletList($template, $vEvent, $data); // Only add response buttons to invitation requests: Fix Issue #11230 -@@ -255,7 +301,6 @@ +@@ -253,7 +301,6 @@ || in_array(strtolower($recipientDomain), $invitationLinkRecipients)) { $token = $this->imipService->createInvitationToken($iTipMessage, $vEvent, $lastOccurrence); $this->imipService->addResponseButtons($template, $token); - $this->imipService->addMoreOptionsButton($template, $token); } - } - + } + --- ./apps/dav/lib/CalDAV/Schedule/IMipService.php 2024-03-18 11:40:39 +++ ./apps/dav/lib/CalDAV/Schedule/IMipService-new.php 2024-03-18 13:47:17 -@@ -163,7 +163,31 @@ - $oldUrl = self::readPropertyWithDefault($oldVEvent, 'URL', $defaultVal); +@@ -158,6 +158,31 @@ $data['meeting_url_html'] = !empty($oldUrl) && $oldUrl !== $data['meeting_url'] ? sprintf('%1$s', $oldUrl) : $data['meeting_url']; -- $data['meeting_when_html'] = $oldMeetingWhen !== $data['meeting_when'] ? sprintf("%s
%s", $oldMeetingWhen, $data['meeting_when']) : $data['meeting_when']; + $data['meeting_when_html'] = $oldMeetingWhen !== $data['meeting_when'] ? sprintf("%s
%s", $oldMeetingWhen, $data['meeting_when']) : $data['meeting_when']; + if (isset($vEvent->RRULE)) { + $RRule = (string) $vEvent->RRULE->getValue(); + if (strpos($RRule, 'FREQ=DAILY') !== false) { @@ -118,10 +118,10 @@ This patch helps in indentifying that For a recurring event, the invitee knows w } // generate occurring next string if ($eventReaderCurrent->recurs()) { -@@ -967,6 +991,51 @@ +@@ -165,6 +190,51 @@ } + return $data; } - + /** + * @param IEMailTemplate $template + * @param string $method @@ -167,14 +167,14 @@ This patch helps in indentifying that For a recurring event, the invitee knows w + } + } + + /** - * @param string $path - * @return string -@@ -1065,8 +1134,13 @@ + * @param VEvent $vEvent +@@ -1086,8 +1156,13 @@ $this->getAbsoluteImagePath('caldav/time.png'), $data['meeting_when'], '', IMipPlugin::IMIP_INDENT); } if ($data['meeting_location'] !== '') { -- $template->addBodyListItem($data['meeting_location_html'] ?? $data['meeting_location'], $this->l10n->t('Location:'), +- $template->addBodyListItem($data['meeting_location_html'] ?? htmlspecialchars($data['meeting_location']), $this->l10n->t('Location:'), - $this->getAbsoluteImagePath('caldav/location.png'), $data['meeting_location'], '', IMipPlugin::IMIP_INDENT); + if(filter_var(trim($data['meeting_location']), FILTER_VALIDATE_URL)) { + $template->addBodyListItem($data['meeting_location_html'] ?? $data['meeting_location'], $this->l10n->t('Location:'), @@ -185,8 +185,8 @@ This patch helps in indentifying that For a recurring event, the invitee knows w + } } if ($data['meeting_url'] !== '') { - $template->addBodyListItem($data['meeting_url_html'] ?? $data['meeting_url'], $this->l10n->t('Link:'), -@@ -1143,7 +1217,7 @@ + $template->addBodyListItem($data['meeting_url_html'] ?? htmlspecialchars($data['meeting_url']), $this->l10n->t('Link:'), +@@ -1164,7 +1239,7 @@ * @param $token */ public function addResponseButtons(IEMailTemplate $template, $token) { @@ -195,15 +195,12 @@ This patch helps in indentifying that For a recurring event, the invitee knows w $this->l10n->t('Accept'), $this->urlGenerator->linkToRouteAbsolute('dav.invitation_response.accept', [ 'token' => $token, -@@ -1151,20 +1225,10 @@ +@@ -1172,20 +1247,10 @@ $this->l10n->t('Decline'), $this->urlGenerator->linkToRouteAbsolute('dav.invitation_response.decline', [ 'token' => $token, - ]) -+ ]), -+ $this->l10n->t('MayBe'), -+ $this->urlGenerator->getAbsoluteUrl('apps/calendar/invitation/tentative/'.$token) - ); +- ); - } - - public function addMoreOptionsButton(IEMailTemplate $template, $token) { @@ -216,12 +213,16 @@ This patch helps in indentifying that For a recurring event, the invitee knows w - $text = $this->l10n->t('More options at %s', [$moreOptionsURL]); - - $template->addBodyText($html, $text); ++ ]), ++ $this->l10n->t('MayBe'), ++ $this->urlGenerator->getAbsoluteUrl('apps/calendar/invitation/tentative/'.$token) ++ ); } public function getReplyingAttendee(Message $iTipMessage): ?Property { ---- ./apps/dav/lib/CalDAV/EventComparisonService.php 2024-05-06 12:46:29 -+++ ./apps/dav/lib/CalDAV/EventComparisonService-new.php 2024-05-06 12:47:11 +--- ./apps/dav/lib/CalDAV/EventComparisonService.php 2026-03-13 18:50:32.749819154 +0600 ++++ ./apps/dav/lib/CalDAV/EventComparisonService-new.php 2026-03-24 09:38:05.198934270 +0600 @@ -78,8 +78,9 @@ } } @@ -252,4 +253,3 @@ This patch helps in indentifying that For a recurring event, the invitee knows w + return ['old' => array_values($oldEventComponents), 'new' => array_values($newEventComponents), 'sentOld' => $sentOld]; } } -\ No newline at end of file diff --git a/patches/016-login-screen.patch b/patches/016-login-screen.patch index 79414a44a74476003a553309265fcef67ddab40c..d2ed7cc13b562dfc93abd4df744cb56b25f057db 100644 --- a/patches/016-login-screen.patch +++ b/patches/016-login-screen.patch @@ -37,9 +37,9 @@ +
">
-