[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
⚠️ This issue respects the following points: ⚠️
- [X] This is a bug, not a question or a configuration/webserver/proxy issue.
- [X] This issue is not already reported on Github OR Nextcloud Community Forum (I've searched it).
- [X] Nextcloud Server is up to date. See Maintenance and Release Schedule for supported versions.
- [X] I agree to follow Nextcloud's Code of Conduct.
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
- Upload a file requested by other user. (Test file used was around 60 kB.)
- Go to Personal Settings -> Sharing.
- Click Choose file or folder to transfer. Select file.
- Select other user in New Owner box. Click button Transfer
to . - UI popup shows Ownership transfer request sent.
- 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.)
- 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
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
Please find the entry for HookConnector::getNodeForPath in your data/nextcloud.log to get the full entry and its trace (JSON formated).
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.
I can reproduce with current master.
We're seeing the same issue on 26.0.2.
cc @come-nc
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.
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.
Possibly a regression from https://github.com/nextcloud/server/pull/36774
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:
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.