Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug]: Upgrade to nextcloud 28.0.10 fails with Database error when running migration for app oauth2 [OpenProject integration] #48267

Closed
5 of 8 tasks
cybertschunk opened this issue Sep 22, 2024 · 10 comments

Comments

@cybertschunk
Copy link

cybertschunk commented Sep 22, 2024

⚠️ This issue respects the following points: ⚠️

Bug description

When we try to upgrade our nextcloud version from 28.0.9 to 28.0.10 the upgrade fails with the following error:

Setting log level to debug
Updating database schema
Updated database
Updating <oauth2> ...
Exception: Database error when running migration 011901Date20240829164356 for app oauth2
Authenticated ciphertext could not be decoded.
Update failed
Maintenance mode is kept active
Resetting log level

Steps to reproduce

  1. Update to 28.0.10
  2. run ./occ upgrade

Expected behavior

The nextcloud installation updates to 28.0.10

Nextcloud Server version

28

Operating system

Other

PHP engine version

Other

Web server

Nginx

Database engine version

PostgreSQL

Is this bug present after an update or on a fresh install?

Updated from a MINOR version (ex. 28.0.1 to 28.0.2)

Are you using the Nextcloud Server Encryption module?

None

What user-backends are you using?

  • Default user-backend (database)
  • LDAP/ Active Directory
  • SSO - SAML
  • Other

Configuration report

{
    "system": {
        "instanceid": "***REMOVED SENSITIVE VALUE***",
        "passwordsalt": "***REMOVED SENSITIVE VALUE***",
        "datadirectory": "***REMOVED SENSITIVE VALUE***",
        "dbtype": "pgsql",
        "version": "28.0.9.1",
        "dbname": "***REMOVED SENSITIVE VALUE***",
        "dbhost": "***REMOVED SENSITIVE VALUE***",
        "dbtableprefix": "oc_",
        "dbuser": "***REMOVED SENSITIVE VALUE***",
        "dbpassword": "***REMOVED SENSITIVE VALUE***",
        "installed": true,
        "ldapIgnoreNamingRules": false,
        "loglevel": 0,
        "theme": "",
        "defaultapp": "files",
        "maintenance": true,
        "lost_password_link": "https:\/\/account.gremien-uzl.de\/",
        "trusted_domains": [
            "files.asta.uni-luebeck.de",
            "141.83.153.154",
            "app-server",
            "nginx-serer",
            "onlyoffice-document-server"
        ],
        "allow_local_remote_servers": true,
        "share_folder": "\/Shared",
        "mail_smtpmode": "smtp",
        "secret": "***REMOVED SENSITIVE VALUE***",
        "mail_from_address": "***REMOVED SENSITIVE VALUE***",
        "mail_domain": "***REMOVED SENSITIVE VALUE***",
        "forcessl": true,
        "trashbin_retention_obligation": "30,60",
        "versions_retention_obligation": "auto, 730",
        "logtimezone": "Europe\/Berlin",
        "enable_previews": true,
        "updatechecker": false,
        "singleuser": false,
        "ldapProviderFactory": "\\OCA\\User_LDAP\\LDAPProviderFactory",
        "overwritehost": "files.asta.uni-luebeck.de",
        "overwriteprotocol": "https",
        "mail_smtphost": "***REMOVED SENSITIVE VALUE***",
        "mail_smtpsecure": "tls",
        "mail_smtpport": "587",
        "mail_smtpauthtype": "LOGIN",
        "mail_smtpauth": 1,
        "mail_smtpname": "***REMOVED SENSITIVE VALUE***",
        "mail_smtppassword": "***REMOVED SENSITIVE VALUE***",
        "debug": false,
        "onlyoffice": {
            "verify_peer_off": true
        },
        "csrf.optout": [
            "\/^WebDAVFS\/",
            "\/^Microsoft-WebDAV-MiniRedir\/",
            "\/KeeWeb\\\/\\d+[.]\\d+[.]\\d+\/"
        ],
        "htaccess.RewriteBase": "\/",
        "memcache.local": "\\OC\\Memcache\\APCu",
        "apps_paths": [
            {
                "path": "\/var\/www\/html\/apps",
                "url": "\/apps",
                "writable": false
            },
            {
                "path": "\/var\/www\/html\/custom_apps",
                "url": "\/custom_apps",
                "writable": true
            }
        ],
        "memcache.distributed": "\\OC\\Memcache\\Redis",
        "memcache.locking": "\\OC\\Memcache\\Redis",
        "redis": {
            "host": "***REMOVED SENSITIVE VALUE***",
            "port": 6379
        },
        "overwrite.cli.url": "https:\/\/files.asta.uni-luebeck.de",
        "mail_sendmailmode": "smtp",
        "updater.server.url": "***REMOVED SENSITIVE VALUE***",
        "updater.release.channel": "enterprise",
        "default_phone_region": "DE",
        "maintenance_window_start": 2
    }
}

List of activated Apps

Enabled:
  - activity: 2.20.0
  - admin_audit: 1.18.0
  - announcementcenter: 7.0.0
  - bruteforcesettings: 2.8.0
  - calendar: 4.7.16
  - calendar_resource_management: 0.8.0
  - cloud_federation_api: 1.11.0
  - comments: 1.18.0
  - contacts: 5.5.3
  - contactsinteraction: 1.9.0
  - dashboard: 7.8.0
  - dav: 1.29.2
  - deck: 1.12.4
  - external: 5.3.1
  - federatedfilesharing: 1.18.0
  - federation: 1.18.0
  - files: 2.0.0
  - files_external: 1.20.0
  - files_pdfviewer: 2.9.0
  - files_reminders: 1.1.0
  - files_sharing: 1.20.0
  - files_trashbin: 1.18.0
  - files_versions: 1.21.0
  - firstrunwizard: 2.17.0
  - forms: 4.2.4
  - groupfolders: 16.0.9
  - impersonate: 1.15.0
  - integration_openproject: 2.7.0
  - logreader: 2.13.0
  - lookup_server_connector: 1.16.0
  - notifications: 2.16.0
  - oauth2: 1.16.3
  - password_policy: 1.18.0
  - photos: 2.4.0
  - privacy: 1.12.0
  - provisioning_api: 1.18.0
  - recommendations: 2.0.0
  - related_resources: 1.3.0
  - richdocuments: 8.3.10
  - serverinfo: 1.18.0
  - settings: 1.10.1
  - sharebymail: 1.18.0
  - support: 1.11.1
  - systemtags: 1.18.0
  - text: 3.9.2
  - theming: 2.3.0
  - theming_customcss: 1.17.0
  - twofactor_backupcodes: 1.17.0
  - twofactor_totp: 10.0.0-beta.2
  - twofactor_webauthn: 1.4.0
  - updatenotification: 1.18.0
  - user_ldap: 1.19.0
  - user_status: 1.8.1
  - viewer: 2.2.0
  - weather_status: 1.8.0
  - workflowengine: 2.10.0
Disabled:
  - circles: 28.0.0 (installed 24.0.1)
  - encryption: 2.16.0
  - nextcloud_announcements: 1.17.0 (installed 1.5.0)
  - survey_client: 1.16.0 (installed 1.4.0)
  - suspicious_login: 6.0.0
  - user_saml: 6.2.0 (installed 6.2.0)

Nextcloud Signing status

not possible right now

Nextcloud Logs

too long for GitHub

Additional info

we use the community docker image for nextcloud

@cybertschunk cybertschunk added 0. Needs triage Pending check for reproducibility or if it fits our roadmap bug labels Sep 22, 2024
@cybertschunk
Copy link
Author

the nextcloud server log

{"reqId":"OJf6ItpPb88f3zhDHn3M","level":1,"time":"2024-09-22T09:30:04+02:00","remoteAddr":"141.83.153.55","user":"--","app":"no app in context","method":"REPORT","url":"/remote.php/dav/public-calendars/27NGG0C80ULFY5TN/","message":"Unable to generate a URL for the named route \"photos.page.index\" as such route does not exist.","userAgent":"Mozilla/5.0","version":"28.0.9.1","exception":{"Exception":"Symfony\\Component\\Routing\\Exception\\RouteNotFoundException","Message":"Unable to generate a URL for the named route \"photos.page.index\" as such route does not exist.","Code":0,"Trace":[{"file":"/var/www/html/lib/private/Route/Router.php","line":380,"function":"generate","class":"Symfony\\Component\\Routing\\Generator\\UrlGenerator","type":"->","args":["photos.page.index",[],1]},{"file":"/var/www/html/lib/private/Route/CachingRouter.php","line":65,"function":"generate","class":"OC\\Route\\Router","type":"->","args":["photos.page.index",[],false]},{"file":"/var/www/html/lib/private/URLGenerator.php","line":103,"function":"generate","class":"OC\\Route\\CachingRouter","type":"->","args":["photos.page.index",[]]},{"file":"/var/www/html/lib/private/NavigationManager.php","line":374,"function":"linkToRoute","class":"OC\\URLGenerator","type":"->","args":["photos.page.index"]},{"file":"/var/www/html/lib/private/NavigationManager.php","line":131,"function":"init","class":"OC\\NavigationManager","type":"->","args":[]},{"file":"/var/www/html/apps/theming/lib/ThemingDefaults.php","line":199,"function":"getAll","class":"OC\\NavigationManager","type":"->","args":["guest"]},{"file":"/var/www/html/lib/private/legacy/OC_Defaults.php","line":271,"function":"getShortFooter","class":"OCA\\Theming\\ThemingDefaults","type":"->","args":[]},{"file":"/var/www/html/lib/public/Defaults.php","line":176,"function":"getLongFooter","class":"OC_Defaults","type":"->","args":[]},{"file":"/var/www/html/core/templates/layout.guest.php","line":51,"function":"getLongFooter","class":"OCP\\Defaults","type":"->","args":[]},{"file":"/var/www/html/lib/private/Template/Base.php","line":180,"args":["/var/www/html/core/templates/layout.guest.php"],"function":"include"},{"file":"/var/www/html/lib/private/Template/Base.php","line":150,"function":"load","class":"OC\\Template\\Base","type":"->","args":["/var/www/html/core/templates/layout.guest.php",null]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":139,"function":"fetchPage","class":"OC\\Template\\Base","type":"->","args":[null]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":170,"function":"fetchPage","class":"OC_Template","type":"->","args":[null]},{"file":"/var/www/html/lib/private/Template/Base.php","line":132,"function":"fetchPage","class":"OC_Template","type":"->","args":[]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":258,"function":"printPage","class":"OC\\Template\\Base","type":"->","args":[]},{"file":"/var/www/html/remote.php","line":85,"function":"printErrorPage","class":"OC_Template","type":"::","args":["Service unavailable","",503]},{"file":"/var/www/html/remote.php","line":174,"function":"handleException","args":[["RemoteException"]]}],"File":"/var/www/html/3rdparty/symfony/routing/Generator/UrlGenerator.php","Line":144,"message":"Unable to generate a URL for the named route \"photos.page.index\" as such route does not exist.","exception":{},"CustomMessage":"Unable to generate a URL for the named route \"photos.page.index\" as such route does not exist."}}
{"reqId":"AIfYEBkGct4mSRmdh05j","level":1,"time":"2024-09-22T09:30:12+02:00","remoteAddr":"141.83.153.55","user":"--","app":"no app in context","method":"REPORT","url":"/remote.php/dav/public-calendars/27NGG0C80ULFY5TN/","message":"Unable to generate a URL for the named route \"activity.Activities.index\" as such route does not exist.","userAgent":"Mozilla/5.0","version":"28.0.9.1","exception":{"Exception":"Symfony\\Component\\Routing\\Exception\\RouteNotFoundException","Message":"Unable to generate a URL for the named route \"activity.Activities.index\" as such route does not exist.","Code":0,"Trace":[{"file":"/var/www/html/lib/private/Route/Router.php","line":380,"function":"generate","class":"Symfony\\Component\\Routing\\Generator\\UrlGenerator","type":"->","args":["activity.Activities.index",[],1]},{"file":"/var/www/html/lib/private/Route/CachingRouter.php","line":65,"function":"generate","class":"OC\\Route\\Router","type":"->","args":["activity.Activities.index",[],false]},{"file":"/var/www/html/lib/private/URLGenerator.php","line":103,"function":"generate","class":"OC\\Route\\CachingRouter","type":"->","args":["activity.Activities.index",[]]},{"file":"/var/www/html/lib/private/NavigationManager.php","line":374,"function":"linkToRoute","class":"OC\\URLGenerator","type":"->","args":["activity.Activities.index"]},{"file":"/var/www/html/lib/private/NavigationManager.php","line":131,"function":"init","class":"OC\\NavigationManager","type":"->","args":[]},{"file":"/var/www/html/apps/theming/lib/ThemingDefaults.php","line":199,"function":"getAll","class":"OC\\NavigationManager","type":"->","args":["guest"]},{"file":"/var/www/html/lib/private/legacy/OC_Defaults.php","line":271,"function":"getShortFooter","class":"OCA\\Theming\\ThemingDefaults","type":"->","args":[]},{"file":"/var/www/html/lib/public/Defaults.php","line":176,"function":"getLongFooter","class":"OC_Defaults","type":"->","args":[]},{"file":"/var/www/html/core/templates/layout.guest.php","line":51,"function":"getLongFooter","class":"OCP\\Defaults","type":"->","args":[]},{"file":"/var/www/html/lib/private/Template/Base.php","line":180,"args":["/var/www/html/core/templates/layout.guest.php"],"function":"include"},{"file":"/var/www/html/lib/private/Template/Base.php","line":150,"function":"load","class":"OC\\Template\\Base","type":"->","args":["/var/www/html/core/templates/layout.guest.php",null]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":139,"function":"fetchPage","class":"OC\\Template\\Base","type":"->","args":[null]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":170,"function":"fetchPage","class":"OC_Template","type":"->","args":[null]},{"file":"/var/www/html/lib/private/Template/Base.php","line":132,"function":"fetchPage","class":"OC_Template","type":"->","args":[]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":258,"function":"printPage","class":"OC\\Template\\Base","type":"->","args":[]},{"file":"/var/www/html/remote.php","line":85,"function":"printErrorPage","class":"OC_Template","type":"::","args":["Service unavailable","",503]},{"file":"/var/www/html/remote.php","line":174,"function":"handleException","args":[["RemoteException"]]}],"File":"/var/www/html/3rdparty/symfony/routing/Generator/UrlGenerator.php","Line":144,"message":"Unable to generate a URL for the named route \"activity.Activities.index\" as such route does not exist.","exception":{},"CustomMessage":"Unable to generate a URL for the named route \"activity.Activities.index\" as such route does not exist."}}
{"reqId":"AIfYEBkGct4mSRmdh05j","level":1,"time":"2024-09-22T09:30:12+02:00","remoteAddr":"141.83.153.55","user":"--","app":"no app in context","method":"REPORT","url":"/remote.php/dav/public-calendars/27NGG0C80ULFY5TN/","message":"Unable to generate a URL for the named route \"announcementcenter.page.index\" as such route does not exist.","userAgent":"Mozilla/5.0","version":"28.0.9.1","exception":{"Exception":"Symfony\\Component\\Routing\\Exception\\RouteNotFoundException","Message":"Unable to generate a URL for the named route \"announcementcenter.page.index\" as such route does not exist.","Code":0,"Trace":[{"file":"/var/www/html/lib/private/Route/Router.php","line":380,"function":"generate","class":"Symfony\\Component\\Routing\\Generator\\UrlGenerator","type":"->","args":["announcementcenter.page.index",[],1]},{"file":"/var/www/html/lib/private/Route/CachingRouter.php","line":65,"function":"generate","class":"OC\\Route\\Router","type":"->","args":["announcementcenter.page.index",[],false]},{"file":"/var/www/html/lib/private/URLGenerator.php","line":103,"function":"generate","class":"OC\\Route\\CachingRouter","type":"->","args":["announcementcenter.page.index",[]]},{"file":"/var/www/html/lib/private/NavigationManager.php","line":374,"function":"linkToRoute","class":"OC\\URLGenerator","type":"->","args":["announcementcenter.page.index"]},{"file":"/var/www/html/lib/private/NavigationManager.php","line":131,"function":"init","class":"OC\\NavigationManager","type":"->","args":[]},{"file":"/var/www/html/apps/theming/lib/ThemingDefaults.php","line":199,"function":"getAll","class":"OC\\NavigationManager","type":"->","args":["guest"]},{"file":"/var/www/html/lib/private/legacy/OC_Defaults.php","line":271,"function":"getShortFooter","class":"OCA\\Theming\\ThemingDefaults","type":"->","args":[]},{"file":"/var/www/html/lib/public/Defaults.php","line":176,"function":"getLongFooter","class":"OC_Defaults","type":"->","args":[]},{"file":"/var/www/html/core/templates/layout.guest.php","line":51,"function":"getLongFooter","class":"OCP\\Defaults","type":"->","args":[]},{"file":"/var/www/html/lib/private/Template/Base.php","line":180,"args":["/var/www/html/core/templates/layout.guest.php"],"function":"include"},{"file":"/var/www/html/lib/private/Template/Base.php","line":150,"function":"load","class":"OC\\Template\\Base","type":"->","args":["/var/www/html/core/templates/layout.guest.php",null]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":139,"function":"fetchPage","class":"OC\\Template\\Base","type":"->","args":[null]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":170,"function":"fetchPage","class":"OC_Template","type":"->","args":[null]},{"file":"/var/www/html/lib/private/Template/Base.php","line":132,"function":"fetchPage","class":"OC_Template","type":"->","args":[]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":258,"function":"printPage","class":"OC\\Template\\Base","type":"->","args":[]},{"file":"/var/www/html/remote.php","line":85,"function":"printErrorPage","class":"OC_Template","type":"::","args":["Service unavailable","",503]},{"file":"/var/www/html/remote.php","line":174,"function":"handleException","args":[["RemoteException"]]}],"File":"/var/www/html/3rdparty/symfony/routing/Generator/UrlGenerator.php","Line":144,"message":"Unable to generate a URL for the named route \"announcementcenter.page.index\" as such route does not exist.","exception":{},"CustomMessage":"Unable to generate a URL for the named route \"announcementcenter.page.index\" as such route does not exist."}}
{"reqId":"AIfYEBkGct4mSRmdh05j","level":1,"time":"2024-09-22T09:30:12+02:00","remoteAddr":"141.83.153.55","user":"--","app":"no app in context","method":"REPORT","url":"/remote.php/dav/public-calendars/27NGG0C80ULFY5TN/","message":"Unable to generate a URL for the named route \"calendar.view.index\" as such route does not exist.","userAgent":"Mozilla/5.0","version":"28.0.9.1","exception":{"Exception":"Symfony\\Component\\Routing\\Exception\\RouteNotFoundException","Message":"Unable to generate a URL for the named route \"calendar.view.index\" as such route does not exist.","Code":0,"Trace":[{"file":"/var/www/html/lib/private/Route/Router.php","line":380,"function":"generate","class":"Symfony\\Component\\Routing\\Generator\\UrlGenerator","type":"->","args":["calendar.view.index",[],1]},{"file":"/var/www/html/lib/private/Route/CachingRouter.php","line":65,"function":"generate","class":"OC\\Route\\Router","type":"->","args":["calendar.view.index",[],false]},{"file":"/var/www/html/lib/private/URLGenerator.php","line":103,"function":"generate","class":"OC\\Route\\CachingRouter","type":"->","args":["calendar.view.index",[]]},{"file":"/var/www/html/lib/private/NavigationManager.php","line":374,"function":"linkToRoute","class":"OC\\URLGenerator","type":"->","args":["calendar.view.index"]},{"file":"/var/www/html/lib/private/NavigationManager.php","line":131,"function":"init","class":"OC\\NavigationManager","type":"->","args":[]},{"file":"/var/www/html/apps/theming/lib/ThemingDefaults.php","line":199,"function":"getAll","class":"OC\\NavigationManager","type":"->","args":["guest"]},{"file":"/var/www/html/lib/private/legacy/OC_Defaults.php","line":271,"function":"getShortFooter","class":"OCA\\Theming\\ThemingDefaults","type":"->","args":[]},{"file":"/var/www/html/lib/public/Defaults.php","line":176,"function":"getLongFooter","class":"OC_Defaults","type":"->","args":[]},{"file":"/var/www/html/core/templates/layout.guest.php","line":51,"function":"getLongFooter","class":"OCP\\Defaults","type":"->","args":[]},{"file":"/var/www/html/lib/private/Template/Base.php","line":180,"args":["/var/www/html/core/templates/layout.guest.php"],"function":"include"},{"file":"/var/www/html/lib/private/Template/Base.php","line":150,"function":"load","class":"OC\\Template\\Base","type":"->","args":["/var/www/html/core/templates/layout.guest.php",null]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":139,"function":"fetchPage","class":"OC\\Template\\Base","type":"->","args":[null]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":170,"function":"fetchPage","class":"OC_Template","type":"->","args":[null]},{"file":"/var/www/html/lib/private/Template/Base.php","line":132,"function":"fetchPage","class":"OC_Template","type":"->","args":[]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":258,"function":"printPage","class":"OC\\Template\\Base","type":"->","args":[]},{"file":"/var/www/html/remote.php","line":85,"function":"printErrorPage","class":"OC_Template","type":"::","args":["Service unavailable","",503]},{"file":"/var/www/html/remote.php","line":174,"function":"handleException","args":[["RemoteException"]]}],"File":"/var/www/html/3rdparty/symfony/routing/Generator/UrlGenerator.php","Line":144,"message":"Unable to generate a URL for the named route \"calendar.view.index\" as such route does not exist.","exception":{},"CustomMessage":"Unable to generate a URL for the named route \"calendar.view.index\" as such route does not exist."}}
{"reqId":"AIfYEBkGct4mSRmdh05j","level":1,"time":"2024-09-22T09:30:12+02:00","remoteAddr":"141.83.153.55","user":"--","app":"no app in context","method":"REPORT","url":"/remote.php/dav/public-calendars/27NGG0C80ULFY5TN/","message":"Unable to generate a URL for the named route \"contacts.page.index\" as such route does not exist.","userAgent":"Mozilla/5.0","version":"28.0.9.1","exception":{"Exception":"Symfony\\Component\\Routing\\Exception\\RouteNotFoundException","Message":"Unable to generate a URL for the named route \"contacts.page.index\" as such route does not exist.","Code":0,"Trace":[{"file":"/var/www/html/lib/private/Route/Router.php","line":380,"function":"generate","class":"Symfony\\Component\\Routing\\Generator\\UrlGenerator","type":"->","args":["contacts.page.index",[],1]},{"file":"/var/www/html/lib/private/Route/CachingRouter.php","line":65,"function":"generate","class":"OC\\Route\\Router","type":"->","args":["contacts.page.index",[],false]},{"file":"/var/www/html/lib/private/URLGenerator.php","line":103,"function":"generate","class":"OC\\Route\\CachingRouter","type":"->","args":["contacts.page.index",[]]},{"file":"/var/www/html/lib/private/NavigationManager.php","line":374,"function":"linkToRoute","class":"OC\\URLGenerator","type":"->","args":["contacts.page.index"]},{"file":"/var/www/html/lib/private/NavigationManager.php","line":131,"function":"init","class":"OC\\NavigationManager","type":"->","args":[]},{"file":"/var/www/html/apps/theming/lib/ThemingDefaults.php","line":199,"function":"getAll","class":"OC\\NavigationManager","type":"->","args":["guest"]},{"file":"/var/www/html/lib/private/legacy/OC_Defaults.php","line":271,"function":"getShortFooter","class":"OCA\\Theming\\ThemingDefaults","type":"->","args":[]},{"file":"/var/www/html/lib/public/Defaults.php","line":176,"function":"getLongFooter","class":"OC_Defaults","type":"->","args":[]},{"file":"/var/www/html/core/templates/layout.guest.php","line":51,"function":"getLongFooter","class":"OCP\\Defaults","type":"->","args":[]},{"file":"/var/www/html/lib/private/Template/Base.php","line":180,"args":["/var/www/html/core/templates/layout.guest.php"],"function":"include"},{"file":"/var/www/html/lib/private/Template/Base.php","line":150,"function":"load","class":"OC\\Template\\Base","type":"->","args":["/var/www/html/core/templates/layout.guest.php",null]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":139,"function":"fetchPage","class":"OC\\Template\\Base","type":"->","args":[null]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":170,"function":"fetchPage","class":"OC_Template","type":"->","args":[null]},{"file":"/var/www/html/lib/private/Template/Base.php","line":132,"function":"fetchPage","class":"OC_Template","type":"->","args":[]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":258,"function":"printPage","class":"OC\\Template\\Base","type":"->","args":[]},{"file":"/var/www/html/remote.php","line":85,"function":"printErrorPage","class":"OC_Template","type":"::","args":["Service unavailable","",503]},{"file":"/var/www/html/remote.php","line":174,"function":"handleException","args":[["RemoteException"]]}],"File":"/var/www/html/3rdparty/symfony/routing/Generator/UrlGenerator.php","Line":144,"message":"Unable to generate a URL for the named route \"contacts.page.index\" as such route does not exist.","exception":{},"CustomMessage":"Unable to generate a URL for the named route \"contacts.page.index\" as such route does not exist."}}
{"reqId":"AIfYEBkGct4mSRmdh05j","level":1,"time":"2024-09-22T09:30:12+02:00","remoteAddr":"141.83.153.55","user":"--","app":"no app in context","method":"REPORT","url":"/remote.php/dav/public-calendars/27NGG0C80ULFY5TN/","message":"Unable to generate a URL for the named route \"dashboard.dashboard.index\" as such route does not exist.","userAgent":"Mozilla/5.0","version":"28.0.9.1","exception":{"Exception":"Symfony\\Component\\Routing\\Exception\\RouteNotFoundException","Message":"Unable to generate a URL for the named route \"dashboard.dashboard.index\" as such route does not exist.","Code":0,"Trace":[{"file":"/var/www/html/lib/private/Route/Router.php","line":380,"function":"generate","class":"Symfony\\Component\\Routing\\Generator\\UrlGenerator","type":"->","args":["dashboard.dashboard.index",[],1]},{"file":"/var/www/html/lib/private/Route/CachingRouter.php","line":65,"function":"generate","class":"OC\\Route\\Router","type":"->","args":["dashboard.dashboard.index",[],false]},{"file":"/var/www/html/lib/private/URLGenerator.php","line":103,"function":"generate","class":"OC\\Route\\CachingRouter","type":"->","args":["dashboard.dashboard.index",[]]},{"file":"/var/www/html/lib/private/NavigationManager.php","line":374,"function":"linkToRoute","class":"OC\\URLGenerator","type":"->","args":["dashboard.dashboard.index"]},{"file":"/var/www/html/lib/private/NavigationManager.php","line":131,"function":"init","class":"OC\\NavigationManager","type":"->","args":[]},{"file":"/var/www/html/apps/theming/lib/ThemingDefaults.php","line":199,"function":"getAll","class":"OC\\NavigationManager","type":"->","args":["guest"]},{"file":"/var/www/html/lib/private/legacy/OC_Defaults.php","line":271,"function":"getShortFooter","class":"OCA\\Theming\\ThemingDefaults","type":"->","args":[]},{"file":"/var/www/html/lib/public/Defaults.php","line":176,"function":"getLongFooter","class":"OC_Defaults","type":"->","args":[]},{"file":"/var/www/html/core/templates/layout.guest.php","line":51,"function":"getLongFooter","class":"OCP\\Defaults","type":"->","args":[]},{"file":"/var/www/html/lib/private/Template/Base.php","line":180,"args":["/var/www/html/core/templates/layout.guest.php"],"function":"include"},{"file":"/var/www/html/lib/private/Template/Base.php","line":150,"function":"load","class":"OC\\Template\\Base","type":"->","args":["/var/www/html/core/templates/layout.guest.php",null]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":139,"function":"fetchPage","class":"OC\\Template\\Base","type":"->","args":[null]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":170,"function":"fetchPage","class":"OC_Template","type":"->","args":[null]},{"file":"/var/www/html/lib/private/Template/Base.php","line":132,"function":"fetchPage","class":"OC_Template","type":"->","args":[]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":258,"function":"printPage","class":"OC\\Template\\Base","type":"->","args":[]},{"file":"/var/www/html/remote.php","line":85,"function":"printErrorPage","class":"OC_Template","type":"::","args":["Service unavailable","",503]},{"file":"/var/www/html/remote.php","line":174,"function":"handleException","args":[["RemoteException"]]}],"File":"/var/www/html/3rdparty/symfony/routing/Generator/UrlGenerator.php","Line":144,"message":"Unable to generate a URL for the named route \"dashboard.dashboard.index\" as such route does not exist.","exception":{},"CustomMessage":"Unable to generate a URL for the named route \"dashboard.dashboard.index\" as such route does not exist."}}
{"reqId":"AIfYEBkGct4mSRmdh05j","level":1,"time":"2024-09-22T09:30:12+02:00","remoteAddr":"141.83.153.55","user":"--","app":"no app in context","method":"REPORT","url":"/remote.php/dav/public-calendars/27NGG0C80ULFY5TN/","message":"Unable to generate a URL for the named route \"deck.page.index\" as such route does not exist.","userAgent":"Mozilla/5.0","version":"28.0.9.1","exception":{"Exception":"Symfony\\Component\\Routing\\Exception\\RouteNotFoundException","Message":"Unable to generate a URL for the named route \"deck.page.index\" as such route does not exist.","Code":0,"Trace":[{"file":"/var/www/html/lib/private/Route/Router.php","line":380,"function":"generate","class":"Symfony\\Component\\Routing\\Generator\\UrlGenerator","type":"->","args":["deck.page.index",[],1]},{"file":"/var/www/html/lib/private/Route/CachingRouter.php","line":65,"function":"generate","class":"OC\\Route\\Router","type":"->","args":["deck.page.index",[],false]},{"file":"/var/www/html/lib/private/URLGenerator.php","line":103,"function":"generate","class":"OC\\Route\\CachingRouter","type":"->","args":["deck.page.index",[]]},{"file":"/var/www/html/lib/private/NavigationManager.php","line":374,"function":"linkToRoute","class":"OC\\URLGenerator","type":"->","args":["deck.page.index"]},{"file":"/var/www/html/lib/private/NavigationManager.php","line":131,"function":"init","class":"OC\\NavigationManager","type":"->","args":[]},{"file":"/var/www/html/apps/theming/lib/ThemingDefaults.php","line":199,"function":"getAll","class":"OC\\NavigationManager","type":"->","args":["guest"]},{"file":"/var/www/html/lib/private/legacy/OC_Defaults.php","line":271,"function":"getShortFooter","class":"OCA\\Theming\\ThemingDefaults","type":"->","args":[]},{"file":"/var/www/html/lib/public/Defaults.php","line":176,"function":"getLongFooter","class":"OC_Defaults","type":"->","args":[]},{"file":"/var/www/html/core/templates/layout.guest.php","line":51,"function":"getLongFooter","class":"OCP\\Defaults","type":"->","args":[]},{"file":"/var/www/html/lib/private/Template/Base.php","line":180,"args":["/var/www/html/core/templates/layout.guest.php"],"function":"include"},{"file":"/var/www/html/lib/private/Template/Base.php","line":150,"function":"load","class":"OC\\Template\\Base","type":"->","args":["/var/www/html/core/templates/layout.guest.php",null]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":139,"function":"fetchPage","class":"OC\\Template\\Base","type":"->","args":[null]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":170,"function":"fetchPage","class":"OC_Template","type":"->","args":[null]},{"file":"/var/www/html/lib/private/Template/Base.php","line":132,"function":"fetchPage","class":"OC_Template","type":"->","args":[]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":258,"function":"printPage","class":"OC\\Template\\Base","type":"->","args":[]},{"file":"/var/www/html/remote.php","line":85,"function":"printErrorPage","class":"OC_Template","type":"::","args":["Service unavailable","",503]},{"file":"/var/www/html/remote.php","line":174,"function":"handleException","args":[["RemoteException"]]}],"File":"/var/www/html/3rdparty/symfony/routing/Generator/UrlGenerator.php","Line":144,"message":"Unable to generate a URL for the named route \"deck.page.index\" as such route does not exist.","exception":{},"CustomMessage":"Unable to generate a URL for the named route \"deck.page.index\" as such route does not exist."}}
{"reqId":"AIfYEBkGct4mSRmdh05j","level":1,"time":"2024-09-22T09:30:12+02:00","remoteAddr":"141.83.153.55","user":"--","app":"no app in context","method":"REPORT","url":"/remote.php/dav/public-calendars/27NGG0C80ULFY5TN/","message":"Unable to generate a URL for the named route \"files.view.index\" as such route does not exist.","userAgent":"Mozilla/5.0","version":"28.0.9.1","exception":{"Exception":"Symfony\\Component\\Routing\\Exception\\RouteNotFoundException","Message":"Unable to generate a URL for the named route \"files.view.index\" as such route does not exist.","Code":0,"Trace":[{"file":"/var/www/html/lib/private/Route/Router.php","line":380,"function":"generate","class":"Symfony\\Component\\Routing\\Generator\\UrlGenerator","type":"->","args":["files.view.index",[],1]},{"file":"/var/www/html/lib/private/Route/CachingRouter.php","line":65,"function":"generate","class":"OC\\Route\\Router","type":"->","args":["files.view.index",[],false]},{"file":"/var/www/html/lib/private/URLGenerator.php","line":103,"function":"generate","class":"OC\\Route\\CachingRouter","type":"->","args":["files.view.index",[]]},{"file":"/var/www/html/lib/private/NavigationManager.php","line":374,"function":"linkToRoute","class":"OC\\URLGenerator","type":"->","args":["files.view.index"]},{"file":"/var/www/html/lib/private/NavigationManager.php","line":131,"function":"init","class":"OC\\NavigationManager","type":"->","args":[]},{"file":"/var/www/html/apps/theming/lib/ThemingDefaults.php","line":199,"function":"getAll","class":"OC\\NavigationManager","type":"->","args":["guest"]},{"file":"/var/www/html/lib/private/legacy/OC_Defaults.php","line":271,"function":"getShortFooter","class":"OCA\\Theming\\ThemingDefaults","type":"->","args":[]},{"file":"/var/www/html/lib/public/Defaults.php","line":176,"function":"getLongFooter","class":"OC_Defaults","type":"->","args":[]},{"file":"/var/www/html/core/templates/layout.guest.php","line":51,"function":"getLongFooter","class":"OCP\\Defaults","type":"->","args":[]},{"file":"/var/www/html/lib/private/Template/Base.php","line":180,"args":["/var/www/html/core/templates/layout.guest.php"],"function":"include"},{"file":"/var/www/html/lib/private/Template/Base.php","line":150,"function":"load","class":"OC\\Template\\Base","type":"->","args":["/var/www/html/core/templates/layout.guest.php",null]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":139,"function":"fetchPage","class":"OC\\Template\\Base","type":"->","args":[null]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":170,"function":"fetchPage","class":"OC_Template","type":"->","args":[null]},{"file":"/var/www/html/lib/private/Template/Base.php","line":132,"function":"fetchPage","class":"OC_Template","type":"->","args":[]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":258,"function":"printPage","class":"OC\\Template\\Base","type":"->","args":[]},{"file":"/var/www/html/remote.php","line":85,"function":"printErrorPage","class":"OC_Template","type":"::","args":["Service unavailable","",503]},{"file":"/var/www/html/remote.php","line":174,"function":"handleException","args":[["RemoteException"]]}],"File":"/var/www/html/3rdparty/symfony/routing/Generator/UrlGenerator.php","Line":144,"message":"Unable to generate a URL for the named route \"files.view.index\" as such route does not exist.","exception":{},"CustomMessage":"Unable to generate a URL for the named route \"files.view.index\" as such route does not exist."}}
{"reqId":"AIfYEBkGct4mSRmdh05j","level":1,"time":"2024-09-22T09:30:12+02:00","remoteAddr":"141.83.153.55","user":"--","app":"no app in context","method":"REPORT","url":"/remote.php/dav/public-calendars/27NGG0C80ULFY5TN/","message":"Unable to generate a URL for the named route \"forms.page.index\" as such route does not exist.","userAgent":"Mozilla/5.0","version":"28.0.9.1","exception":{"Exception":"Symfony\\Component\\Routing\\Exception\\RouteNotFoundException","Message":"Unable to generate a URL for the named route \"forms.page.index\" as such route does not exist.","Code":0,"Trace":[{"file":"/var/www/html/lib/private/Route/Router.php","line":380,"function":"generate","class":"Symfony\\Component\\Routing\\Generator\\UrlGenerator","type":"->","args":["forms.page.index",[],1]},{"file":"/var/www/html/lib/private/Route/CachingRouter.php","line":65,"function":"generate","class":"OC\\Route\\Router","type":"->","args":["forms.page.index",[],false]},{"file":"/var/www/html/lib/private/URLGenerator.php","line":103,"function":"generate","class":"OC\\Route\\CachingRouter","type":"->","args":["forms.page.index",[]]},{"file":"/var/www/html/lib/private/NavigationManager.php","line":374,"function":"linkToRoute","class":"OC\\URLGenerator","type":"->","args":["forms.page.index"]},{"file":"/var/www/html/lib/private/NavigationManager.php","line":131,"function":"init","class":"OC\\NavigationManager","type":"->","args":[]},{"file":"/var/www/html/apps/theming/lib/ThemingDefaults.php","line":199,"function":"getAll","class":"OC\\NavigationManager","type":"->","args":["guest"]},{"file":"/var/www/html/lib/private/legacy/OC_Defaults.php","line":271,"function":"getShortFooter","class":"OCA\\Theming\\ThemingDefaults","type":"->","args":[]},{"file":"/var/www/html/lib/public/Defaults.php","line":176,"function":"getLongFooter","class":"OC_Defaults","type":"->","args":[]},{"file":"/var/www/html/core/templates/layout.guest.php","line":51,"function":"getLongFooter","class":"OCP\\Defaults","type":"->","args":[]},{"file":"/var/www/html/lib/private/Template/Base.php","line":180,"args":["/var/www/html/core/templates/layout.guest.php"],"function":"include"},{"file":"/var/www/html/lib/private/Template/Base.php","line":150,"function":"load","class":"OC\\Template\\Base","type":"->","args":["/var/www/html/core/templates/layout.guest.php",null]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":139,"function":"fetchPage","class":"OC\\Template\\Base","type":"->","args":[null]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":170,"function":"fetchPage","class":"OC_Template","type":"->","args":[null]},{"file":"/var/www/html/lib/private/Template/Base.php","line":132,"function":"fetchPage","class":"OC_Template","type":"->","args":[]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":258,"function":"printPage","class":"OC\\Template\\Base","type":"->","args":[]},{"file":"/var/www/html/remote.php","line":85,"function":"printErrorPage","class":"OC_Template","type":"::","args":["Service unavailable","",503]},{"file":"/var/www/html/remote.php","line":174,"function":"handleException","args":[["RemoteException"]]}],"File":"/var/www/html/3rdparty/symfony/routing/Generator/UrlGenerator.php","Line":144,"message":"Unable to generate a URL for the named route \"forms.page.index\" as such route does not exist.","exception":{},"CustomMessage":"Unable to generate a URL for the named route \"forms.page.index\" as such route does not exist."}}
{"reqId":"AIfYEBkGct4mSRmdh05j","level":1,"time":"2024-09-22T09:30:12+02:00","remoteAddr":"141.83.153.55","user":"--","app":"no app in context","method":"REPORT","url":"/remote.php/dav/public-calendars/27NGG0C80ULFY5TN/","message":"Unable to generate a URL for the named route \"photos.page.index\" as such route does not exist.","userAgent":"Mozilla/5.0","version":"28.0.9.1","exception":{"Exception":"Symfony\\Component\\Routing\\Exception\\RouteNotFoundException","Message":"Unable to generate a URL for the named route \"photos.page.index\" as such route does not exist.","Code":0,"Trace":[{"file":"/var/www/html/lib/private/Route/Router.php","line":380,"function":"generate","class":"Symfony\\Component\\Routing\\Generator\\UrlGenerator","type":"->","args":["photos.page.index",[],1]},{"file":"/var/www/html/lib/private/Route/CachingRouter.php","line":65,"function":"generate","class":"OC\\Route\\Router","type":"->","args":["photos.page.index",[],false]},{"file":"/var/www/html/lib/private/URLGenerator.php","line":103,"function":"generate","class":"OC\\Route\\CachingRouter","type":"->","args":["photos.page.index",[]]},{"file":"/var/www/html/lib/private/NavigationManager.php","line":374,"function":"linkToRoute","class":"OC\\URLGenerator","type":"->","args":["photos.page.index"]},{"file":"/var/www/html/lib/private/NavigationManager.php","line":131,"function":"init","class":"OC\\NavigationManager","type":"->","args":[]},{"file":"/var/www/html/apps/theming/lib/ThemingDefaults.php","line":199,"function":"getAll","class":"OC\\NavigationManager","type":"->","args":["guest"]},{"file":"/var/www/html/lib/private/legacy/OC_Defaults.php","line":271,"function":"getShortFooter","class":"OCA\\Theming\\ThemingDefaults","type":"->","args":[]},{"file":"/var/www/html/lib/public/Defaults.php","line":176,"function":"getLongFooter","class":"OC_Defaults","type":"->","args":[]},{"file":"/var/www/html/core/templates/layout.guest.php","line":51,"function":"getLongFooter","class":"OCP\\Defaults","type":"->","args":[]},{"file":"/var/www/html/lib/private/Template/Base.php","line":180,"args":["/var/www/html/core/templates/layout.guest.php"],"function":"include"},{"file":"/var/www/html/lib/private/Template/Base.php","line":150,"function":"load","class":"OC\\Template\\Base","type":"->","args":["/var/www/html/core/templates/layout.guest.php",null]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":139,"function":"fetchPage","class":"OC\\Template\\Base","type":"->","args":[null]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":170,"function":"fetchPage","class":"OC_Template","type":"->","args":[null]},{"file":"/var/www/html/lib/private/Template/Base.php","line":132,"function":"fetchPage","class":"OC_Template","type":"->","args":[]},{"file":"/var/www/html/lib/private/legacy/OC_Template.php","line":258,"function":"printPage","class":"OC\\Template\\Base","type":"->","args":[]},{"file":"/var/www/html/remote.php","line":85,"function":"printErrorPage","class":"OC_Template","type":"::","args":["Service unavailable","",503]},{"file":"/var/www/html/remote.php","line":174,"function":"handleException","args":[["RemoteException"]]}],"File":"/var/www/html/3rdparty/symfony/routing/Generator/UrlGenerator.php","Line":144,"message":"Unable to generate a URL for the named route \"photos.page.index\" as such route does not exist.","exception":{},"CustomMessage":"Unable to generate a URL for the named route \"photos.page.index\" as such route does not exist."}}

@joshtrichards
Copy link
Member

Coming from a recent change made in #47635.

The error suggests one of your secret values in your oauth2_clients db table isn't in a valid format for some reason:

$qbSelect = $this->connection->getQueryBuilder();
$qbSelect->select('id', 'secret')
->from('oauth2_clients');
$req = $qbSelect->executeQuery();
while ($row = $req->fetch()) {
$id = $row['id'];
$storedEncryptedSecret = $row['secret'];
$secret = $this->crypto->decrypt($storedEncryptedSecret);

private function decryptWithoutSecret(string $authenticatedCiphertext, string $password = ''): string {
$hmacKey = $encryptionKey = $password;
$parts = explode('|', $authenticatedCiphertext);
$partCount = \count($parts);
if ($partCount < 3 || $partCount > 4) {
throw new Exception('Authenticated ciphertext could not be decoded.');

  1. Are you using OAuth2? (Or have you previously with this instance / against this database)?
  2. Can you query your database to see the format (structure) of your existing secret(s) are in your oauth2_clients table?

@kesselb
Copy link
Contributor

kesselb commented Sep 22, 2024

cc @julien-nc

@cybertschunk
Copy link
Author

cybertschunk commented Sep 23, 2024

Thanks for looking into our bug report! I hope the infos provided below answer your questions. If there is anything else I can assist you with please let me know.

We use oauth2 for our OpenProject integration. The format of our oauth2_clients table is as following:

                                                              Table "public.oc_oauth2_clients"
      Column       |          Type           | Collation | Nullable |                    Default                    | Storage  | Stats target | Description
-------------------+-------------------------+-----------+----------+-----------------------------------------------+----------+--------------+-------------
 id                | integer                 |           | not null | nextval('oc_oauth2_clients_id_seq'::regclass) | plain    |              |
 name              | character varying(64)   |           | not null |                                               | extended |              |
 redirect_uri      | character varying(2000) |           | not null |                                               | extended |              |
 client_identifier | character varying(64)   |           | not null |                                               | extended |              |
 secret            | character varying(512)  |           | not null |                                               | extended |              |
Indexes:
    "oc_oauth2_clients_pkey" PRIMARY KEY, btree (id)
    "oauth2_client_id_idx" UNIQUE, btree (client_identifier)
Access method: heap

The content is as follow:

 id |        name        |                                                      redirect_uri
              |                        client_identifier                         |                              secret

----+--------------------+-------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------+------------------------------------------------------------------
  1 | OpenProject client | https://projects.**REMOVED**/oauth_clients/**REMOVED**/callback | LGtr**REMOVED**KSv | aS**REMOVED**DH
(1 row)

@julien-nc
Copy link
Member

@cybertschunk Hi. This is most likely because the OpenProject integration app that created this OAuth client was not in tune with the server at the moment it created it.

Let me clarify 😁 .
Historically, secrets were stored unencrypted (A) in the oc_oauth2_clients database table. We then moved to store them encrypted (B) and we finally moved to store them hashed(C) (to make them non-recoverable). Each time that changed, the existing stored secrets were migrated in the database. And the new ones created with the web interface are in the right "format".
But the OpenProject integration app does not ask the admin to create an OAuth app manually in the web UI. It does it itself. So it has store the secret in the same "format" as the core would do it.

I think what happened is: The OAuth client was created by the OpenProject app while the server was in a (B) state. But the OpenProject app was not up-to-date and it created it unencrypted. And now the server migration is failing to decrypt the value when trying to migrate to (C).

The easy way to get out of this would be to delete this OAuth app and reconfigure the OpenProject integration. Make sure you are using integration_openproject v2.7.0 which knows it has to hash the secret on Nextcloud 28.0.10.

Does that make sense?

@cybertschunk
Copy link
Author

hey @julien-nc thanks so much for your explanation! I will try out the steps outlined by you and keep you posted on how it went. Shall I open a bug report on the integration repo then so they can fix this issue?

@joshtrichards joshtrichards changed the title [Bug]: Upgrade to nextcloud 28.0.10 fails with Database error when running migration for app oauth2 [Bug]: Upgrade to nextcloud 28.0.10 fails with Database error when running migration for app oauth2 [OpenProject integration] Sep 30, 2024
@julien-nc
Copy link
Member

@cybertschunk As far as I know they have been informed and the next (or current latest) release of integration_openproject should be fine.

@julien-nc
Copy link
Member

Feel free to reopen this issue if needed.

@cybertschunk
Copy link
Author

I performed the upgrade as you instructed and it worked just fine. Thanks so much for your help!

@julien-nc
Copy link
Member

You're welcome. Thanks for the feedback.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants