• Hey all– as some have noted, this plugin doesn’t work under PHP 7. Typically it complains that it’s having trouble uploading to Dropbox, and logs show a bad Dropbox API with an unexpected “overwrite” parameter.

    Presumably the author will update this sooner or later; for the time being, here’s a quick source code tweak that made it work for me. All paths are relative to $YOUR_SITE_DIRECTORY/wp-content/plugins/wordpress-backup-to-dropbox.

    In file Dropbox/Dropbox/OAuth/Consumer/Curl.php: comment out the line:
    $options[CURLOPT_SAFE_UPLOAD] = false;
    (this option is no longer valid in PHP 7)

    In file Dropbox/Dropbox/OAuth/Consumer/ConsumerAbstract.php: replace the test if (isset($value[0]) && $value[0] === '@') with if ($value instanceof CURLFile)

    In file Dropbox/Dropbox/API.php: replace 'file' => '@' . str_replace('\\', '/', $file) . ';filename=' . $filename with 'file' => new CURLFile(str_replace('\\', '/', $file), "application/octet-stream", $filename)

    This replaces the long-deprecated, now-disabled support for uploading files with “@/file/to/upload” with the replacement “CURLFile” class. Also a note to the author (and optional patch for the reader): check the return value for curl_setopt_array, as this was failing unnoticed, leading to confusing behaviour downstream.

Viewing 14 replies - 1 through 14 (of 14 total)
  • Thanks a lot, that worked in PHP 7.1!

    charliejustus

    (@charliejustus)

    Apologies for the noob question but can you use this on the plugin zip file and then upload it? Also how do you check the return value?

    Thread Starter smowton

    (@smowton)

    Yeah if you’ve got some scheme like you have to upload a zip and then the server unpacks it for you? Then it should suffice to unzip, make the tweaks, zip back up and upload.

    Checking curl_setopt_array is like:

    if(curl_setopt_array(/* arguments here */) === FALSE)
    die(“curl_setopt_array failed!”);

    Thread Starter smowton

    (@smowton)

    See also https://php.net/manual/en/function.curl-setopt-array.php which describes the function and its error behaviour

    charliejustus

    (@charliejustus)

    Thanks for that, I’m a scripting novice so any help on how I should set up the check with reference to Dropbox etc would be amazing. I had a look at the php.net link and it didn’t make sense to me in terms of items that could be causing the script to fail.

    Thread Starter smowton

    (@smowton)

    Not sure what you mean by setting up the check? Could you elaborate a bit?

    charliejustus

    (@charliejustus)

    You wrote the code that had the section /* arguments here */

    I was wondering what arguments I would need to be putting in there to check everything is running as it should be.

    Thread Starter smowton

    (@smowton)

    Ah I see, those are the existing arguments to the call– in the source for wpb2d, in the existing file Dropbox/Dropbox/OAuth/Consumer/Curl.php we see:

    curl_setopt_array($handle, $options);

    That call is unchecked, in that its return value is discarded (ignored). A checked equivalent is:

    
    if(curl_setopt_array($handle, $options) === FALSE)
      throw new Exception("curl_setopt_array failed!");
    

    So we have kept the same arguments (inputs) the original call, $handle, $options, but wrapped it in the if(... === FALSE) test that determines whether it succeeded or not. In the existing wpb2d code, with PHP 7 it was failing due to an invalid argument, but that was going un-noticed because this check was missing. With the check in place, we will get an explicit message if it fails.

    • This reply was modified 8 years ago by smowton.
    charliejustus

    (@charliejustus)

    Ah cool! So do I need to go through all of the php for unchecked items? Or is that the one that seems to giving the most problems.

    Thread Starter smowton

    (@smowton)

    There is just this one call in wpb2d– every function that wants to make a Dropbox API request delegates to this function, so there is only one site where the change is necessary.

    charliejustus

    (@charliejustus)

    Outstanding! Thank you so much for walking me through that.

    Hi Guys,

    I’m getting this error message when I upload the amended plugin folder. I can’t understand why i’m getting this error as everything looks right to me.

    Parse error: syntax error, unexpected ”overwrite” (T_CONSTANT_ENCAPSED_STRING), expecting ‘)’ in /home/mawebfaction/webapps/naked/wp-content/plugins/wordpress-backup-to-dropbox/Dropbox/Dropbox/API.php on line 108

    This is the entire section. Is there anything out of place?

    public function putFile($file, $filename = false, $path = ”, $overwrite = true)
    {
    if (file_exists($file)) {
    if (filesize($file) <= 157286400) {
    $call = ‘files/’ . $this->root . ‘/’ . $this->encodePath($path);
    // If no filename is provided we’ll use the original filename
    $filename = (is_string($filename)) ? $filename : basename($file);
    $params = array(
    ‘filename’ => $filename,
    ‘file’ => new CURLFile(str_replace(‘\\’, ‘/’, $file), “application/octet-stream”, $filename)
    ‘overwrite’ => (int) $overwrite,
    );

    return $this->fetch(‘POST’, self::CONTENT_URL, $call, $params);

    }
    throw new Exception(‘File exceeds 150MB upload limit’);
    }

    Thread Starter smowton

    (@smowton)

    Missing comma after “$filename)” (immediately before ‘overwrite’ => …)

    Thanks man!

Viewing 14 replies - 1 through 14 (of 14 total)
  • The topic ‘How to tweak this plugin for PHP 7’ is closed to new replies.