server icon indicating copy to clipboard operation
server copied to clipboard

[Bug]: File Ownership Transfer through Web UI fails with TypeError: OC\Files\Node\HookConnector::getNodeForPath(): Argument #1 ($path) must be of type string, null given

Open kizzo89 opened this issue 2 years ago • 2 comments

⚠️ This issue respects the following points: ⚠️

Bug description

Transferring ownership of files fails with an error code. While notifications as described in the documentation are received, and the receiving folder is created, the final file transfer seems to fail. The files remain in their original location on my account.

Maybe I'm missing something or I misconfigured something?

Steps to reproduce

  1. Upload a file requested by other user. (Test file used was around 60 kB.)
  2. Go to Personal Settings -> Sharing.
  3. Click Choose file or folder to transfer. Select file.
  4. Select other user in New Owner box. Click button Transfer to .
  5. UI popup shows Ownership transfer request sent.
  6. UI notification for second user appears. Select Accept. (I tried this out with two user accounts under my control. Also, I understand transfer can take up to an hour as indicated.)
  7. Receive email from cron with the logged error as indicated in Nextcloud Logs section below.

Note that the user's receiving folder titled transferred from on was created.

Expected behavior

After second user clicks Accept, second user should receive a copy of the files in the indicated folder. Also, I expected that the files would disappear from my account.

Installation method

Community Manual installation with Archive

Nextcloud Server version

26

Operating system

Debian/Ubuntu

PHP engine version

PHP 8.1

Web server

Nginx

Database engine version

MariaDB

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

Updated from a MINOR version (ex. 22.1 to 22.2)

Are you using the Nextcloud Server Encryption module?

Encryption is Disabled

What user-backends are you using?

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

Configuration report

{
    "system": {
        "instanceid": "***REMOVED SENSITIVE VALUE***",
        "passwordsalt": "***REMOVED SENSITIVE VALUE***",
        "secret": "***REMOVED SENSITIVE VALUE***",
        "trusted_domains": [
            "192.168.130.10",
            "home.abertax.com"
        ],
        "overwrite.cli.url": "https:\/\/192.168.130.10",
        "version": "26.0.2.1",
        "installed": true,
        "datadirectory": "***REMOVED SENSITIVE VALUE***",
        "maintenance": false,
        "theme": "",
        "default_phone_region": "mt",
        "defaultapp": "calendar",
        "allow_local_remote_servers": "1",
        "lost_password_link": "disabled",
        "enabledPreviewProviders": [
            "OC\\Preview\\PNG",
            "OC\\Preview\\JPEG",
            "OC\\Preview\\GIF",
            "OC\\Preview\\BMP"
        ],
        "dbname": "***REMOVED SENSITIVE VALUE***",
        "dbtype": "mysql",
        "dbhost": "***REMOVED SENSITIVE VALUE***",
        "dbport": "",
        "dbtableprefix": "oc_",
        "dbuser": "***REMOVED SENSITIVE VALUE***",
        "dbpassword": "***REMOVED SENSITIVE VALUE***",
        "mysql.utf8mb4": true,
        "ldapProviderFactory": "OCA\\User_LDAP\\LDAPProviderFactory",
        "memcache.local": "\\OC\\Memcache\\APCu",
        "memcache.distributed": "\\OC\\Memcache\\Redis",
        "memcache.locking": "\\OC\\Memcache\\Redis",
        "redis": {
            "host": "***REMOVED SENSITIVE VALUE***",
            "port": 0
        },
        "mail_from_address": "***REMOVED SENSITIVE VALUE***",
        "mail_smtpmode": "smtp",
        "mail_sendmailmode": "smtp",
        "mail_domain": "***REMOVED SENSITIVE VALUE***",
        "mail_smtphost": "***REMOVED SENSITIVE VALUE***",
        "mail_smtpport": "25",
        "loglevel": 1,
        "logfile": "\/var\/log\/nextcloud\/nextcloud.log",
        "app_install_overwrite": [
            "impersonate"
        ]
    }
}

List of activated Apps

nabled:
  - activity: 2.18.0
  - admin_audit: 1.16.0
  - appointments: 1.15.1
  - bruteforcesettings: 2.6.0
  - calendar: 4.4.2
  - cloud_federation_api: 1.9.0
  - comments: 1.16.0
  - contacts: 5.3.1
  - contactsinteraction: 1.7.0
  - dashboard: 7.6.0
  - dav: 1.25.0
  - federatedfilesharing: 1.16.0
  - federation: 1.16.0
  - files: 1.21.1
  - files_external: 1.18.0
  - files_pdfviewer: 2.7.0
  - files_rightclick: 1.5.0
  - files_sharing: 1.18.0
  - files_trashbin: 1.16.0
  - files_versions: 1.19.1
  - firstrunwizard: 2.15.0
  - forms: 3.3.0
  - groupfolders: 14.0.2
  - holiday_calendars: 0.3.0
  - impersonate: 1.13.1
  - integration_openproject: 2.3.7
  - logreader: 2.11.0
  - lookup_server_connector: 1.14.0
  - mail: 3.2.1
  - nextcloud_announcements: 1.15.0
  - notifications: 2.14.0
  - oauth2: 1.14.0
  - password_policy: 1.16.0
  - photos: 2.2.0
  - privacy: 1.10.0
  - provisioning_api: 1.16.0
  - recommendations: 1.5.0
  - related_resources: 1.1.0-alpha1
  - serverinfo: 1.16.0
  - settings: 1.8.0
  - sharebymail: 1.16.0
  - support: 1.9.0
  - survey_client: 1.14.0
  - suspicious_login: 4.4.0
  - systemtags: 1.16.0
  - tasks: 0.15.0
  - text: 3.7.2
  - theming: 2.1.1
  - twofactor_backupcodes: 1.15.0
  - updatenotification: 1.16.0
  - user_ldap: 1.16.0
  - user_status: 1.6.0
  - viewer: 1.10.0
  - weather_status: 1.6.0
  - workflowengine: 2.8.0
Disabled:
  - announcementcenter: 6.6.1 (installed 6.6.1)
  - circles: 26.0.0 (installed 23.0.0)
  - encryption: 2.14.0
  - keeweb: 0.6.12 (installed 0.6.12)
  - passwords: 2023.4.30 (installed 2023.4.30)
  - passwords_handbook: 2023.4.20 (installed 2023.4.20)
  - twofactor_totp: 8.0.0

Nextcloud Signing status

No errors have been found.

Nextcloud Logs

[cron] Error: TypeError: OC\Files\Node\HookConnector::getNodeForPath(): Argument #1 ($path) must be of type string, null given, called in /var/www/nextcloud/lib/private/Files/Node/HookConnector.php on line 182 at <<closure>>

0. /var/www/nextcloud/lib/private/Files/Node/HookConnector.php line 182
   OC\Files\Node\HookConnector->getNodeForPath()
1. /var/www/nextcloud/lib/private/legacy/OC_Hook.php line 105
   OC\Files\Node\HookConnector->rename()
2. /var/www/nextcloud/lib/private/Files/View.php line 789
   OC_Hook::emit()
3. /var/www/nextcloud/apps/files/lib/Service/OwnershipTransferService.php line 378
   OC\Files\View->rename()
4. /var/www/nextcloud/apps/files/lib/Service/OwnershipTransferService.php line 179
   OCA\Files\Service\OwnershipTransferService->transferFiles()
5. /var/www/nextcloud/apps/files/lib/BackgroundJob/TransferOwnership.php line 115
   OCA\Files\Service\OwnershipTransferService->transfer()
6. /var/www/nextcloud/lib/public/BackgroundJob/Job.php line 78
   OCA\Files\BackgroundJob\TransferOwnership->run()
7. /var/www/nextcloud/lib/public/BackgroundJob/QueuedJob.php line 57
   OCP\BackgroundJob\Job->start()
8. /var/www/nextcloud/lib/public/BackgroundJob/QueuedJob.php line 47
   OCP\BackgroundJob\QueuedJob->start()
9. /var/www/nextcloud/cron.php line 152
   OCP\BackgroundJob\QueuedJob->execute()

at 2023-06-19T09:30:02+00:00

Additional info

No response

kizzo89 avatar Jun 19 '23 10:06 kizzo89

Please find the entry for HookConnector::getNodeForPath in your data/nextcloud.log to get the full entry and its trace (JSON formated).

solracsf avatar Jun 20 '23 07:06 solracsf

Here's the relevant entry from the logfile:

{
  "reqId": "jpkhTf97waH0X8jTHTQg",
  "level": 3,
  "time": "2023-06-19T09:00:02+00:00",
  "remoteAddr": "",
  "user": "--",
  "app": "cron",
  "method": "",
  "url": "--",
  "message": "OC\\Files\\Node\\HookConnector::getNodeForPath(): Argument #1 ($path) must be of type string, null given, called in /var/www/nextcloud/lib/private/Files/Node/HookConnector.php on line 182",
  "userAgent": "--",
  "version": "26.0.2.1",
  "exception": {
    "Exception": "TypeError",
    "Message": "OC\\Files\\Node\\HookConnector::getNodeForPath(): Argument #1 ($path) must be of type string, null given, called in /var/www/nextcloud/lib/private/Files/Node/HookConnector.php on line 182",
    "Code": 0,
    "Trace": [
      {
        "file": "/var/www/nextcloud/lib/private/Files/Node/HookConnector.php",
        "line": 182,
        "function": "getNodeForPath",
        "class": "OC\\Files\\Node\\HookConnector",
        "type": "->"
      },
      {
        "file": "/var/www/nextcloud/lib/private/legacy/OC_Hook.php",
        "line": 105,
        "function": "rename",
        "class": "OC\\Files\\Node\\HookConnector",
        "type": "->"
      },
      {
        "file": "/var/www/nextcloud/lib/private/Files/View.php",
        "line": 789,
        "function": "emit",
        "class": "OC_Hook",
        "type": "::"
      },
      {
        "file": "/var/www/nextcloud/apps/files/lib/Service/OwnershipTransferService.php",
        "line": 378,
        "function": "rename",
        "class": "OC\\Files\\View",
        "type": "->"
      },
      {
        "file": "/var/www/nextcloud/apps/files/lib/Service/OwnershipTransferService.php",
        "line": 179,
        "function": "transferFiles",
        "class": "OCA\\Files\\Service\\OwnershipTransferService",
        "type": "->"
      },
      {
        "file": "/var/www/nextcloud/apps/files/lib/BackgroundJob/TransferOwnership.php",
        "line": 115,
        "function": "transfer",
        "class": "OCA\\Files\\Service\\OwnershipTransferService",
        "type": "->"
      },
      {
        "file": "/var/www/nextcloud/lib/public/BackgroundJob/Job.php",
        "line": 78,
        "function": "run",
        "class": "OCA\\Files\\BackgroundJob\\TransferOwnership",
        "type": "->"
      },
      {
        "file": "/var/www/nextcloud/lib/public/BackgroundJob/QueuedJob.php",
        "line": 57,
        "function": "start",
        "class": "OCP\\BackgroundJob\\Job",
        "type": "->"
      },
      {
        "file": "/var/www/nextcloud/lib/public/BackgroundJob/QueuedJob.php",
        "line": 47,
        "function": "start",
        "class": "OCP\\BackgroundJob\\QueuedJob",
        "type": "->"
      },
      {
        "file": "/var/www/nextcloud/cron.php",
        "line": 152,
        "function": "execute",
        "class": "OCP\\BackgroundJob\\QueuedJob",
        "type": "->"
      }
    ],
    "File": "/var/www/nextcloud/lib/private/Files/Node/HookConnector.php",
    "Line": 229,
    "CustomMessage": "--"
  }
}

FYI, background jobs are running under cron. Let me know if you need more info. Thanks.

kizzo89 avatar Jun 20 '23 09:06 kizzo89

I can reproduce with current master.

miaulalala avatar Jun 26 '23 14:06 miaulalala

We're seeing the same issue on 26.0.2.

kernstock avatar Jun 28 '23 08:06 kernstock

cc @come-nc

szaimen avatar Jun 28 '23 08:06 szaimen

We're seeing the same issue on 26.0.2.

Same here, migrated to 26.0.2 this morning, Error occurred 2 times until now. Just checked: Transfer does not work "Transferred from"-folder is created but does not contain the respective files.

Volker-K avatar Jun 28 '23 10:06 Volker-K

The problem is this line:

https://github.com/nextcloud/server/blob/75d5fa41155e8d2804b273d42786306af2969ca4/lib/private/Files/View.php#L171

It compares the root of the file path with the views fake root, and that fails for the transferring user.

User Alice (transferring) has path /files/alice/ and user Bob (receiving) has /files/bob/ASuperLongFilePath, so the string comparison fails.

miaulalala avatar Jul 03 '23 15:07 miaulalala

Possibly a regression from https://github.com/nextcloud/server/pull/36774

miaulalala avatar Jul 03 '23 20:07 miaulalala

Using $view->copy() and $view->deleteAll() instead of $view->rename() works but it feels insecure as it could lead to data loss. It also triggers an activity email that could lead to a lot of confusion:

image

Even though "remote user" is just a placeholder for the cron user doing its thing, it still could lead people to think someone nefarious has access to the system.

miaulalala avatar Jul 04 '23 09:07 miaulalala