Loading Dockerfile +4 −4 Original line number Diff line number Diff line Loading @@ -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} Loading Loading @@ -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 Loading patches/015-email-mail-template.patch +74 −65 Original line number Diff line number Diff line Loading @@ -7,11 +7,10 @@ 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(); Loading @@ -35,10 +34,11 @@ 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 @@ @@ -217,12 +241,35 @@ $data['invitee_name'] = ($senderName ?: $sender); $fromEMail = Util::getDefaultEmailAddress('invitations-noreply'); Loading @@ -49,10 +49,9 @@ This patch helps in indentifying that For a recurring event, the invitee knows w + $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(); Loading @@ -76,7 +75,7 @@ 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 @@ -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); Loading @@ -86,11 +85,11 @@ This patch helps in indentifying that For a recurring event, the invitee knows w --- ./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('<a href="%1$s">%1$s</a>', $oldUrl) : $data['meeting_url']; - $data['meeting_when_html'] = - $data['meeting_when_html'] = $oldMeetingWhen !== $data['meeting_when'] ? sprintf("<span style='text-decoration: line-through'>%s</span><br />%s", $oldMeetingWhen, $data['meeting_when']) : $data['meeting_when']; + if (isset($vEvent->RRULE)) { + $RRule = (string) $vEvent->RRULE->getValue(); + if (strpos($RRule, 'FREQ=DAILY') !== false) { Loading @@ -106,20 +105,20 @@ This patch helps in indentifying that For a recurring event, the invitee knows w + $timeTitle = $this->l10n->t('Repeats yearly:'); + } + $data['meeting_when_html'] = ($oldMeetingWhen !== $data['meeting_when'] && $oldMeetingWhen !== null) - ? sprintf("<span style='text-decoration: line-through'>%s</span><br />%s", $oldMeetingWhen, $data['meeting_when']) + ($oldMeetingWhen !== $data['meeting_when'] && $oldMeetingWhen !== null) + ? sprintf("<span style='text-decoration: line-through'>%s</span><br /><span style='color:#6CA91C;font-weight:bold;'>%s</span> %s", $oldMeetingWhen, $timeTitle, $data['meeting_when']) + : $data['meeting_when']; + } else { + $data['meeting_when_html'] = + ($oldMeetingWhen !== $data['meeting_when'] && $oldMeetingWhen !== null) + ? sprintf("<span style='text-decoration: line-through'>%s</span><br /><span style='color:#6CA91C;font-weight:bold;'>%s</span> %s", $oldMeetingWhen, $this->l10n->t('Time:'), $data['meeting_when']) : $data['meeting_when']; + : $data['meeting_when']; + } + } return $data; } @@ -446,6 +466,51 @@ // generate occurring next string if ($eventReaderCurrent->recurs()) { @@ -968,6 +992,51 @@ } /** Loading Loading @@ -171,11 +170,12 @@ 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:'), - $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) { Loading @@ -190,11 +190,23 @@ This patch helps in indentifying that For a recurring event, the invitee knows w + 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'] !== '') { Loading @@ -203,7 +215,6 @@ This patch helps in indentifying that For a recurring event, the invitee knows w + 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); Loading @@ -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) { Loading @@ -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, Loading @@ -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, Loading @@ -241,14 +252,13 @@ 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]); } } Loading @@ -258,11 +268,9 @@ This patch helps in indentifying that For a recurring event, the invitee knows w - 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)) { Loading @@ -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 patches/016-login-screen.patch +41 −42 Original line number Diff line number Diff line --- ./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 @@ <link rel="mask-icon" sizes="any" href="<?php print_unescaped(image_path('core', 'favicon-mask.svg')); ?>" color="<?php p($theme->getColorPrimary()); ?>"> <link rel="manifest" href="<?php print_unescaped(image_path('core', 'manifest.json')); ?>" crossorigin="use-credentials"> <?php emit_css_loading_tags($_); ?> Loading @@ -8,12 +8,10 @@ <?php emit_script_loading_tags($_); ?> <?php print_unescaped($_['headers']); ?> </head> @@ -32,12 +33,37 @@ <?php foreach ($_['initialStates'] as $app => $initialState) { ?> <input type="hidden" id="initial-state-<?php p($app); ?>" value="<?php p(base64_encode($initialState)); ?>"> <?php }?> - <div class="wrapper"> - <div class="v-align"> @@ -42,10 +43,38 @@ <?php include 'layout.initial-state.php'; ?> <div class="wrapper"> <div class="v-align"> + <div class="wrapper <?= (array_key_exists("alt_login",$_)) ? 'alt_login':'not_alt_login' ?>" > + <?php if (array_key_exists("alt_login",$_)) { ?> + <div class="banner-right-align"> Loading Loading @@ -45,10 +43,11 @@ + <div class="sign-in-label sign-label"><?php p($l->t('Sign in to your account')); ?></div> + <div class="sign-in-label fp-label" style="display: none"><?php p($l->t('Forgot Password')); ?></div> + <?php } ?> + </div> </header> <?php endif; ?> @@ -46,18 +72,24 @@ @@ -54,18 +83,24 @@ <?php p($theme->getName()); ?> </h1> <?php print_unescaped($_['content']); ?> Loading Loading @@ -83,4 +82,4 @@ - </footer> </body> </html> \ No newline at end of file patches/018-occ-user-setting.patch +4 −4 Original line number Diff line number Diff line Loading @@ -6,7 +6,7 @@ This patch triggers a user changed event when quota is updated via the occ comma --- ./core/Command/User/Setting.php 2022-07-05 14:53:54.093230637 +0530 +++ ./core/Command/User/Setting-new.php 2022-07-05 21:24:11.654134876 +0530 @@ -34,6 +34,8 @@ @@ -16,6 +16,8 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; Loading @@ -15,7 +15,7 @@ This patch triggers a user changed event when quota is updated via the occ comma class Setting extends Base { public function __construct( @@ -192,6 +194,11 @@ @@ -174,6 +176,11 @@ } $this->config->setUserValue($uid, $app, $key, $input->getArgument('value')); Loading patches/036-user-config-change-event.patch +14 −15 Original line number Diff line number Diff line --- ./lib/private/AllConfig.php 2024-03-28 01:02:39 +++ ./lib/private/AllConfig-new.php 2024-04-15 16:36:23 @@ -38,6 +38,8 @@ @@ -12,6 +12,8 @@ use OCP\IConfig; use OCP\IDBConnection; use OCP\PreConditionNotMetException; Loading @@ -9,34 +9,33 @@ /** * Class to combine all the configuration options ownCloud offers @@ -283,6 +285,7 @@ @@ -257,6 +259,8 @@ $qb->executeStatement(); $this->userCache[$userId][$appName][$key] = (string) $value; + $this->triggerUserValueChange($userId, $appName, $key, $value, $prevValue); + return; } } @@ -309,8 +312,15 @@ @@ -282,6 +286,14 @@ $this->userCache[$userId][$appName] = []; } $this->userCache[$userId][$appName][$key] = (string) $value; } + } + $this->triggerUserValueChange($userId, $appName, $key, $value, $prevValue); } + } + + private function triggerUserValueChange($userId, $appId, $key, $value, $oldValue = null) { + if (\OC::$server instanceof \OCP\IServerContainer) { + $dispatcher = \OC::$server->get(IEventDispatcher::class); + $dispatcher->dispatchTyped(new UserConfigChangedEvent($userId, $appId, $key, $value, $oldValue)); + } + } /** * Getting a user defined value * } } --- ./lib/composer/composer/autoload_static.php 2024-03-28 01:02:39 +++ ./lib/composer/composer/autoload_static-new.php 2024-04-15 16:34:18 @@ -822,6 +822,7 @@ @@ -903,6 +903,7 @@ 'OCP\\User\\Events\\PasswordUpdatedEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/PasswordUpdatedEvent.php', 'OCP\\User\\Events\\PostLoginEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/PostLoginEvent.php', 'OCP\\User\\Events\\UserChangedEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/UserChangedEvent.php', Loading @@ -47,7 +46,7 @@ --- ./lib/composer/composer/autoload_classmap.php 2024-03-28 01:02:39 +++ ./lib/composer/composer/autoload_classmap-new.php 2024-04-15 16:33:19 @@ -796,6 +796,7 @@ @@ -877,6 +877,7 @@ 'OCP\\User\\Events\\UserLoggedInEvent' => $baseDir . '/lib/public/User/Events/UserLoggedInEvent.php', 'OCP\\User\\Events\\UserLoggedInWithCookieEvent' => $baseDir . '/lib/public/User/Events/UserLoggedInWithCookieEvent.php', 'OCP\\User\\Events\\UserLoggedOutEvent' => $baseDir . '/lib/public/User/Events/UserLoggedOutEvent.php', Loading Loading
Dockerfile +4 −4 Original line number Diff line number Diff line Loading @@ -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} Loading Loading @@ -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 Loading
patches/015-email-mail-template.patch +74 −65 Original line number Diff line number Diff line Loading @@ -7,11 +7,10 @@ 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(); Loading @@ -35,10 +34,11 @@ 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 @@ @@ -217,12 +241,35 @@ $data['invitee_name'] = ($senderName ?: $sender); $fromEMail = Util::getDefaultEmailAddress('invitations-noreply'); Loading @@ -49,10 +49,9 @@ This patch helps in indentifying that For a recurring event, the invitee knows w + $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(); Loading @@ -76,7 +75,7 @@ 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 @@ -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); Loading @@ -86,11 +85,11 @@ This patch helps in indentifying that For a recurring event, the invitee knows w --- ./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('<a href="%1$s">%1$s</a>', $oldUrl) : $data['meeting_url']; - $data['meeting_when_html'] = - $data['meeting_when_html'] = $oldMeetingWhen !== $data['meeting_when'] ? sprintf("<span style='text-decoration: line-through'>%s</span><br />%s", $oldMeetingWhen, $data['meeting_when']) : $data['meeting_when']; + if (isset($vEvent->RRULE)) { + $RRule = (string) $vEvent->RRULE->getValue(); + if (strpos($RRule, 'FREQ=DAILY') !== false) { Loading @@ -106,20 +105,20 @@ This patch helps in indentifying that For a recurring event, the invitee knows w + $timeTitle = $this->l10n->t('Repeats yearly:'); + } + $data['meeting_when_html'] = ($oldMeetingWhen !== $data['meeting_when'] && $oldMeetingWhen !== null) - ? sprintf("<span style='text-decoration: line-through'>%s</span><br />%s", $oldMeetingWhen, $data['meeting_when']) + ($oldMeetingWhen !== $data['meeting_when'] && $oldMeetingWhen !== null) + ? sprintf("<span style='text-decoration: line-through'>%s</span><br /><span style='color:#6CA91C;font-weight:bold;'>%s</span> %s", $oldMeetingWhen, $timeTitle, $data['meeting_when']) + : $data['meeting_when']; + } else { + $data['meeting_when_html'] = + ($oldMeetingWhen !== $data['meeting_when'] && $oldMeetingWhen !== null) + ? sprintf("<span style='text-decoration: line-through'>%s</span><br /><span style='color:#6CA91C;font-weight:bold;'>%s</span> %s", $oldMeetingWhen, $this->l10n->t('Time:'), $data['meeting_when']) : $data['meeting_when']; + : $data['meeting_when']; + } + } return $data; } @@ -446,6 +466,51 @@ // generate occurring next string if ($eventReaderCurrent->recurs()) { @@ -968,6 +992,51 @@ } /** Loading Loading @@ -171,11 +170,12 @@ 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:'), - $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) { Loading @@ -190,11 +190,23 @@ This patch helps in indentifying that For a recurring event, the invitee knows w + 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'] !== '') { Loading @@ -203,7 +215,6 @@ This patch helps in indentifying that For a recurring event, the invitee knows w + 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); Loading @@ -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) { Loading @@ -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, Loading @@ -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, Loading @@ -241,14 +252,13 @@ 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]); } } Loading @@ -258,11 +268,9 @@ This patch helps in indentifying that For a recurring event, the invitee knows w - 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)) { Loading @@ -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
patches/016-login-screen.patch +41 −42 Original line number Diff line number Diff line --- ./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 @@ <link rel="mask-icon" sizes="any" href="<?php print_unescaped(image_path('core', 'favicon-mask.svg')); ?>" color="<?php p($theme->getColorPrimary()); ?>"> <link rel="manifest" href="<?php print_unescaped(image_path('core', 'manifest.json')); ?>" crossorigin="use-credentials"> <?php emit_css_loading_tags($_); ?> Loading @@ -8,12 +8,10 @@ <?php emit_script_loading_tags($_); ?> <?php print_unescaped($_['headers']); ?> </head> @@ -32,12 +33,37 @@ <?php foreach ($_['initialStates'] as $app => $initialState) { ?> <input type="hidden" id="initial-state-<?php p($app); ?>" value="<?php p(base64_encode($initialState)); ?>"> <?php }?> - <div class="wrapper"> - <div class="v-align"> @@ -42,10 +43,38 @@ <?php include 'layout.initial-state.php'; ?> <div class="wrapper"> <div class="v-align"> + <div class="wrapper <?= (array_key_exists("alt_login",$_)) ? 'alt_login':'not_alt_login' ?>" > + <?php if (array_key_exists("alt_login",$_)) { ?> + <div class="banner-right-align"> Loading Loading @@ -45,10 +43,11 @@ + <div class="sign-in-label sign-label"><?php p($l->t('Sign in to your account')); ?></div> + <div class="sign-in-label fp-label" style="display: none"><?php p($l->t('Forgot Password')); ?></div> + <?php } ?> + </div> </header> <?php endif; ?> @@ -46,18 +72,24 @@ @@ -54,18 +83,24 @@ <?php p($theme->getName()); ?> </h1> <?php print_unescaped($_['content']); ?> Loading Loading @@ -83,4 +82,4 @@ - </footer> </body> </html> \ No newline at end of file
patches/018-occ-user-setting.patch +4 −4 Original line number Diff line number Diff line Loading @@ -6,7 +6,7 @@ This patch triggers a user changed event when quota is updated via the occ comma --- ./core/Command/User/Setting.php 2022-07-05 14:53:54.093230637 +0530 +++ ./core/Command/User/Setting-new.php 2022-07-05 21:24:11.654134876 +0530 @@ -34,6 +34,8 @@ @@ -16,6 +16,8 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; Loading @@ -15,7 +15,7 @@ This patch triggers a user changed event when quota is updated via the occ comma class Setting extends Base { public function __construct( @@ -192,6 +194,11 @@ @@ -174,6 +176,11 @@ } $this->config->setUserValue($uid, $app, $key, $input->getArgument('value')); Loading
patches/036-user-config-change-event.patch +14 −15 Original line number Diff line number Diff line --- ./lib/private/AllConfig.php 2024-03-28 01:02:39 +++ ./lib/private/AllConfig-new.php 2024-04-15 16:36:23 @@ -38,6 +38,8 @@ @@ -12,6 +12,8 @@ use OCP\IConfig; use OCP\IDBConnection; use OCP\PreConditionNotMetException; Loading @@ -9,34 +9,33 @@ /** * Class to combine all the configuration options ownCloud offers @@ -283,6 +285,7 @@ @@ -257,6 +259,8 @@ $qb->executeStatement(); $this->userCache[$userId][$appName][$key] = (string) $value; + $this->triggerUserValueChange($userId, $appName, $key, $value, $prevValue); + return; } } @@ -309,8 +312,15 @@ @@ -282,6 +286,14 @@ $this->userCache[$userId][$appName] = []; } $this->userCache[$userId][$appName][$key] = (string) $value; } + } + $this->triggerUserValueChange($userId, $appName, $key, $value, $prevValue); } + } + + private function triggerUserValueChange($userId, $appId, $key, $value, $oldValue = null) { + if (\OC::$server instanceof \OCP\IServerContainer) { + $dispatcher = \OC::$server->get(IEventDispatcher::class); + $dispatcher->dispatchTyped(new UserConfigChangedEvent($userId, $appId, $key, $value, $oldValue)); + } + } /** * Getting a user defined value * } } --- ./lib/composer/composer/autoload_static.php 2024-03-28 01:02:39 +++ ./lib/composer/composer/autoload_static-new.php 2024-04-15 16:34:18 @@ -822,6 +822,7 @@ @@ -903,6 +903,7 @@ 'OCP\\User\\Events\\PasswordUpdatedEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/PasswordUpdatedEvent.php', 'OCP\\User\\Events\\PostLoginEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/PostLoginEvent.php', 'OCP\\User\\Events\\UserChangedEvent' => __DIR__ . '/../../..' . '/lib/public/User/Events/UserChangedEvent.php', Loading @@ -47,7 +46,7 @@ --- ./lib/composer/composer/autoload_classmap.php 2024-03-28 01:02:39 +++ ./lib/composer/composer/autoload_classmap-new.php 2024-04-15 16:33:19 @@ -796,6 +796,7 @@ @@ -877,6 +877,7 @@ 'OCP\\User\\Events\\UserLoggedInEvent' => $baseDir . '/lib/public/User/Events/UserLoggedInEvent.php', 'OCP\\User\\Events\\UserLoggedInWithCookieEvent' => $baseDir . '/lib/public/User/Events/UserLoggedInWithCookieEvent.php', 'OCP\\User\\Events\\UserLoggedOutEvent' => $baseDir . '/lib/public/User/Events/UserLoggedOutEvent.php', Loading