From a31d48cead03ddbf897acffb096e0e6c3b8954e2 Mon Sep 17 00:00:00 2001 From: Avinash Gusain Date: Tue, 22 Jul 2025 14:30:42 +0530 Subject: [PATCH 01/16] build: update Dockerfile and image config to support Nextcloud 30 - base image or app dependencies updated as needed - ensures compatibility with NC 30 environment --- Dockerfile | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/Dockerfile b/Dockerfile index e4553cab..94ed79e0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,22 +1,22 @@ -FROM nextcloud:29.0.16-fpm AS nextcloud +FROM nextcloud:30.0.13-fpm AS nextcloud ARG BASE_DIR="/usr/src/nextcloud" ARG TMP_PATCH_DIR="/tmp/build_patches" -ARG THEME_HELPER_JOB_ID="1245676" +ARG THEME_HELPER_JOB_ID="1269062" ARG NOTES_VERSION="4.11.0" -ARG CONTACTS_JOB_ID="1156314" +#ARG CONTACTS_JOB_ID="1156314" ARG CALENDAR_JOB_ID="1242275" -ARG EMAIL_RECOVERY_JOB_ID="1245694" -ARG EA_JOB_ID="1241536" -ARG LAUNCHER_JOB_ID="1235119" +ARG EMAIL_RECOVERY_JOB_ID="1269031" +ARG EA_JOB_ID="1269049" +ARG LAUNCHER_JOB_ID="1269140" ARG GOOGLE_INTEGRATION_VERSION="3.2.0" ARG DASHBOARD_JOB_ID="1235127" ARG SNAPPY_VERSION="2.37.2" ARG SNAPPY_THEME_VERSION="4.0.4" -ARG USER_MIGRATION_JOB_ID="1239694" +ARG USER_MIGRATION_JOB_ID="1266241" ARG MEMORIES_VERSION="7.5.2" ARG DROP_ACCOUNT_VERSION="2.7.1" -RUN sed -i 's/29,0,16,1/29,0,16,4/' ${BASE_DIR}/version.php +RUN sed -i 's/30,0,13,1/30,0,13,1/' ${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 @@ -29,11 +29,11 @@ RUN curl -fsSL -o notes.tar.gz \ rm notes.tar.gz; # custom Contact -RUN curl -fsSL -o contacts.zip \ - "https://gitlab.e.foundation/e/infra/ecloud/nextcloud-apps/contacts/-/jobs/${CONTACTS_JOB_ID}/artifacts/download" && \ - unzip contacts.zip && \ - mv dist/contacts ${BASE_DIR}/custom_apps/ && \ - rm contacts.zip; +#RUN curl -fsSL -o contacts.zip \ + # "https://gitlab.e.foundation/e/infra/ecloud/nextcloud-apps/contacts/-/jobs/${CONTACTS_JOB_ID}/artifacts/download" && \ + # unzip contacts.zip && \ + # mv dist/contacts ${BASE_DIR}/custom_apps/ && \ + # rm contacts.zip; RUN curl -fsSL -o calendar.zip \ "https://gitlab.e.foundation/e/infra/ecloud/nextcloud-apps/calendar/-/jobs/${CALENDAR_JOB_ID}/artifacts/download" && \ @@ -147,15 +147,15 @@ RUN patch -u ${BASE_DIR}/lib/private/Updater.php -i ${TMP_PATCH_DIR}/010-disable RUN cd ${BASE_DIR} && patch -p0 < ${TMP_PATCH_DIR}/011-privacy-settings.patch RUN patch -u ${BASE_DIR}/lib/private/Authentication/Token/PublicKeyTokenProvider.php -i ${TMP_PATCH_DIR}/013-revert-token-password-update.patch RUN cd ${BASE_DIR} && patch -p0 < ${TMP_PATCH_DIR}/014-add-mail-usage.patch -RUN cd ${BASE_DIR} && patch -p0 < ${TMP_PATCH_DIR}/015-email-mail-template.patch -RUN patch -u ${BASE_DIR}/core/Command/User/Setting.php -i ${TMP_PATCH_DIR}/018-occ-user-setting.patch +#RUN cd ${BASE_DIR} && patch -p0 < ${TMP_PATCH_DIR}/015-email-mail-template.patch +#RUN patch -u ${BASE_DIR}/core/Command/User/Setting.php -i ${TMP_PATCH_DIR}/018-occ-user-setting.patch RUN patch -u ${BASE_DIR}/apps/files/js/files.js -i ${TMP_PATCH_DIR}/021-repeated-storage-dialog-fix.patch RUN cd ${BASE_DIR} && patch -u ${BASE_DIR}/3rdparty/sabre/vobject/lib/ITip/Broker.php -i ${TMP_PATCH_DIR}/022-significantchange.patch RUN cd ${BASE_DIR} && patch -p0 < ${TMP_PATCH_DIR}/026-primary-color-fix.patch RUN patch -u ${BASE_DIR}/lib/private/Template/JSResourceLocator.php -i ${TMP_PATCH_DIR}/031-theme-custom-app-translations.patch 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 cd ${BASE_DIR} && patch -p1 < ${TMP_PATCH_DIR}/036-user-config-change-event.patch RUN rm -rf ${TMP_PATCH_DIR} @@ -220,7 +220,7 @@ COPY patches/ ${TMP_PATCH_DIR}/ RUN patch -u ${BASE_DIR}/core/templates/layout.user.php -i ${TMP_PATCH_DIR}/003-contact-search-removal.patch RUN patch -u ${BASE_DIR}/core/Controller/ContactsMenuController.php -i ${TMP_PATCH_DIR}/004-contact-search-controller-removal.patch RUN cd ${BASE_DIR} && patch -p0 < ${TMP_PATCH_DIR}/005-autocomplete-user-leak-core.patch -RUN patch -u ${BASE_DIR}/core/templates/layout.guest.php -i ${TMP_PATCH_DIR}/016-login-screen.patch +#RUN patch -u ${BASE_DIR}/core/templates/layout.guest.php -i ${TMP_PATCH_DIR}/016-login-screen.patch RUN patch -u ${BASE_DIR}/lib/private/Notification/Manager.php -i ${TMP_PATCH_DIR}/020-fairuse-notification-fix.patch 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 RUN patch -u ${BASE_DIR}/lib/private/User/Manager.php -i ${TMP_PATCH_DIR}/025-optimize-get-by-email.patch @@ -240,7 +240,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!==t.notifications.length,/' ${BASE_DIR}/apps/notifications/js/notifications-src_NotificationsApp_vue.js +#RUN sed -i 's/attrs:{id:"notifications",/attrs:{id:"notifications","data-has-notifications":0!==t.notifications.length,/' ${BASE_DIR}/apps/notifications/js/notifications-src_NotificationsApp_vue.js # Rename Memories to Gallery RUN sed -i 's/Memories<\/name>/Gallery<\/name>/g' ${BASE_DIR}/custom_apps/memories/appinfo/info.xml @@ -249,14 +249,14 @@ RUN cd ${BASE_DIR}/custom_apps/memories/js && sed -i 's/Memories Settings/Galler # autocomplete leak tweak apps frontend with sed, disable group suggestion -RUN cd ${BASE_DIR}/custom_apps/contacts && sed -i 's/"GROUP","INDIVIDUAL"/"INDIVIDUAL"/g' js/contacts-main.js +#RUN cd ${BASE_DIR}/custom_apps/contacts && sed -i 's/"GROUP","INDIVIDUAL"/"INDIVIDUAL"/g' js/contacts-main.js 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 # 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 +#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 # Remove colored background from email template logo RUN sed -i 's/$this->header, \[$this->themingDefaults->getDefaultColorPrimary()/$this->header, \["none"/' ${BASE_DIR}/lib/private/Mail/EMailTemplate.php @@ -269,7 +269,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:e\.config\.sound_talk}/staticClass:"notification_talk",attrs:{checked:e\.config\.sound_talk}/g' ${BASE_DIR}/apps/notifications/js/notifications-settings.js +#RUN sed -i 's/attrs:{checked:e\.config\.sound_talk}/staticClass:"notification_talk",attrs:{checked:e\.config\.sound_talk}/g' ${BASE_DIR}/apps/notifications/js/notifications-settings.js # 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 -- GitLab From c337ce96a92b9037d4438e96e56d8bda29358470 Mon Sep 17 00:00:00 2001 From: Avinash Gusain Date: Wed, 23 Jul 2025 13:03:05 +0530 Subject: [PATCH 02/16] chore: update Murena Dashboard job ID and bump NC version to 30.0.13.2 --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 94ed79e0..cd0421a7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,14 +9,14 @@ ARG EMAIL_RECOVERY_JOB_ID="1269031" ARG EA_JOB_ID="1269049" ARG LAUNCHER_JOB_ID="1269140" ARG GOOGLE_INTEGRATION_VERSION="3.2.0" -ARG DASHBOARD_JOB_ID="1235127" +ARG DASHBOARD_JOB_ID="1269988" ARG SNAPPY_VERSION="2.37.2" ARG SNAPPY_THEME_VERSION="4.0.4" ARG USER_MIGRATION_JOB_ID="1266241" ARG MEMORIES_VERSION="7.5.2" ARG DROP_ACCOUNT_VERSION="2.7.1" -RUN sed -i 's/30,0,13,1/30,0,13,1/' ${BASE_DIR}/version.php +RUN sed -i 's/30,0,13,1/30,0,13,2/' ${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 -- GitLab From 670a50d7de2ac10100e027c0f98a4ecd12ae39b7 Mon Sep 17 00:00:00 2001 From: Avinash Gusain Date: Thu, 24 Jul 2025 11:03:51 +0530 Subject: [PATCH 03/16] fix: apply compatibility patches for Nextcloud 30 --- Dockerfile | 8 +- patches/015-email-mail-template.patch | 139 +++++++++++---------- patches/016-login-screen.patch | 83 ++++++------ patches/018-occ-user-setting.patch | 8 +- patches/036-user-config-change-event.patch | 29 +++-- 5 files changed, 137 insertions(+), 130 deletions(-) diff --git a/Dockerfile b/Dockerfile index cd0421a7..722c588c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -147,15 +147,15 @@ RUN patch -u ${BASE_DIR}/lib/private/Updater.php -i ${TMP_PATCH_DIR}/010-disable RUN cd ${BASE_DIR} && patch -p0 < ${TMP_PATCH_DIR}/011-privacy-settings.patch RUN patch -u ${BASE_DIR}/lib/private/Authentication/Token/PublicKeyTokenProvider.php -i ${TMP_PATCH_DIR}/013-revert-token-password-update.patch RUN cd ${BASE_DIR} && patch -p0 < ${TMP_PATCH_DIR}/014-add-mail-usage.patch -#RUN cd ${BASE_DIR} && patch -p0 < ${TMP_PATCH_DIR}/015-email-mail-template.patch -#RUN patch -u ${BASE_DIR}/core/Command/User/Setting.php -i ${TMP_PATCH_DIR}/018-occ-user-setting.patch +RUN cd ${BASE_DIR} && patch -p0 < ${TMP_PATCH_DIR}/015-email-mail-template.patch +RUN patch -u ${BASE_DIR}/core/Command/User/Setting.php -i ${TMP_PATCH_DIR}/018-occ-user-setting.patch RUN patch -u ${BASE_DIR}/apps/files/js/files.js -i ${TMP_PATCH_DIR}/021-repeated-storage-dialog-fix.patch RUN cd ${BASE_DIR} && patch -u ${BASE_DIR}/3rdparty/sabre/vobject/lib/ITip/Broker.php -i ${TMP_PATCH_DIR}/022-significantchange.patch RUN cd ${BASE_DIR} && patch -p0 < ${TMP_PATCH_DIR}/026-primary-color-fix.patch RUN patch -u ${BASE_DIR}/lib/private/Template/JSResourceLocator.php -i ${TMP_PATCH_DIR}/031-theme-custom-app-translations.patch 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 cd ${BASE_DIR} && patch -p1 < ${TMP_PATCH_DIR}/036-user-config-change-event.patch RUN rm -rf ${TMP_PATCH_DIR} @@ -220,7 +220,7 @@ COPY patches/ ${TMP_PATCH_DIR}/ RUN patch -u ${BASE_DIR}/core/templates/layout.user.php -i ${TMP_PATCH_DIR}/003-contact-search-removal.patch RUN patch -u ${BASE_DIR}/core/Controller/ContactsMenuController.php -i ${TMP_PATCH_DIR}/004-contact-search-controller-removal.patch RUN cd ${BASE_DIR} && patch -p0 < ${TMP_PATCH_DIR}/005-autocomplete-user-leak-core.patch -#RUN patch -u ${BASE_DIR}/core/templates/layout.guest.php -i ${TMP_PATCH_DIR}/016-login-screen.patch +RUN patch -u ${BASE_DIR}/core/templates/layout.guest.php -i ${TMP_PATCH_DIR}/016-login-screen.patch RUN patch -u ${BASE_DIR}/lib/private/Notification/Manager.php -i ${TMP_PATCH_DIR}/020-fairuse-notification-fix.patch 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 RUN patch -u ${BASE_DIR}/lib/private/User/Manager.php -i ${TMP_PATCH_DIR}/025-optimize-get-by-email.patch diff --git a/patches/015-email-mail-template.patch b/patches/015-email-mail-template.patch index d568956f..79717f5b 100644 --- a/patches/015-email-mail-template.patch +++ b/patches/015-email-mail-template.patch @@ -7,26 +7,25 @@ This patch helps in indentifying that For a recurring event, the invitee knows w --- ./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 -@@ -171,7 +171,29 @@ - /** @var VEvent $oldVevent */ +@@ -150,6 +150,30 @@ $oldVevent = !empty($modified['old']) && is_array($modified['old']) ? array_pop($modified['old']) : null; $isModified = isset($oldVevent); -- + + $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); + $finalStartTime = $recurrenceArray[0] . 'T' . $startDateTimeArray[1]; -+ ++ + $timeZoneId = (string) $recurrenceId['TZID']; + $oldVevent->DTSTART->setDateTime( + new \DateTime($finalStartTime, new \DateTimeZone($timeZoneId)) + ); -+ ++ + $oldVEventEnd = $oldVevent->DTEND; + $oldEndDateTime = $oldVEventEnd->getValue(); + $endDateTimeArray = explode('T', $oldEndDateTime); @@ -35,64 +34,64 @@ This patch helps in indentifying that For a recurring event, the invitee knows w + new \DateTime($finalEndTime, new \DateTimeZone($timeZoneId)) + ); + } ++ // 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)) { -@@ -238,6 +260,13 @@ + if (empty($vEvent)) { +@@ -217,12 +241,35 @@ $data['invitee_name'] = ($senderName ?: $sender); $fromEMail = Util::getDefaultEmailAddress('invitations-noreply'); -+ //if sender name is empty sometimes in case of email client ++ // if sender name is empty sometimes in case of email client + if ($senderName === null || empty(trim($senderName))) { + $users = $this->userManager->getByEmail($sender); + if (count($users) === 1) { + $senderName = $users[0]->getDisplayName(); + } + } ++ $fromName = $this->imipService->getFrom($senderName, $this->defaults->getName()); - $message = $this->mailer->createMessage() -@@ -258,7 +287,22 @@ $template = $this->mailer->createEMailTemplate('dav.calendarInvite.' . $method, $data); $template->addHeader(); - $this->imipService->addSubjectAndHeading($template, $method, $data['invitee_name'], $data['meeting_title'], $isModified, $replyingAttendee); + $l10n = \OC::$server->getL10N('dav'); -+ if ( count($vEvent)>1) { ++ if (count($vEvent) > 1) { + $this->imipService->addSubjectAndHeadingUpdated($template, $method, $data['invitee_name'], $data['meeting_title'], $isModified, $replyingAttendee); + } else { + $this->imipService->addSubjectAndHeading($template, $method, $data['invitee_name'], $data['meeting_title'], $isModified, $replyingAttendee); + } + if ($method === self::METHOD_CANCEL) { -+ $template->addHeadingBanner('#FFC2B9','#7D1000',$l10n->t('The invitation has been cancelled')); ++ $template->addHeadingBanner('#FFC2B9', '#7D1000', $l10n->t('The invitation has been cancelled')); + } -+ 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:')); ++ 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:')); ++ 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:')); + } $this->imipService->addBulletList($template, $vEvent, $data); // Only add response buttons to invitation requests: Fix Issue #11230 -@@ -291,7 +335,6 @@ +@@ -255,7 +302,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 -@@ -170,10 +170,30 @@ +@@ -163,7 +163,31 @@ $oldUrl = self::readPropertyWithDefault($oldVEvent, 'URL', $defaultVal); $data['meeting_url_html'] = !empty($oldUrl) && $oldUrl !== $data['meeting_url'] ? sprintf('%1$s', $oldUrl) : $data['meeting_url']; -- $data['meeting_when_html'] = -+ if(isset($vEvent->RRULE)){ -+ $RRule= (string) $vEvent->RRULE->getValue(); +- $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) { + $timeTitle = $this->l10n->t('Repeats daily:'); + } @@ -100,26 +99,26 @@ This patch helps in indentifying that For a recurring event, the invitee knows w + $timeTitle = $this->l10n->t('Repeats weekly:'); + } + if (strpos($RRule, 'FREQ=MONTHLY') !== false) { -+ $timeTitle = $this->l10n->t('Repeats monthly:'); ++ $timeTitle = $this->l10n->t('Repeats monthly:'); + } + if (strpos($RRule, 'FREQ=YEARLY') !== false) { + $timeTitle = $this->l10n->t('Repeats yearly:'); + } + $data['meeting_when_html'] = - ($oldMeetingWhen !== $data['meeting_when'] && $oldMeetingWhen !== null) -- ? sprintf("%s
%s", $oldMeetingWhen, $data['meeting_when']) -+ ? sprintf("%s
%s %s", $oldMeetingWhen,$timeTitle, $data['meeting_when']) -+ : $data['meeting_when']; ++ ($oldMeetingWhen !== $data['meeting_when'] && $oldMeetingWhen !== null) ++ ? sprintf("%s
%s %s", $oldMeetingWhen, $timeTitle, $data['meeting_when']) ++ : $data['meeting_when']; + } else { + $data['meeting_when_html'] = -+ ($oldMeetingWhen !== $data['meeting_when'] && $oldMeetingWhen !== null) -+ ? sprintf("%s
%s %s", $oldMeetingWhen, $this->l10n->t('Time:'),$data['meeting_when']) - : $data['meeting_when']; ++ ($oldMeetingWhen !== $data['meeting_when'] && $oldMeetingWhen !== null) ++ ? sprintf("%s
%s %s", $oldMeetingWhen, $this->l10n->t('Time:'), $data['meeting_when']) ++ : $data['meeting_when']; + } ++ } - return $data; - } -@@ -446,6 +466,51 @@ + // generate occurring next string + if ($eventReaderCurrent->recurs()) { +@@ -968,6 +992,51 @@ } /** @@ -130,7 +129,7 @@ This patch helps in indentifying that For a recurring event, the invitee knows w + * @param string|null $partstat + */ + public function addSubjectAndHeadingUpdated(IEMailTemplate $template, -+ string $method, string $sender, string $summary, bool $isModified, ?Property $replyingAttendee = null): void { ++ string $method, string $sender, string $summary, bool $isModified, ?Property $replyingAttendee = null): void { + if ($method === IMipPlugin::METHOD_CANCEL) { + // TRANSLATORS Subject for email, when an invitation is cancelled. Ex: "Cancelled: {{Event Name}}" + $template->setSubject($this->l10n->t('Cancelled: %1$s', [$summary])); @@ -171,13 +170,14 @@ This patch helps in indentifying that For a recurring event, the invitee knows w * @param string $path * @return string */ -@@ -539,12 +604,36 @@ +@@ -1061,12 +1130,47 @@ $data['meeting_title_html'] ?? $data['meeting_title'], $this->l10n->t('Title:'), $this->getAbsoluteImagePath('caldav/title.png'), $data['meeting_title'], '', IMipPlugin::IMIP_INDENT); if ($data['meeting_when'] !== '') { -- $template->addBodyListItem($data['meeting_when_html'] ?? $data['meeting_when'], $this->l10n->t('Time:'), -+ if(isset($vevent->RRULE)){ -+ $RRule=(string) $vevent->RRULE->getValue(); +- $template->addBodyListItem($data['meeting_when_html'] ?? $data['meeting_when'], $this->l10n->t('When:'), +- $this->getAbsoluteImagePath('caldav/time.png'), $data['meeting_when'], '', IMipPlugin::IMIP_INDENT); ++ if (isset($vevent->RRULE)) { ++ $RRule = (string) $vevent->RRULE->getValue(); + if (strpos($RRule, 'FREQ=DAILY') !== false) { + $timeTitle = $this->l10n->t('Repeats daily:'); + } @@ -185,25 +185,36 @@ This patch helps in indentifying that For a recurring event, the invitee knows w + $timeTitle = $this->l10n->t('Repeats weekly:'); + } + if (strpos($RRule, 'FREQ=MONTHLY') !== false) { -+ $timeTitle = $this->l10n->t('Repeats monthly:'); ++ $timeTitle = $this->l10n->t('Repeats monthly:'); + } + if (strpos($RRule, 'FREQ=YEARLY') !== false) { + $timeTitle = $this->l10n->t('Repeats yearly:'); + } -+ $template->addBodyListItem($data['meeting_when_html'] ?? $data['meeting_when'], $timeTitle, -+ $this->getAbsoluteImagePath('caldav/time.png'), $data['meeting_when'], '', IMipPlugin::IMIP_INDENT); ++ $template->addBodyListItem( ++ $data['meeting_when_html'] ?? $data['meeting_when'], ++ $timeTitle, ++ $this->getAbsoluteImagePath('caldav/time.png'), ++ $data['meeting_when'], ++ '', ++ IMipPlugin::IMIP_INDENT ++ ); + } else { -+ $template->addBodyListItem($data['meeting_when_html'] ?? $data['meeting_when'], $this->l10n->t('Time:'), - $this->getAbsoluteImagePath('caldav/time.png'), $data['meeting_when'], '', IMipPlugin::IMIP_INDENT); -+ } ++ $template->addBodyListItem( ++ $data['meeting_when_html'] ?? $data['meeting_when'], ++ $this->l10n->t('Time:'), ++ $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:'), - $this->getAbsoluteImagePath('caldav/location.png'), $data['meeting_location'], '', IMipPlugin::IMIP_INDENT); -+ if(filter_var(trim($data['meeting_location']), FILTER_VALIDATE_URL)) { ++ if(filter_var(trim($data['meeting_location']), FILTER_VALIDATE_URL)) { + $template->addBodyListItem($data['meeting_location_html'] ?? $data['meeting_location'], $this->l10n->t('Location:'), + $this->getAbsoluteImagePath('caldav/videocall.png'), $data['meeting_location'], '', IMipPlugin::IMIP_INDENT); -+ + } else { + $template->addBodyListItem($data['meeting_location_html'] ?? $data['meeting_location'], $this->l10n->t('Location:'), + $this->getAbsoluteImagePath('caldav/location.png'), $data['meeting_location'], '', IMipPlugin::IMIP_INDENT); @@ -211,7 +222,7 @@ 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:'), -@@ -642,7 +731,7 @@ +@@ -1143,7 +1247,7 @@ * @param $token */ public function addResponseButtons(IEMailTemplate $template, $token) { @@ -220,7 +231,7 @@ 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, -@@ -650,22 +739,12 @@ +@@ -1151,20 +1255,10 @@ $this->l10n->t('Decline'), $this->urlGenerator->linkToRouteAbsolute('dav.invitation_response.decline', [ 'token' => $token, @@ -229,8 +240,8 @@ This patch helps in indentifying that For a recurring event, the invitee knows w + $this->l10n->t('MayBe'), + $this->urlGenerator->getAbsoluteUrl('apps/calendar/invitation/tentative/'.$token) ); - } - +- } +- - public function addMoreOptionsButton(IEMailTemplate $template, $token) { - $moreOptionsURL = $this->urlGenerator->linkToRouteAbsolute('dav.invitation_response.options', [ - 'token' => $token, @@ -241,35 +252,32 @@ 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); -- } -- + } + public function getReplyingAttendee(Message $iTipMessage): ?Property { - /** @var VEvent $vevent */ - $vevent = $iTipMessage->message->VEVENT; + --- ./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 -@@ -94,11 +94,10 @@ +@@ -77,9 +77,9 @@ unset($newEventComponents[$k]); } } - + $sentOld = 0; - if(empty($old)) { + if (empty($old)) { - return ['old' => null, 'new' => $newEventComponents]; + return ['old' => null, 'new' => $newEventComponents, 'sentOld' => $sentOld]; } -- + $oldEventComponents = $old->getComponents(); - if(is_array($oldEventComponents) && !empty($oldEventComponents)) { - foreach ($oldEventComponents as $k => $event) { -@@ -107,11 +106,15 @@ +@@ -90,11 +90,15 @@ continue; } - if($this->removeIfUnchanged($event, $newEventComponents)) { + if ($this->removeIfUnchanged($event, $newEventComponents)) { - unset($oldEventComponents[$k]); -+ if($k!=1){ -+ unset($oldEventComponents[$k]); -+ } else { ++ if($k!=1){ ++ unset($oldEventComponents[$k]); ++ } else { + $sentOld = 1; + } } @@ -280,3 +288,4 @@ 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 d8a1dacd..d7d7b98a 100644 --- a/patches/016-login-screen.patch +++ b/patches/016-login-screen.patch @@ -1,6 +1,6 @@ ---- ./core/templates/layout.guest.php 2024-03-15 19:20:21 -+++ ./core/templates/layout.guest-new.php 2024-03-15 19:24:49 -@@ -22,6 +22,7 @@ +--- layout.guest.php 2025-07-24 10:37:50 ++++ layout.guest-new.php 2025-07-24 10:58:20 +@@ -32,6 +32,7 @@ @@ -8,67 +8,66 @@ -@@ -32,12 +33,37 @@ - $initialState) { ?> - - --
--
-+
" > -+ +@@ -42,10 +43,38 @@ + +
+
++
" > ++ + -- -+ -\ No newline at end of file + --- ./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 -@@ -50,4 +50,12 @@ - - .help-content__body > .button { +.help-content__body > .button { margin: 20px; +} +#content #app-navigation { @@ -132,5 +128,4 @@ help links are shown + +#app-navigation:not(.vue) > ul > li > a { + padding: 0 12px 0 44px; - } - + } \ No newline at end of file diff --git a/patches/010-disable-app-store-upgrade.patch b/patches/010-disable-app-store-upgrade.patch index 59e4f0db..07ab975a 100644 --- a/patches/010-disable-app-store-upgrade.patch +++ b/patches/010-disable-app-store-upgrade.patch @@ -6,17 +6,18 @@ 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 -@@ -272,11 +272,11 @@ +@@ -240,11 +240,11 @@ $appManager = \OC::$server->getAppManager(); // upgrade appstore apps - $this->upgradeAppStoreApps($appManager->getInstalledApps()); -+ /*$this->upgradeAppStoreApps($appManager->getInstalledApps()); ++ /* $this->upgradeAppStoreApps($appManager->getInstalledApps()); $autoDisabledApps = $appManager->getAutoDisabledApps(); if (!empty($autoDisabledApps)) { $this->upgradeAppStoreApps(array_keys($autoDisabledApps), $autoDisabledApps); - } -+ }*/ ++ } */ // install new shipped apps on upgrade $errors = Installer::installShippedApps(true); + diff --git a/patches/011-privacy-settings.patch b/patches/011-privacy-settings.patch index 3593bc39..940d8eac 100644 --- a/patches/011-privacy-settings.patch +++ b/patches/011-privacy-settings.patch @@ -6,7 +6,7 @@ This patch removes certain unnecessary sections from the "privacy" section in pe --- ./apps/privacy/lib/Settings/MissionSettings.php 2021-09-07 17:38:08.650902445 +0530 +++ ./apps/privacy/lib/Settings/MissionSettings-new.php 2021-09-07 17:40:30.078256502 +0530 -@@ -52,7 +52,7 @@ +@@ -36,7 +36,7 @@ return null; } @@ -18,7 +18,7 @@ This patch removes certain unnecessary sections from the "privacy" section in pe --- ./apps/privacy/lib/Settings/UserDataManifestoSettings.php 2021-09-07 17:38:06.284224253 +0530 +++ ./apps/privacy/lib/Settings/UserDataManifestoSettings-new.php 2021-09-07 17:40:42.288315736 +0530 -@@ -45,7 +45,7 @@ +@@ -29,7 +29,7 @@ return null; } @@ -30,7 +30,7 @@ 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 -@@ -103,7 +103,7 @@ +@@ -87,7 +87,7 @@ 'internal' => false, ]; } @@ -39,4 +39,4 @@ This patch removes certain unnecessary sections from the "privacy" section in pe return new JSONResponse($uids, Http::STATUS_OK); } } - +\ No newline at end of file diff --git a/patches/028-default-task-calendar.patch b/patches/028-default-task-calendar.patch index 283244d4..b3361d49 100644 --- a/patches/028-default-task-calendar.patch +++ b/patches/028-default-task-calendar.patch @@ -6,7 +6,7 @@ This patch creates a default task VTODO calender on first login --- apps/dav/lib/HookManager.php 2023-09-27 15:22:49 +++ apps/dav/lib/HookManager-new.php 2023-09-27 15:24:15 -@@ -173,9 +173,14 @@ +@@ -152,9 +152,15 @@ try { $this->calDav->createCalendar($principal, CalDavBackend::PERSONAL_CALENDAR_URI, [ '{DAV:}displayname' => CalDavBackend::PERSONAL_CALENDAR_NAME, @@ -19,6 +19,7 @@ This patch creates a default task VTODO calender on first login + '{http://apple.com/ns/ical/}calendar-color' => '#007FFF', + 'components' => 'VTODO' + ]); ++ } catch (\Exception $e) { \OC::$server->get(LoggerInterface::class)->error($e->getMessage(), ['exception' => $e]); } -- GitLab From 47a299a9b11867999536692fdb9a815d1adabec5 Mon Sep 17 00:00:00 2001 From: Avinash Gusain Date: Tue, 29 Jul 2025 10:38:52 +0530 Subject: [PATCH 12/16] fix(offset): applied offset corrections to additional patches --- .../013-revert-token-password-update.patch | 5 +- patches/014-add-mail-usage.patch | 6 +- patches/015-email-mail-template.patch | 78 +++++-------------- 3 files changed, 27 insertions(+), 62 deletions(-) diff --git a/patches/013-revert-token-password-update.patch b/patches/013-revert-token-password-update.patch index e63ccfc6..32af5638 100644 --- a/patches/013-revert-token-password-update.patch +++ b/patches/013-revert-token-password-update.patch @@ -7,11 +7,11 @@ 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 -@@ -517,6 +517,11 @@ +@@ -504,6 +504,11 @@ } public function updatePasswords(string $uid, string $password) { -+ if (!$this->mapper->hasExpiredTokens($uid)) { ++ if (!$this->mapper->hasExpiredTokens($uid)) { + //Nothing to do here + return; + } @@ -19,3 +19,4 @@ This patch reverts to only update when there are expired tokens. // 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 081afa32..4418b3e1 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 -@@ -542,6 +542,12 @@ +@@ -512,6 +512,12 @@ } try { $free = $sourceStorage->free_space($rootInfo->getInternalPath()); @@ -13,10 +13,10 @@ if (is_bool($free)) { $free = 0.0; } -@@ -577,7 +583,6 @@ +@@ -547,7 +553,6 @@ */ $isRemoteShare = $storage->instanceOfStorage(\OCA\Files_Sharing\External\Storage::class); - $ownerId = $storage->getOwner($path); $hasOwnerId = $ownerId !== false && $ownerId !== null; - $ownerDisplayName = ''; + $ownerDisplayName = ''; \ No newline at end of file diff --git a/patches/015-email-mail-template.patch b/patches/015-email-mail-template.patch index 79717f5b..3b0a77b8 100644 --- a/patches/015-email-mail-template.patch +++ b/patches/015-email-mail-template.patch @@ -7,15 +7,15 @@ This patch helps in indentifying that For a recurring event, the invitee knows w --- ./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 -@@ -150,6 +150,30 @@ +@@ -149,7 +149,30 @@ + /** @var VEvent $oldVevent */ $oldVevent = !empty($modified['old']) && is_array($modified['old']) ? array_pop($modified['old']) : null; $isModified = isset($oldVevent); - + $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 +241,35 @@ +@@ -217,12 +240,35 @@ $data['invitee_name'] = ($senderName ?: $sender); $fromEMail = Util::getDefaultEmailAddress('invitations-noreply'); @@ -75,13 +75,13 @@ 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 +302,6 @@ +@@ -255,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 @@ -118,10 +118,11 @@ This patch helps in indentifying that For a recurring event, the invitee knows w } // generate occurring next string if ($eventReaderCurrent->recurs()) { -@@ -968,6 +992,51 @@ +@@ -967,6 +991,51 @@ + } } - /** ++ /** + * @param IEMailTemplate $template + * @param string $method + * @param string $sender @@ -166,63 +167,26 @@ This patch helps in indentifying that For a recurring event, the invitee knows w + } + } + -+ /** + /** * @param string $path * @return string - */ -@@ -1061,12 +1130,47 @@ - $data['meeting_title_html'] ?? $data['meeting_title'], $this->l10n->t('Title:'), - $this->getAbsoluteImagePath('caldav/title.png'), $data['meeting_title'], '', IMipPlugin::IMIP_INDENT); - if ($data['meeting_when'] !== '') { -- $template->addBodyListItem($data['meeting_when_html'] ?? $data['meeting_when'], $this->l10n->t('When:'), -- $this->getAbsoluteImagePath('caldav/time.png'), $data['meeting_when'], '', IMipPlugin::IMIP_INDENT); -+ if (isset($vevent->RRULE)) { -+ $RRule = (string) $vevent->RRULE->getValue(); -+ if (strpos($RRule, 'FREQ=DAILY') !== false) { -+ $timeTitle = $this->l10n->t('Repeats daily:'); -+ } -+ if (strpos($RRule, 'FREQ=WEEKLY') !== false) { -+ $timeTitle = $this->l10n->t('Repeats weekly:'); -+ } -+ if (strpos($RRule, 'FREQ=MONTHLY') !== false) { -+ $timeTitle = $this->l10n->t('Repeats monthly:'); -+ } -+ if (strpos($RRule, 'FREQ=YEARLY') !== false) { -+ $timeTitle = $this->l10n->t('Repeats yearly:'); -+ } -+ $template->addBodyListItem( -+ $data['meeting_when_html'] ?? $data['meeting_when'], -+ $timeTitle, -+ $this->getAbsoluteImagePath('caldav/time.png'), -+ $data['meeting_when'], -+ '', -+ IMipPlugin::IMIP_INDENT -+ ); -+ } else { -+ $template->addBodyListItem( -+ $data['meeting_when_html'] ?? $data['meeting_when'], -+ $this->l10n->t('Time:'), -+ $this->getAbsoluteImagePath('caldav/time.png'), -+ $data['meeting_when'], -+ '', -+ IMipPlugin::IMIP_INDENT -+ ); -+ } +@@ -1065,8 +1134,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:'), - $this->getAbsoluteImagePath('caldav/location.png'), $data['meeting_location'], '', IMipPlugin::IMIP_INDENT); -+ if(filter_var(trim($data['meeting_location']), FILTER_VALIDATE_URL)) { ++ if(filter_var(trim($data['meeting_location']), FILTER_VALIDATE_URL)) { + $template->addBodyListItem($data['meeting_location_html'] ?? $data['meeting_location'], $this->l10n->t('Location:'), + $this->getAbsoluteImagePath('caldav/videocall.png'), $data['meeting_location'], '', IMipPlugin::IMIP_INDENT); + } else { + $template->addBodyListItem($data['meeting_location_html'] ?? $data['meeting_location'], $this->l10n->t('Location:'), + $this->getAbsoluteImagePath('caldav/location.png'), $data['meeting_location'], '', IMipPlugin::IMIP_INDENT); -+ } ++ } } if ($data['meeting_url'] !== '') { $template->addBodyListItem($data['meeting_url_html'] ?? $data['meeting_url'], $this->l10n->t('Link:'), -@@ -1143,7 +1247,7 @@ +@@ -1143,7 +1217,7 @@ * @param $token */ public function addResponseButtons(IEMailTemplate $template, $token) { @@ -231,7 +195,7 @@ 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 +1255,10 @@ +@@ -1151,20 +1225,10 @@ $this->l10n->t('Decline'), $this->urlGenerator->linkToRouteAbsolute('dav.invitation_response.decline', [ 'token' => $token, @@ -258,11 +222,10 @@ This patch helps in indentifying that For a recurring event, the invitee knows w --- ./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 -@@ -77,9 +77,9 @@ - unset($newEventComponents[$k]); +@@ -78,8 +78,9 @@ } } -- + + $sentOld = 0; if (empty($old)) { - return ['old' => null, 'new' => $newEventComponents]; @@ -270,16 +233,17 @@ This patch helps in indentifying that For a recurring event, the invitee knows w } $oldEventComponents = $old->getComponents(); -@@ -90,11 +90,15 @@ +@@ -90,11 +91,16 @@ continue; } if ($this->removeIfUnchanged($event, $newEventComponents)) { - unset($oldEventComponents[$k]); -+ if($k!=1){ ++ if($k!=1){ + unset($oldEventComponents[$k]); + } else { + $sentOld = 1; + } ++ } } } -- GitLab From 90d0d80f53c4b188a8fa074c9045aeed21d2de1d Mon Sep 17 00:00:00 2001 From: Avinash Gusain Date: Tue, 29 Jul 2025 11:07:39 +0530 Subject: [PATCH 13/16] fix(offset): applied offset corrections to more additional patches --- patches/021-repeated-storage-dialog-fix.patch | 41 ++++++++++--------- patches/026-primary-color-fix.patch | 4 +- .../031-theme-custom-app-translations.patch | 5 ++- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/patches/021-repeated-storage-dialog-fix.patch b/patches/021-repeated-storage-dialog-fix.patch index a1e189b8..118e396d 100644 --- a/patches/021-repeated-storage-dialog-fix.patch +++ b/patches/021-repeated-storage-dialog-fix.patch @@ -1,39 +1,40 @@ --- apps/files/js/files.js 2022-11-28 19:10:48.625188000 +0530 +++ apps/files/js/files-new.js 2022-11-28 19:12:41.425188000 +0530 -@@ -181,6 +181,18 @@ +@@ -177,6 +177,18 @@ {type : 'error'} ); } else { -+ var exist=0; ++ var exist = 0; + $('body').find('.toastify').each(function(i, obj) { -+ var toastmsg=$(obj).text(); -+ toastmsg=toastmsg.replace('✖', '').trim(); -+ actualmsg=t('files','Your storage is full, files cannot be updated or synced anymore!'); -+ if(toastmsg===actualmsg){ -+ exist=1; ++ var toastmsg = $(obj).text(); ++ toastmsg = toastmsg.replace('✖', '').trim(); ++ actualmsg = t('files', 'Your storage is full, files cannot be updated or synced anymore!'); ++ if (toastmsg === actualmsg) { ++ exist = 1; + } -+ }); -+ if(exist==1){ ++ }); ++ if (exist == 1) { + return; -+ } ++ } OC.Notification.show(t('files', 'Your storage is full, files cannot be updated or synced anymore!'), {type: 'error'} -@@ -210,6 +222,19 @@ +@@ -206,6 +218,20 @@ {type : 'error'} ); } else { -+ var exist=0; -+ $('body').find('.toastify').each(function(i, obj) { -+ var toastmsg=$(obj).text(); -+ toastmsg=toastmsg.replace('✖', '').trim(); -+ actualmsg=t('files', 'Your storage is almost full ({usedSpacePercent}%).', -+ {usedSpacePercent: usedSpacePercent}); -+ if(toastmsg===actualmsg){ -+ exist=1; ++ var exist = 0; ++ $('body').find('.toastify').each(function(i, obj) { ++ var toastmsg = $(obj).text(); ++ toastmsg = toastmsg.replace('✖', '').trim(); ++ actualmsg = t('files', 'Your storage is almost full ({usedSpacePercent}%).', { ++ usedSpacePercent: usedSpacePercent ++ }); ++ if (toastmsg === actualmsg) { ++ exist = 1; + } + }); -+ if(exist==1){ ++ if (exist == 1) { + return; + } OC.Notification.show(t('files', 'Your storage is almost full ({usedSpacePercent}%).', diff --git a/patches/026-primary-color-fix.patch b/patches/026-primary-color-fix.patch index deda093a..405d63d9 100644 --- a/patches/026-primary-color-fix.patch +++ b/patches/026-primary-color-fix.patch @@ -4,7 +4,7 @@ Subject: [PATCH] To fix the primary color in nextcloud 25 onwards --- apps/theming/lib/Themes/CommonThemeTrait.php 2023-04-12 17:16:23.456078658 +0530 +++ apps/theming/lib/Themes/CommonThemeTrait-new.php 2023-04-12 17:17:30.456079957 +0530 -@@ -40,6 +40,9 @@ +@@ -26,6 +26,9 @@ */ protected function generatePrimaryVariables(string $colorMainBackground, string $colorMainText, bool $highContrast = false): array { $isBrightColor = $this->util->isBrightColor($colorMainBackground); @@ -17,7 +17,7 @@ Subject: [PATCH] To fix the primary color in nextcloud 25 onwards --- apps/theming/lib/Util.php 2023-04-12 17:16:23.456078658 +0530 +++ apps/theming/lib/Util-new.php 2023-04-12 17:17:30.456079957 +0530 -@@ -57,7 +57,7 @@ +@@ -35,7 +35,7 @@ * @return bool */ public function invertTextColor(string $color): bool { diff --git a/patches/031-theme-custom-app-translations.patch b/patches/031-theme-custom-app-translations.patch index 8c161185..dd9bb274 100644 --- a/patches/031-theme-custom-app-translations.patch +++ b/patches/031-theme-custom-app-translations.patch @@ -1,6 +1,6 @@ --- ./lib/private/Template/JSResourceLocator.php 2024-08-29 22:10:30.588659044 +0530 +++ ./lib/private/Template/JSResourceLocator-new.php 2024-08-29 23:55:00.239753244 +0530 -@@ -67,6 +67,7 @@ +@@ -47,6 +47,7 @@ } catch (AppPathNotFoundException $e) { // ignore } @@ -8,7 +8,7 @@ if (str_contains($script, '/l10n/')) { // For language files we try to load them all, so themes can overwrite -@@ -77,7 +78,7 @@ +@@ -57,7 +58,7 @@ $found += $this->appendScriptIfExist($this->serverroot, $script); $found += $this->appendScriptIfExist($this->serverroot, $theme_dir.$script); $found += $this->appendScriptIfExist($appRoot, $script, $appWebRoot); @@ -17,3 +17,4 @@ if ($found) { return; + -- GitLab From 04bb041b3166ff3fc109c8b1c4ab21e360edb4af Mon Sep 17 00:00:00 2001 From: Avinash Gusain Date: Tue, 29 Jul 2025 11:23:31 +0530 Subject: [PATCH 14/16] fix(offset): applied offset corrections to more additional patches(2) --- patches/003-contact-search-removal.patch | 2 +- patches/005-autocomplete-user-leak-core.patch | 8 ++++---- patches/032-select-lang-from-session.patch | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/patches/003-contact-search-removal.patch b/patches/003-contact-search-removal.patch index 26b84267..aef513aa 100644 --- a/patches/003-contact-search-removal.patch +++ b/patches/003-contact-search-removal.patch @@ -7,7 +7,7 @@ This patch removes the top right icon enabling the global user search function a 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 -@@ -70,7 +70,6 @@ +@@ -76,7 +76,6 @@
diff --git a/patches/005-autocomplete-user-leak-core.patch b/patches/005-autocomplete-user-leak-core.patch index fb1d9fbd..b8d92820 100644 --- a/patches/005-autocomplete-user-leak-core.patch +++ b/patches/005-autocomplete-user-leak-core.patch @@ -14,7 +14,7 @@ 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 -@@ -175,8 +175,8 @@ +@@ -150,8 +150,8 @@ if ( $this->shareeEnumerationFullMatch && $lowerSearch !== '' && (strtolower($uid) === $lowerSearch || @@ -29,7 +29,7 @@ diff --git lib/private/Collaboration/Collaborators/UserPlugin.php lib/private/Co 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 -@@ -39,6 +39,7 @@ +@@ -19,6 +19,7 @@ use OCP\IUserSession; use OCP\Mail\IMailer; use OCP\Share\IShare; @@ -37,7 +37,7 @@ diff --git lib/private/Collaboration/Collaborators/MailPlugin.php lib/private/Co class MailPlugin implements ISearchPlugin { protected bool $shareWithGroupOnly; -@@ -61,8 +62,10 @@ +@@ -42,8 +43,10 @@ private KnownUserService $knownUserService, private IUserSession $userSession, private IMailer $mailer, @@ -48,7 +48,7 @@ diff --git lib/private/Collaboration/Collaborators/MailPlugin.php lib/private/Co $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'; -@@ -221,27 +224,61 @@ +@@ -204,27 +207,61 @@ if ($exactEmailMatch) { $searchResult->markExactIdMatch($emailType); } diff --git a/patches/032-select-lang-from-session.patch b/patches/032-select-lang-from-session.patch index 52e5e8fc..387d7fd0 100644 --- a/patches/032-select-lang-from-session.patch +++ b/patches/032-select-lang-from-session.patch @@ -6,7 +6,7 @@ $_SERVER in IRequest is immutable but we want to switch the header to deliver tr --- lib/private/L10N/Factory.php 2023-11-29 17:46:48.253716340 +0530 +++ lib/private/L10N/Factory-new.php 2023-11-29 17:47:26.194920628 +0530 -@@ -479,6 +479,9 @@ +@@ -428,6 +428,9 @@ */ private function getLanguageFromRequest(?string $app = null): string { $header = $this->request->getHeader('ACCEPT_LANGUAGE'); -- GitLab From 0fe27291f425d39844beb7e3083986f1f51728d9 Mon Sep 17 00:00:00 2001 From: Avinash Gusain Date: Tue, 29 Jul 2025 11:34:36 +0530 Subject: [PATCH 15/16] fix(offset): applied offset corrections to more additional patches(3) --- patches/020-fairuse-notification-fix.patch | 2 +- patches/023-ldap-check-pwd-optimization.patch | 8 ++++---- patches/025-optimize-get-by-email.patch | 2 +- patches/027-displayname-user-leak-dav.patch | 2 +- patches/029-restrict-user-to-change-primary-email.patch | 6 +++--- patches/033-verification-token-private.patch | 4 ++-- patches/034-oidc-bearer-token-auth.patch | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/patches/020-fairuse-notification-fix.patch b/patches/020-fairuse-notification-fix.patch index 89dbafeb..440267ab 100644 --- a/patches/020-fairuse-notification-fix.patch +++ b/patches/020-fairuse-notification-fix.patch @@ -1,6 +1,6 @@ --- lib/private/Notification/Manager.php 2023-03-28 15:06:21.073329171 +0530 +++ lib/private/Notification/Manager-new.php 2023-03-28 15:07:06.854351797 +0530 -@@ -285,18 +285,7 @@ +@@ -272,18 +272,7 @@ * {@inheritDoc} */ public function isFairUseOfFreePushService(): bool { diff --git a/patches/023-ldap-check-pwd-optimization.patch b/patches/023-ldap-check-pwd-optimization.patch index 5349508e..bda40f8b 100644 --- a/patches/023-ldap-check-pwd-optimization.patch +++ b/patches/023-ldap-check-pwd-optimization.patch @@ -4,7 +4,7 @@ Subject: [PATCH] This patch optimize the ldap checkPassword function to reduce n --- ./apps/user_ldap/lib/User_LDAP.php 2023-01-04 16:20:02.747181606 +0530 +++ ./apps/user_ldap/lib/User_LDAP-new.php 2023-01-17 19:22:51.776857415 +0530 -@@ -107,11 +107,12 @@ +@@ -76,11 +76,12 @@ * @return string|false * @throws \Exception */ @@ -19,7 +19,7 @@ Subject: [PATCH] This patch optimize the ldap checkPassword function to reduce n return $username; } -@@ -126,6 +127,9 @@ +@@ -96,6 +97,9 @@ } $username = $user->getUsername(); $this->access->connection->writeToCache($cacheKey, $username); @@ -29,7 +29,7 @@ Subject: [PATCH] This patch optimize the ldap checkPassword function to reduce n return $username; } catch (NotOnLDAP $e) { $this->access->connection->writeToCache($cacheKey, false); -@@ -169,16 +173,11 @@ +@@ -142,16 +146,11 @@ * @return false|string */ public function checkPassword($uid, $password) { @@ -49,7 +49,7 @@ Subject: [PATCH] This patch optimize the ldap checkPassword function to reduce n $user = $this->access->userManager->get($dn); if (!$user instanceof User) { -@@ -196,7 +195,6 @@ +@@ -164,7 +163,6 @@ } $this->access->cacheUserExists($user->getUsername()); diff --git a/patches/025-optimize-get-by-email.patch b/patches/025-optimize-get-by-email.patch index 64717185..b1aa5725 100644 --- a/patches/025-optimize-get-by-email.patch +++ b/patches/025-optimize-get-by-email.patch @@ -4,7 +4,7 @@ Subject: [PATCH] To optimize getByEmail as we have boundary conditions that emai --- ./lib/private/User/Manager.php 2023-05-05 18:29:34.818568291 +0530 +++ ./lib/private/User/Manager-new.php 2023-05-05 18:33:49.872682118 +0530 -@@ -679,12 +679,33 @@ +@@ -653,12 +653,33 @@ */ public function getByEmail($email) { // looking for 'email' only (and not primary_mail) is intentional diff --git a/patches/027-displayname-user-leak-dav.patch b/patches/027-displayname-user-leak-dav.patch index c0fe891c..b4552d68 100644 --- a/patches/027-displayname-user-leak-dav.patch +++ b/patches/027-displayname-user-leak-dav.patch @@ -7,7 +7,7 @@ of the user and not on the display name property --- ./apps/dav/lib/Connector/Sabre/Principal.php 2023-05-09 15:49:02.397783639 +0530 +++ ./apps/dav/lib/Connector/Sabre/Principal-new.php 2023-05-09 15:49:56.555305986 +0530 -@@ -364,7 +364,7 @@ +@@ -334,7 +334,7 @@ if (!$allowEnumeration) { if ($allowEnumerationFullMatch) { $lowerSearch = strtolower($value); diff --git a/patches/029-restrict-user-to-change-primary-email.patch b/patches/029-restrict-user-to-change-primary-email.patch index b4588c4c..faa55bec 100644 --- a/patches/029-restrict-user-to-change-primary-email.patch +++ b/patches/029-restrict-user-to-change-primary-email.patch @@ -1,6 +1,6 @@ --- ./apps/provisioning_api/lib/Controller/UsersController.php 2025-06-10 18:21:13.822570507 +0600 +++ ./apps/provisioning_api/lib/Controller/UsersController-new.php 2025-06-16 18:43:19.135040688 +0600 -@@ -783,7 +783,7 @@ +@@ -757,7 +757,7 @@ $permittedFields[] = IAccountManager::PROPERTY_EMAIL; } @@ -9,7 +9,7 @@ $permittedFields[] = IAccountManager::PROPERTY_PHONE; $permittedFields[] = IAccountManager::PROPERTY_ADDRESS; $permittedFields[] = IAccountManager::PROPERTY_WEBSITE; -@@ -840,8 +840,8 @@ +@@ -813,8 +813,8 @@ $permittedFields = []; if ($targetUser->getUID() === $currentLoggedInUser->getUID()) { // Editing self (display, email) @@ -20,7 +20,7 @@ } else { // Check if admin / subadmin if ($isAdminOrSubadmin || $isDelegatedAdmin && !$this->groupManager->isInGroup($targetUser->getUID(), 'admin')) { -@@ -947,9 +947,9 @@ +@@ -919,9 +919,9 @@ } $permittedFields[] = IAccountManager::PROPERTY_DISPLAYNAME . self::SCOPE_SUFFIX; diff --git a/patches/033-verification-token-private.patch b/patches/033-verification-token-private.patch index d4e4c6ed..80e016f3 100644 --- a/patches/033-verification-token-private.patch +++ b/patches/033-verification-token-private.patch @@ -1,6 +1,6 @@ --- lib/private/Security/VerificationToken/VerificationToken.php 2023-12-10 23:05:06 +++ lib/private/Security/VerificationToken/VerificationToken-new.php 2023-12-11 23:29:24 -@@ -101,6 +101,7 @@ +@@ -82,6 +82,7 @@ IUser $user, string $subject, string $passwordPrefix = '', @@ -8,7 +8,7 @@ ): string { $token = $this->secureRandom->generate( 21, -@@ -115,7 +116,7 @@ +@@ -97,7 +98,7 @@ 'userId' => $user->getUID(), 'subject' => $subject, 'pp' => $passwordPrefix, diff --git a/patches/034-oidc-bearer-token-auth.patch b/patches/034-oidc-bearer-token-auth.patch index ab1045e8..4f86fc15 100644 --- a/patches/034-oidc-bearer-token-auth.patch +++ b/patches/034-oidc-bearer-token-auth.patch @@ -1,6 +1,6 @@ --- lib/private/AppFramework/Middleware/Security/CORSMiddleware.php 2024-04-08 08:53:20.410444998 +0530 +++ lib/private/AppFramework/Middleware/Security/CORSMiddleware-new.php 2024-04-09 19:05:21.133629632 +0530 -@@ -91,6 +91,10 @@ +@@ -75,6 +75,10 @@ // Allow to use the current session if a CSRF token is provided if ($this->request->passesCSRFCheck()) { return; -- GitLab From cacc04129549c9d139c1dddf79d28efe645d67d9 Mon Sep 17 00:00:00 2001 From: Avinash Gusain Date: Tue, 29 Jul 2025 14:00:31 +0530 Subject: [PATCH 16/16] chore: updated job to latest successful builds --- Dockerfile | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6100533e..3fa7ae87 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,18 +1,18 @@ FROM nextcloud:30.0.13-fpm AS nextcloud ARG BASE_DIR="/usr/src/nextcloud" ARG TMP_PATCH_DIR="/tmp/build_patches" -ARG THEME_HELPER_JOB_ID="1269062" +ARG THEME_HELPER_JOB_ID="1273671" ARG NOTES_VERSION="4.11.0" -ARG CONTACTS_JOB_ID="1272425" -ARG CALENDAR_JOB_ID="1272463" -ARG EMAIL_RECOVERY_JOB_ID="1269031" -ARG EA_JOB_ID="1269049" -ARG LAUNCHER_JOB_ID="1269140" +ARG CONTACTS_JOB_ID="1273569" +ARG CALENDAR_JOB_ID="1273554" +ARG EMAIL_RECOVERY_JOB_ID="1273659" +ARG EA_JOB_ID="1273772" +ARG LAUNCHER_JOB_ID="1273647" ARG GOOGLE_INTEGRATION_VERSION="3.2.0" -ARG DASHBOARD_JOB_ID="1269988" +ARG DASHBOARD_JOB_ID="1273623" ARG SNAPPY_VERSION="2.37.2" ARG SNAPPY_THEME_VERSION="4.0.4" -ARG USER_MIGRATION_JOB_ID="1266241" +ARG USER_MIGRATION_JOB_ID="1273698" ARG MEMORIES_VERSION="7.5.2" ARG DROP_ACCOUNT_VERSION="2.7.1" -- GitLab