Skip to content

[Bug]: Dropbox backup uploads empty files (10 bytes) due to Blade template escaping #1073

@nathanraposo

Description

@nathanraposo

Installation Type *

VPS

Vito Version *

3.16.0

Describe the Bug *

Database backups to Dropbox storage provider upload empty/placeholder files (10 bytes) instead of the actual backup ZIP files. The backup ZIP is created correctly on the server (~80KB), but the Dropbox API receives the literal string {{ $src }} (10 bytes) instead of the file contents.
Root Cause: In resources/views/ssh/storage/dropbox/upload.blade.php, the @ symbol before {{ $src }} in the --data-binary flag is interpreted by Blade as an escape directive, which prevents the variable from being rendered.
blade# Current code (broken):
--data-binary '@{{ $src }}'

Fixed code:

--data-binary '{{ "@" . $src }}'
Blade interprets @{{ $src }} as "output the literal text {{ $src }}" instead of rendering the variable. By moving the @ inside the Blade expression and concatenating it with $src, the template correctly renders to @/path/to/backup.zip.

Steps to Reproduce *

  1. Install Vito Deploy 3.16 on a VPS (Ubuntu 24.04)
  2. Install PostgreSQL and create a database
  3. Connect a Dropbox storage provider with a valid API token
  4. Create a database backup targeting Dropbox
  5. Run the backup
  6. Check the uploaded file on Dropbox — it will be 10 bytes instead of the actual backup size (~80KB)

Expected Behavior *

Backup ZIP file (~80KB+) should be uploaded to Dropbox with the correct file contents.

Logs *

Upload log (storage/app/server-logs/*-upload-to-dropbox.log):
{"name": "namira-20260422030604.zip", "path_lower": "/namira/namira-20260422030604.zip", "size": 10, "content_hash": "443c22832cbf836141d9216a42fd64e1aeb1cb5f0dcd87eaf1a91863d7afd2ad"}

Key evidence:

  • "size": 10 — Dropbox received only 10 bytes
  • The content_hash is identical across all broken uploads, confirming the same placeholder text {{ $src }} is sent every time
  • Backup file on server: 81KB (correct)
  • Same file uploaded via manual curl: 80KB (correct)
  • File uploaded by Vito: 10 bytes (broken)

Screenshots

No response

Additional Context

Environment:

  • Vito version: 3.16
  • OS: Ubuntu 24.04
  • PHP: 8.4.15
  • Database: PostgreSQL
  • Storage Provider: Dropbox

Affected File:
resources/views/ssh/storage/dropbox/upload.blade.php

Suggested Fix:
curl -sb --location --request POST 'https://content.dropboxapi.com/2/files/upload' \ --header 'Accept: application/json' \ --header 'Dropbox-API-Arg: {"path":"{{ $dest }}"}' \ --header 'Content-Type: application/octet-stream' \ --header 'Authorization: Bearer {{ $token }}' \ ---data-binary '@{{ $src }}' +--data-binary '{{ "@" . $src }}'

Workaround:
sudo -u vito sed -i "s|--data-binary '@{{ \$src }}'|--data-binary '{{ \"@\" . \$src }}'|" /home/vito/vito/resources/views/ssh/storage/dropbox/upload.blade.php php artisan view:clear

Note: This bug was found on version 3.16. It has not been verified whether it persists on the latest version (3.21.2). No release notes between 3.16 and 3.21.2 mention a Dropbox upload fix, so the issue may still be present.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions