[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1107945: unblock: tokodon/25.04.2-1



Package: release.debian.org
Severity: normal
X-Debbugs-Cc: tokodon@packages.debian.org, Debian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
Control: affects -1 + src:tokodon
User: release.debian.org@packages.debian.org
Usertags: unblock

Dear Release Team,

please unblock package tokodon.

[ Reason ]
It contains the following changes:
* New upstream release (25.04.1).
  - Clamp contentY when using the PageUp key. (kde#501936)
  - Stop registering for push notifications despite them being disabled.
  - Print out what the old endpoint was in the warning message.
  - Don't spam network error log with push subscription checks.
  - Don't bother updating push subscriptions if there is none.
  - Remove annual_report from push notification rules.
  - Call updatePushNotifications when toggling the notifications checkbox.
* New upstream release (25.04.2).
  - ModerationTools: Fix opening some subpages.

The complete debdiff contains a huge amount of translation fixes so I’m
attaching a simple diff trimmed from these for your convenience:
    diff -ur --exclude=po tokodon-25.04.[02]

[ Tests ]
- Tested connecting to mastodon with an existing account and browsing
  through the various pages of the app.
- Upstream test suite passes in sbuild.

[ Risks ]
Upstream point releases only contain targetted commits. Further fixes
can easily be backported or the changes reverted.

[ Checklist ]
  [x] all changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in testing


Thanks!


unblock tokodon/25.04.2-1

Attachment: tokodon_25.04.0-1.dsc_tokodon_25.04.2-1.dsc.debdiff.gz
Description: application/gzip

diff -ur '--exclude=po' tokodon-25.04.0/CMakeLists.txt tokodon-25.04.2/CMakeLists.txt
--- tokodon-25.04.0/CMakeLists.txt	2025-04-10 05:11:52.000000000 +0200
+++ tokodon-25.04.2/CMakeLists.txt	2025-06-03 05:21:40.000000000 +0200
@@ -6,7 +6,7 @@
 # KDE Applications version, managed by release script.
 set(RELEASE_SERVICE_VERSION_MAJOR "25")
 set(RELEASE_SERVICE_VERSION_MINOR "04")
-set(RELEASE_SERVICE_VERSION_MICRO "0")
+set(RELEASE_SERVICE_VERSION_MICRO "2")
 set(RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}")
 
 project(tokodon VERSION ${RELEASE_SERVICE_VERSION})
diff -ur '--exclude=po' tokodon-25.04.0/debian/changelog tokodon-25.04.2/debian/changelog
--- tokodon-25.04.0/debian/changelog	2025-04-17 22:24:22.000000000 +0200
+++ tokodon-25.04.2/debian/changelog	2025-06-09 23:37:39.000000000 +0200
@@ -1,3 +1,19 @@
+tokodon (25.04.2-1) unstable; urgency=medium
+
+  [ Aurélien COUDERC ]
+  * New upstream release (25.04.1).
+    - Clamp contentY when using the PageUp key. (kde#501936)
+    - Stop registering for push notifications despite them being disabled.
+    - Print out what the old endpoint was in the warning message.
+    - Don't spam network error log with push subscription checks.
+    - Don't bother updating push subscriptions if there is none.
+    - Remove annual_report from push notification rules.
+    - Call updatePushNotifications when toggling the notifications checkbox.
+  * New upstream release (25.04.2).
+    - ModerationTools: Fix opening some subpages.
+
+ -- Aurélien COUDERC <coucouf@debian.org>  Mon, 09 Jun 2025 23:37:39 +0200
+
 tokodon (25.04.0-1) unstable; urgency=medium
 
   [ Aurélien COUDERC ]
diff -ur '--exclude=po' tokodon-25.04.0/.gitlab-ci.yml tokodon-25.04.2/.gitlab-ci.yml
--- tokodon-25.04.0/.gitlab-ci.yml	2025-04-10 05:11:52.000000000 +0200
+++ tokodon-25.04.2/.gitlab-ci.yml	2025-06-03 05:21:40.000000000 +0200
@@ -6,7 +6,6 @@
     file:
       - /gitlab-templates/reuse-lint.yml
       - /gitlab-templates/linux-qt6.yml
-      - /gitlab-templates/linux-qt6-next.yml
       - /gitlab-templates/freebsd-qt6.yml
       - /gitlab-templates/android-qt6.yml
       - /gitlab-templates/craft-android-qt6-apks.yml
diff -ur '--exclude=po' tokodon-25.04.0/org.kde.tokodon.appdata.xml tokodon-25.04.2/org.kde.tokodon.appdata.xml
--- tokodon-25.04.0/org.kde.tokodon.appdata.xml	2025-04-10 05:11:52.000000000 +0200
+++ tokodon-25.04.2/org.kde.tokodon.appdata.xml	2025-06-03 05:21:40.000000000 +0200
@@ -151,6 +151,8 @@
     </screenshot>
   </screenshots>
   <releases>
+    <release version="25.04.2" date="2025-06-05"/>
+    <release version="25.04.1" date="2025-05-08"/>
     <release version="25.04.0" date="2025-04-17"/>
     <release version="24.12.3" date="2025-03-06"/>
     <release version="24.12.2" date="2025-02-06"/>
diff -ur '--exclude=po' tokodon-25.04.0/org.kde.tokodon.desktop tokodon-25.04.2/org.kde.tokodon.desktop
--- tokodon-25.04.0/org.kde.tokodon.desktop	2025-04-10 05:11:52.000000000 +0200
+++ tokodon-25.04.2/org.kde.tokodon.desktop	2025-06-03 05:21:40.000000000 +0200
@@ -61,6 +61,7 @@
 GenericName[ko]=연합우주 탐색하기
 GenericName[lv]=Pārlūkojiet fediversu
 GenericName[nl]=In de Fediverse bladeren
+GenericName[nn]=Bla gjennom Allheimen
 GenericName[pl]=Przejrzyj Fediverse
 GenericName[ru]=Просмотр Fediverse
 GenericName[sa]=Fediverse ब्राउज् कुर्वन्तु
diff -ur '--exclude=po' tokodon-25.04.0/snapcraft.yaml tokodon-25.04.2/snapcraft.yaml
--- tokodon-25.04.0/snapcraft.yaml	2025-04-10 05:11:52.000000000 +0200
+++ tokodon-25.04.2/snapcraft.yaml	2025-06-03 05:21:40.000000000 +0200
@@ -18,26 +18,39 @@
       - audio-record
       - home
       - password-manager-service
-environment:
-  ALSA_CONFIG_PATH: "$SNAP/kf6/etc/asound.conf"
+    environment:
+      LD_LIBRARY_PATH: "$SNAP/ffmpeg-platform/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR:$SNAP/kf6/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR:$LD_LIBRARY_PATH"
+      PATH: $SNAP/ffmpeg-platform/usr/bin:$SNAP/usr/bin${PATH}
+      ALSA_CONFIG_PATH: "$SNAP/kf6/etc/asound.conf"
+      QT_MEDIA_BACKEND: "ffmpeg"
+      QT_PLUGIN_PATH: "$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/marble/plugins:/snap/kf6-core24/current/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/plugins"
 layout:
   /usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/alsa-lib:
     bind: $SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/alsa-lib
+plugs:
+  ffmpeg-2404:
+    interface: content
+    target: ffmpeg-platform # the folder where this content snap will be mounted
+    default-provider: ffmpeg-2404
 slots:
   session-dbus-interface:
     interface: dbus
     name: org.kde.tokodon
     bus: session
-package-repositories:
-  - type: apt
-    components:
-      - main
-    suites:
-      - noble
-    key-id: 444DABCF3667D0283F894EDDE6D4736255751E5D
-    url: http://origin.archive.neon.kde.org/user
-    key-server: keyserver.ubuntu.com
 parts:
+  kunifiedpush:
+    source: https://invent.kde.org/libraries/kunifiedpush.git
+    plugin: cmake
+    build-packages:
+      - libssl-dev
+    build-environment:
+      - PATH: /snap/bin:${PATH}
+      - PYTHONPATH: ${CRAFT_STAGE}/lib/python3.12/site-packages:${CRAFT_STAGE}/usr/lib/python3/dist-packages
+      - LD_LIBRARY_PATH: "/snap/mesa-2404/current/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR:$CRAFT_STAGE/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR:/snap/kde-qt6-core24-sdk/current/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libproxy:$LD_LIBRARY_PATH"
+    cmake-parameters:
+      - -DCMAKE_INSTALL_PREFIX=/usr
+      - -DCMAKE_BUILD_TYPE=Release
+      - -DBUILD_TESTING=OFF
   mpvqt:
     plugin: cmake
     source: https://invent.kde.org/libraries/mpvqt.git
@@ -64,6 +77,7 @@
   tokodon:
     after:
       - mpvqt
+      - kunifiedpush
     parse-info:
       - usr/share/metainfo/org.kde.tokodon.appdata.xml
     plugin: cmake
@@ -71,6 +85,9 @@
     source-type: local
     build-packages:
       - libmpv-dev
+      - libfreetype-dev
+    build-snaps:
+      - ffmpeg-2404-sdk
     stage-packages:
       - libasound2
       - libasound2-data
@@ -83,6 +100,8 @@
       - gstreamer1.0-plugins-ugly
       - libblas3
       - libsecret-1-0
+      - libfreetype6
+      - libssl3t64
     cmake-parameters:
       - -DCMAKE_INSTALL_PREFIX=/usr
       - -DCMAKE_BUILD_TYPE=Release
@@ -102,12 +121,9 @@
       - -DCMAKE_LIBRARY_PATH=lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR
       - "-DCMAKE_FIND_ROOT_PATH=$CRAFT_STAGE\\;/snap/kde-qt6-core24-sdk/current\\;/snap/kf6-core24-sdk/current/usr"
       - "-DCMAKE_PREFIX_PATH=$CRAFT_STAGE\\;/snap/kde-qt6-core24-sdk/current\\;/snap/kf6-core24-sdk/current/usr"
-    build-environment: &buildenvironment
-      - PATH: /snap/kde-qt6-core24-sdk/current/usr/bin${PATH:+:$PATH}
-      - PKG_CONFIG_PATH: /snap/kde-qt6-core24-sdk/current/usr/lib/${CRAFT_ARCH_TRIPLET_BUILD_FOR}/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}
-      - XDG_DATA_DIRS: $CRAFT_STAGE/usr/share:/snap/kde-qt6-core24-sdk/current/usr/share:/usr/share${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}
-      - XDG_CONFIG_HOME: $CRAFT_STAGE/etc/xdg:/snap/kde-qt6-core24-sdk/current/etc/xdg:/etc/xdg${XDG_CONFIG_HOME:+:$XDG_CONFIG_HOME}
-      - LD_LIBRARY_PATH: "/snap/kde-qt6-core24-sdk/current/usr/lib/${CRAFT_ARCH_TRIPLET_BUILD_FOR}:/snap/kde-qt6-core24-sdk/current/usr/lib/${CRAFT_ARCH_TRIPLET_BUILD_FOR}/libproxy:/snap/kde-qt6-core24-sdk/current/usr/lib:/snap/kf6-core24-sdk/current/usr/lib/${CRAFT_ARCH_TRIPLET_BUILD_FOR}:/snap/kf6-core24-sdk/current/usr/lib:$CRAFT_STAGE/usr/lib:$CRAFT_STAGE/lib/:$CRAFT_STAGE/usr/lib/${CRAFT_ARCH_TRIPLET_BUILD_FOR}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
+    build-environment: &build-environment
+      - PKG_CONFIG_PATH: "$CRAFT_STAGE/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/pkgconfig:/snap/ffmpeg-2404-sdk/current/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/pkgconfig"
+      - LD_LIBRARY_PATH: "/snap/mesa-2404/current/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR:$CRAFT_STAGE/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR:/snap/ffmpeg-2404-sdk/current/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR:/snap/kde-qt6-core24-sdk/current/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libproxy:$LD_LIBRARY_PATH"
     prime:
       - -usr/lib/*/cmake/*
       - -usr/include/*
@@ -135,7 +151,7 @@
       - kf6-core24
     override-prime: |
       set -eux
-      for snap in "core24" "kf6-core24"; do
+      for snap in "core24" "kf6-core24" "ffmpeg-2404"; do
           cd "/snap/$snap/current" && find . -type f,l -exec rm -rf "${CRAFT_PRIME}/{}" \;
       done
 
diff -ur '--exclude=po' tokodon-25.04.0/src/account/abstractaccount.h tokodon-25.04.2/src/account/abstractaccount.h
--- tokodon-25.04.0/src/account/abstractaccount.h	2025-04-10 05:11:52.000000000 +0200
+++ tokodon-25.04.2/src/account/abstractaccount.h	2025-06-03 05:21:40.000000000 +0200
@@ -301,12 +301,14 @@
      * @param parent The parent object that calls get() or the callback belongs to.
      * @param callback The callback that should be executed if the request is successful.
      * @param errorCallback The callback that should be executed if the request is not successful.
+     * @param fallible Whether the request is okay with failing. If true, also reported in the error log.
      */
     virtual void get(const QUrl &url,
                      bool authenticated,
                      QObject *parent,
                      std::function<void(QNetworkReply *)> callback,
-                     std::function<void(QNetworkReply *)> errorCallback = nullptr) = 0;
+                     std::function<void(QNetworkReply *)> errorCallback = nullptr,
+                     bool fallible = false) = 0;
 
     /**
      * @brief Make an HTTP POST request to the server.
diff -ur '--exclude=po' tokodon-25.04.0/src/account/account.cpp tokodon-25.04.2/src/account/account.cpp
--- tokodon-25.04.0/src/account/account.cpp	2025-04-10 05:11:52.000000000 +0200
+++ tokodon-25.04.2/src/account/account.cpp	2025-06-03 05:21:40.000000000 +0200
@@ -49,9 +49,11 @@
                   bool authenticated,
                   QObject *parent,
                   std::function<void(QNetworkReply *)> reply_cb,
-                  std::function<void(QNetworkReply *)> errorCallback)
+                  std::function<void(QNetworkReply *)> errorCallback,
+                  bool fallible)
 {
     QNetworkRequest request = makeRequest(url, authenticated);
+    request.setAttribute(QNetworkRequest::Attribute::User, fallible);
     qCDebug(TOKODON_HTTP) << "GET" << url;
 
     QNetworkReply *reply = m_qnam->get(request);
@@ -178,7 +180,9 @@
 {
     connect(reply, &QNetworkReply::finished, [reply, reply_cb, errorCallback]() {
         reply->deleteLater();
-        if (200 != reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) && !reply->url().toString().contains("nodeinfo"_L1)) {
+        // these are usually (sometimes meant to be) fallible and end up spamming user logs with these errors
+        const auto fallible = reply->request().attribute(QNetworkRequest::Attribute::User).toBool();
+        if (200 != reply->attribute(QNetworkRequest::HttpStatusCodeAttribute) && !fallible) {
             NetworkController::instance().logError(reply->url().toString(), reply->errorString());
             if (errorCallback) {
                 errorCallback(reply);
@@ -318,17 +322,26 @@
             Q_EMIT authenticated(true, {});
 
 #ifdef HAVE_KUNIFIEDPUSH
+            // Query whether or not we have a valid push subscription from the server.
             get(
                 apiUrl(QStringLiteral("/api/v1/push/subscription")),
                 true,
                 this,
                 [this](QNetworkReply *reply) {
+                    // If the error code is success, then we *do* have a subscription.
                     m_hasPushSubscription = true;
 
                     const QJsonDocument doc = QJsonDocument::fromJson(reply->readAll());
 
+                    // Sometimes - for some reason - we get a successful HTTP code but it's actually an error. Skip!
+                    if (doc.object().contains("error"_L1)) {
+                        m_hasPushSubscription = false;
+                        return;
+                    }
+
                     if (!NetworkController::instance().endpoint.isEmpty() && doc["endpoint"_L1] != NetworkController::instance().endpoint) {
-                        qWarning(TOKODON_LOG) << "KUnifiedPush endpoint has changed to" << NetworkController::instance().endpoint << ", resubscribing!";
+                        qWarning(TOKODON_LOG) << "KUnifiedPush endpoint is now" << NetworkController::instance().endpoint << "and the old one was"
+                                              << doc["endpoint"_L1] << "resubscribing!";
 
                         deleteResource(apiUrl(QStringLiteral("/api/v1/push/subscription")), true, this, [this](QNetworkReply *reply) {
                             Q_UNUSED(reply)
@@ -341,9 +354,11 @@
                 },
                 [this](QNetworkReply *reply) {
                     Q_UNUSED(reply);
+                    // Otherwise, no subscription.
                     m_hasPushSubscription = false;
-                    updatePushNotifications();
-                });
+                },
+                true // otherwise it tends to spam your error log
+            );
 #endif
         },
         [this](QNetworkReply *reply) {
@@ -536,7 +551,6 @@
     addQuery(QStringLiteral("update"), cfg->notifyUpdate());
     addQuery(QStringLiteral("admin.sign_up"), cfg->notifySignup());
     addQuery(QStringLiteral("admin.report"), cfg->notifyReport());
-    addQuery(QStringLiteral("annual_report"), cfg->notifyAnnualReport());
 
     return formdata;
 }
diff -ur '--exclude=po' tokodon-25.04.0/src/account/account.h tokodon-25.04.2/src/account/account.h
--- tokodon-25.04.0/src/account/account.h	2025-04-10 05:11:52.000000000 +0200
+++ tokodon-25.04.2/src/account/account.h	2025-06-03 05:21:40.000000000 +0200
@@ -25,7 +25,8 @@
              bool authenticated,
              QObject *parent,
              std::function<void(QNetworkReply *)> callback,
-             std::function<void(QNetworkReply *)> errorCallback = nullptr) override;
+             std::function<void(QNetworkReply *)> errorCallback = nullptr,
+             bool fallible = false) override;
     void post(const QUrl &url,
               const QJsonDocument &doc,
               bool authenticated,
diff -ur '--exclude=po' tokodon-25.04.0/src/autotests/mockaccount.cpp tokodon-25.04.2/src/autotests/mockaccount.cpp
--- tokodon-25.04.0/src/autotests/mockaccount.cpp	2025-04-10 05:11:52.000000000 +0200
+++ tokodon-25.04.2/src/autotests/mockaccount.cpp	2025-06-03 05:21:40.000000000 +0200
@@ -34,11 +34,13 @@
                       bool authenticated,
                       QObject *parent,
                       std::function<void(QNetworkReply *)> callback,
-                      std::function<void(QNetworkReply *)> errorCallback)
+                      std::function<void(QNetworkReply *)> errorCallback,
+                      bool fallible)
 {
     Q_UNUSED(authenticated)
     Q_UNUSED(parent)
     Q_UNUSED(errorCallback)
+    Q_UNUSED(fallible)
 
     if (m_getReplies.contains(url)) {
         auto reply = m_getReplies[url];
diff -ur '--exclude=po' tokodon-25.04.0/src/autotests/mockaccount.h tokodon-25.04.2/src/autotests/mockaccount.h
--- tokodon-25.04.0/src/autotests/mockaccount.h	2025-04-10 05:11:52.000000000 +0200
+++ tokodon-25.04.2/src/autotests/mockaccount.h	2025-06-03 05:21:40.000000000 +0200
@@ -16,7 +16,8 @@
              bool authenticated,
              QObject *parent,
              std::function<void(QNetworkReply *)> callback,
-             std::function<void(QNetworkReply *)> errorCallback = nullptr) override;
+             std::function<void(QNetworkReply *)> errorCallback = nullptr,
+             bool fallible = false) override;
 
     void post(const QUrl &url,
               const QJsonDocument &doc,
diff -ur '--exclude=po' tokodon-25.04.0/src/content/ui/Components/TimelineView.qml tokodon-25.04.2/src/content/ui/Components/TimelineView.qml
--- tokodon-25.04.0/src/content/ui/Components/TimelineView.qml	2025-04-10 05:11:52.000000000 +0200
+++ tokodon-25.04.2/src/content/ui/Components/TimelineView.qml	2025-06-03 05:21:40.000000000 +0200
@@ -30,6 +30,9 @@
         if (event.key === Qt.Key_PageUp && !root.atYBeginning) {
             event.accepted = true;
             root.contentY -= height;
+            if (root.contentY < 0) {
+                root.contentY = 0;
+            }
         } else if (event.key === Qt.Key_PageDown && !root.atYEnd) {
             event.accepted = true;
             root.contentY += height;
diff -ur '--exclude=po' tokodon-25.04.0/src/content/ui/ModerationTools/AccountToolPage.qml tokodon-25.04.2/src/content/ui/ModerationTools/AccountToolPage.qml
--- tokodon-25.04.0/src/content/ui/ModerationTools/AccountToolPage.qml	2025-04-10 05:11:52.000000000 +0200
+++ tokodon-25.04.2/src/content/ui/ModerationTools/AccountToolPage.qml	2025-06-03 05:21:40.000000000 +0200
@@ -233,7 +233,7 @@
             implicitWidth: ListView.view.width
             Layout.fillWidth: true
 
-            onClicked: applicationWindow().pageStack.layers.push(Qt.createComponent("org.kde.tokodon", "MainAccountToolPage"), {
+            onClicked: root.QQC2.ApplicationWindow.window.pageStack.layers.push(Qt.createComponent("org.kde.tokodon", "MainAccountToolPage"), {
                 identity: delegate.identity,
                 index: delegate.index,
                 model: accountView.model
diff -ur '--exclude=po' tokodon-25.04.0/src/content/ui/ModerationTools/FederationToolPage.qml tokodon-25.04.2/src/content/ui/ModerationTools/FederationToolPage.qml
--- tokodon-25.04.0/src/content/ui/ModerationTools/FederationToolPage.qml	2025-04-10 05:11:52.000000000 +0200
+++ tokodon-25.04.2/src/content/ui/ModerationTools/FederationToolPage.qml	2025-06-03 05:21:40.000000000 +0200
@@ -258,7 +258,7 @@
             width: ListView.view.width
 
             onClicked: if (root.isDomainBlock) {
-               applicationWindow().pageStack.layers.push(Qt.createComponent("org.kde.tokodon", "MainFederationToolPage"), {
+               root.QQC2.ApplicationWindow.window.pageStack.layers.push(Qt.createComponent("org.kde.tokodon", "MainFederationToolPage"), {
                     index: delegate.index,
                     model: federationView.model,
                     id: delegate.id,
diff -ur '--exclude=po' tokodon-25.04.0/src/content/ui/ModerationTools/IpRulePage.qml tokodon-25.04.2/src/content/ui/ModerationTools/IpRulePage.qml
--- tokodon-25.04.0/src/content/ui/ModerationTools/IpRulePage.qml	2025-04-10 05:11:52.000000000 +0200
+++ tokodon-25.04.2/src/content/ui/ModerationTools/IpRulePage.qml	2025-06-03 05:21:40.000000000 +0200
@@ -163,7 +163,7 @@
 
             width: ListView.view.width
 
-            onClicked: applicationWindow().pageStack.layers.push(Qt.createComponent("org.kde.tokodon", "MainIpRulePage"),
+            onClicked: root.QQC2.ApplicationWindow.window.pageStack.layers.push(Qt.createComponent("org.kde.tokodon", "MainIpRulePage"),
                     {
                         index: delegate.index,
                         model: ipRuleView.model,
diff -ur '--exclude=po' tokodon-25.04.0/src/content/ui/Settings/NotificationsPage.qml tokodon-25.04.2/src/content/ui/Settings/NotificationsPage.qml
--- tokodon-25.04.0/src/content/ui/Settings/NotificationsPage.qml	2025-04-10 05:11:52.000000000 +0200
+++ tokodon-25.04.2/src/content/ui/Settings/NotificationsPage.qml	2025-06-03 05:21:40.000000000 +0200
@@ -41,6 +41,7 @@
             onToggled: {
                 root.config.enableNotifications = checked;
                 root.saveConfig();
+                root.account.updatePushNotifications();
             }
         }
     }
diff -ur '--exclude=po' tokodon-25.04.0/src/tokodon.notifyrc tokodon-25.04.2/src/tokodon.notifyrc
--- tokodon-25.04.0/src/tokodon.notifyrc	2025-04-10 05:11:52.000000000 +0200
+++ tokodon-25.04.2/src/tokodon.notifyrc	2025-06-03 05:21:40.000000000 +0200
@@ -649,11 +649,13 @@
 Name[fr]=Rapport annuel
 Name[gl]=Informe anual
 Name[he]=דוח שנתי
+Name[hu]=Éves jelentés
 Name[it]=Resoconto annuale
 Name[ka]=წლიური ანგარიში
 Name[ko]=연간 보고
 Name[lv]=Ikgadējais ziņojums
 Name[nl]=Jaarlijks rapport
+Name[nn]=Årsrapport
 Name[pl]=Roczne sprawozdanie
 Name[ru]=Годовой отчёт
 Name[sa]=वार्षिक प्रतिवेदन
@@ -675,20 +677,23 @@
 Comment[fr]=Dévoilez les moments forts et mémorables de l'année dans le Fediverse !
 Comment[gl]=Revele o salientábel e memorábel do seu último ano no Fediverso!
 Comment[he]=חשיפת הרגעים הבלתי נשכחים מהשנה שחלפה בפדיברס!
+Comment[hu]=Mutassa be az év fénypontjait és emlékezetes pillanatait a Fediverse-en!
 Comment[it]=Scopri i momenti più belli e memorabili del tuo anno sul Fediverso!
 Comment[ka]=გამოაქვეყნეთ თქვენი წლის მაჩვენებლები და დასამახსოვრებელი მომენტები Fediverse-ზე!
 Comment[ko]=연합우주에서의 올해의 하이라이트와 기억에 남는 순간을 발견하세요!
 Comment[lv]=Apskati savus gada Fediversa spilgtākos un atmiņā paliekošākos brīžus!
 Comment[nl]=Onthul de hoogtepunten en memorabele momenten van uw jaar op Fediverse!
+Comment[nn]=Vis årets høgdepunkt og minneverdige augneblink på Allheimen!
 Comment[pl]=Udostępnij swoje wyróżnione wydarzenia i pamiętne chwile na Fediverse!
 Comment[ru]=Ваши самые яркие события и незабываемые моменты в Fediverse за год
 Comment[sa]=Fediverse इत्यत्र स्वस्य वर्षस्य मुख्यविषयाणां स्मरणीयक्षणानाञ्च अनावरणं कुर्वन्तु!
 Comment[sl]=Razkrijte vrhunce svojega leta in nepozabne trenutke na Fediverse!
-Comment[sq]=Zbuloni gjërat në pah dhe çastet e paharrueshme të vitit në Fedivers!
+Comment[sq]=Zbuloni kulmet tuaja për vitin dhe çaste të paharrueshme në Fedivers!
 Comment[sv]=Avslöja årets höjdpunkter och minnesvärda ögonblick på Fediverse.
 Comment[tr]=Mastodon’da geçtiğimiz yılın önemli noktalarını ve unutulmaz anlarını ortaya çıkarın!
 Comment[uk]=Ознайомтеся із акцентами року та незабутніми моментами у Fediverse!
 Comment[x-test]=xxUnveil your year's highlights and memorable moments on the Fediverse!xx
+Comment[zh_TW]=發現您今年在聯邦宇宙上的精選與回憶時光吧!
 Action=Popup
 
 [Event/other]
@@ -704,16 +709,18 @@
 Name[fr]=Autre
 Name[gl]=Outras
 Name[he]=אחר
+Name[hu]=Egyéb
 Name[it]=Altro
 Name[ka]=სხვა
 Name[ko]=기타
 Name[lv]=Citi
 Name[nl]=Overige
+Name[nn]=Andre
 Name[pl]=Inne
 Name[ru]=Прочее
 Name[sa]=अन्ये
 Name[sl]=Druge
-Name[sq]=Të tjera
+Name[sq]=Tjetër
 Name[sv]=Övriga
 Name[tr]=Diğer
 Name[uk]=Інше
@@ -730,11 +737,13 @@
 Comment[fr]=Notifications ne correspondant à aucune autre catégorie
 Comment[gl]=Notificacións que non casan noutras categorías.
 Comment[he]=התראות שלא מתאימות לקטגוריות אחרות
+Comment[hu]=Más kategóriákba nem illő értesítések
 Comment[it]=Notifiche che non rientrano in altre categorie
 Comment[ka]=შეტყობინებები, რომლებიც არ ჯდება სხვა კატეგორიებში
 Comment[ko]=다른 모든 분류에 포함되지 않는 알림
 Comment[lv]=Paziņojumi, kas neietilpst citā kategorijās.
 Comment[nl]=Meldingen die niet passen in andere categorieën
+Comment[nn]=Varslingar som ikkje passar i andre kategoriar
 Comment[pl]=Powiadomienia, które nie pasują do żadnej z pozostałych kategorii
 Comment[ru]=Уведомления, которые не попадают в другие категории
 Comment[sa]=अन्येषु वर्गेषु न उपयुज्यन्ते ये सूचनाः

Reply to: