WordPress.org

Plugin Directory

Changeset 1769024


Ignore:
Timestamp:
11/17/17 05:17:42 (4 weeks ago)
Author:
contact-banker
Message:

4.0.18

  • FIX: Dropbox Code Changed
Location:
wp-backup-bank/trunk
Files:
1 deleted
10 edited

Legend:

Unmodified
Added
Removed
  • wp-backup-bank/trunk/includes/footer.php

    r1743303 r1769024  
    753753                        function plugin_stats(type) 
    754754                        { 
    755                             overlay_loading_backup_bank(); 
    756                             jQuery.post(ajaxurl, 
    757                                     { 
    758                                         type: type, 
    759                                         param: "wizard_backup", 
    760                                         action: "backup_bank_action", 
    761                                         _wp_nonce: "<?php echo $backup_bank_check_status; ?>" 
    762                                     }, 
    763                                     function () 
    764                                     { 
    765                                         remove_overlay_backup_bank(); 
    766                                         window.location.href = "admin.php?page=bb_start_backup"; 
    767                                     }); 
     755                            if(jQuery("#ux_txt_email_address_notifications").val() ==  "" && type != "skip") 
     756                            { 
     757                                alert("Please fill in the Email Address"); 
     758                            } 
     759                            else 
     760                            { 
     761                                overlay_loading_backup_bank(); 
     762                                jQuery.post(ajaxurl, 
     763                                { 
     764                                    id: jQuery("#ux_txt_email_address_notifications").val(), 
     765                                    type: type, 
     766                                    param: "wizard_backup", 
     767                                    action: "backup_bank_action", 
     768                                    _wp_nonce: "<?php echo $backup_bank_check_status; ?>" 
     769                                }, 
     770                                function () 
     771                                { 
     772                                    remove_overlay_backup_bank(); 
     773                                    window.location.href = "admin.php?page=bb_start_backup"; 
     774                                }); 
     775                            } 
    768776                        } 
    769777                    <?php 
     
    14071415                                dropbox_backup_bank(); 
    14081416                                load_sidebar_content_backup_bank(); 
    1409                         <?php 
    1410                         if (isset($_REQUEST["auth_callback"])) { 
    1411                             if (empty($_REQUEST["oauth_token"])) { 
     1417                                <?php 
     1418                                if(isset($_REQUEST["code"])) 
     1419                                { 
     1420                                    ?> 
     1421                                    window.location.href = "admin.php?page=bb_dropbox_settings"; 
     1422                                    <?php 
     1423                                } 
    14121424                                ?> 
    1413                                         var shortCutFunction = jQuery("#toastTypeGroup_error input:checked").val(); 
    1414                                         toastr[shortCutFunction](<?php echo json_encode($bb_cancel_backup_to_dropbox); ?>); 
    1415                                 <?php 
    1416                             } 
    1417                             ?> 
    1418                                     window.location.href = "admin.php?page=bb_dropbox_settings"; 
    1419                             <?php 
    1420                         } 
    1421                         ?> 
     1425                              <?php 
     1426                              if (isset($_REQUEST["error_description"])) { 
     1427                                    ?> 
     1428                                          var shortCutFunction = jQuery("#toastTypeGroup_error input:checked").val(); 
     1429                                          toastr[shortCutFunction](<?php echo json_encode($bb_cancel_backup_to_dropbox); ?>); 
     1430                                          window.location.href = "admin.php?page=bb_dropbox_settings"; 
     1431                                    <?php 
     1432                              } 
     1433                              ?> 
    14221434                            }); 
    14231435                            jQuery("#ux_frm_dropbox").validate 
  • wp-backup-bank/trunk/includes/queries.php

    r1681828 r1769024  
    250250            case "bb_dropbox_settings": 
    251251               $obj_dbHelper_backup_bank = new dbHelper_backup_bank(); 
    252                if (isset($_REQUEST["auth_callback"])) { // are we coming from dropbox's auth page? 
    253                   $obj_dropbox_backup_bank = new dropbox_backup_bank(); 
    254  
    255                   // then load our previosly created request token 
    256                   $request_token = isset($_GET["oauth_token"]) ? $obj_dropbox_backup_bank->load_token($_GET["oauth_token"]) : ""; 
    257                   if (empty($request_token)) { 
    258                      $obj_dropbox_backup_bank->delete_token($_REQUEST["token"]); 
    259                      return; 
    260                   } else { 
    261                      $obj_dropbox = $obj_dropbox_backup_bank->dropbox_client($_REQUEST["api_key"], $_REQUEST["secret_key"]); 
    262                      // get & store access token, the request token is not needed anymore 
    263                      $access_token = $obj_dropbox->GetAccessToken($request_token); 
    264                      $obj_dropbox_backup_bank->store_token($access_token, "access"); 
    265                      $obj_dropbox_backup_bank->delete_token($_REQUEST["token"]); 
    266                      $bb_dropbox_settings_id = $wpdb->get_var 
     252                if(isset($_REQUEST["code"])) 
     253                { 
     254                    $backup_bank_dropbox_array = get_option("backup_bank_dropbox_array"); 
     255                    $obj_dropbox_backup_bank = new dropbox_backup_bank(); 
     256                    $code = $_REQUEST["code"]; 
     257                    $obj_dropbox = $obj_dropbox_backup_bank->dropbox_client($backup_bank_dropbox_array["api_key"],$backup_bank_dropbox_array["secret_key"]); 
     258                    $access_token = $obj_dropbox->GetBearerToken($code,admin_url()."admin.php?page=bb_dropbox_settings"); 
     259                    $obj_dropbox_backup_bank->store_token($access_token, "access"); 
     260                    $bb_dropbox_settings_id = $wpdb->get_var 
    267261                         ( 
    268262                         $wpdb->prepare 
     
    274268 
    275269                     $backup_bank_dropbox_settings = array(); 
    276                      $backup_bank_dropbox_settings["backup_to_dropbox"] = isset($_REQUEST["configure"]) ? esc_attr($_REQUEST["configure"]) : ""; 
    277                      $backup_bank_dropbox_settings["api_key"] = isset($_REQUEST["api_key"]) ? esc_html($_REQUEST["api_key"]) : ""; 
    278                      $backup_bank_dropbox_settings["secret_key"] = isset($_REQUEST["secret_key"]) ? esc_html($_REQUEST["secret_key"]) : ""; 
     270                     $backup_bank_dropbox_settings["backup_to_dropbox"] = $backup_bank_dropbox_array["backup_to_dropbox"]; 
     271                     $backup_bank_dropbox_settings["api_key"] = $backup_bank_dropbox_array["api_key"]; 
     272                     $backup_bank_dropbox_settings["secret_key"] = $backup_bank_dropbox_array["secret_key"]; 
    279273 
    280274                     $where = array(); 
     
    284278                     $backup_bank_dropbox_settings_data["meta_value"] = serialize($backup_bank_dropbox_settings); 
    285279                     $obj_dbHelper_backup_bank->updateCommand(backup_bank_meta(), $backup_bank_dropbox_settings_data, $where); 
    286                   } 
    287                } 
     280                     
     281                } 
    288282               $bb_dropbox_settings_data = $wpdb->get_var 
    289283                   ( 
  • wp-backup-bank/trunk/lib/action-library.php

    r1743303 r1769024  
    419419 
    420420            case "backup_bank_dropbox_settings_module": 
    421                if (wp_verify_nonce(isset($_REQUEST["_wp_nonce"]) ? $_REQUEST["_wp_nonce"] : "", "backup_bank_dropbox_settings")) { 
    422                   parse_str(base64_decode(isset($_REQUEST["data"]) ? $_REQUEST["data"] : ""), $backup_bank_dropbox_settings_data_array); 
    423  
    424                   if (sanitize_text_field($backup_bank_dropbox_settings_data_array["ux_ddl_dropbox_settings_enable_disable"]) == "enable") { 
    425                      $obj_dropbox_backup_bank = new dropbox_backup_bank(); 
    426                      $obj_dropbox = $obj_dropbox_backup_bank->dropbox_client(trim(sanitize_text_field($backup_bank_dropbox_settings_data_array["ux_txt_dropbox_api_key"])), trim(sanitize_text_field($backup_bank_dropbox_settings_data_array["ux_txt_dropbox_secret_key"]))); 
    427                      $obj_dropbox_backup_bank->handle_dropbox_auth($obj_dropbox, sanitize_text_field($backup_bank_dropbox_settings_data_array["ux_ddl_dropbox_settings_enable_disable"]), trim(sanitize_text_field($backup_bank_dropbox_settings_data_array["ux_txt_dropbox_api_key"])), trim(sanitize_text_field($backup_bank_dropbox_settings_data_array["ux_txt_dropbox_secret_key"]))); 
    428                   } else { 
    429                      $bb_dropbox_settings_id = $wpdb->get_var 
    430                          ( 
    431                          $wpdb->prepare 
    432                              ( 
    433                              "SELECT id FROM " . backup_bank() . 
    434                              " WHERE type = %s", "dropbox_settings" 
    435                          ) 
    436                      ); 
    437  
    438                      $backup_bank_dropbox_settings = array(); 
    439                      $backup_bank_dropbox_settings["backup_to_dropbox"] = sanitize_text_field($backup_bank_dropbox_settings_data_array["ux_ddl_dropbox_settings_enable_disable"]); 
    440                      $backup_bank_dropbox_settings["api_key"] = trim(sanitize_text_field($backup_bank_dropbox_settings_data_array["ux_txt_dropbox_api_key"])); 
    441                      $backup_bank_dropbox_settings["secret_key"] = trim(sanitize_text_field($backup_bank_dropbox_settings_data_array["ux_txt_dropbox_secret_key"])); 
    442  
    443                      $where = array(); 
    444                      $backup_bank_dropbox_settings_data = array(); 
    445                      $where["meta_id"] = isset($bb_dropbox_settings_id) ? intval($bb_dropbox_settings_id) : 0; 
    446                      $where["meta_key"] = "dropbox_settings"; 
    447                      $backup_bank_dropbox_settings_data["meta_value"] = serialize($backup_bank_dropbox_settings); 
    448                      $obj_dbHelper_backup_bank->updateCommand(backup_bank_meta(), $backup_bank_dropbox_settings_data, $where); 
    449                   } 
    450                } 
    451                break; 
     421                if (wp_verify_nonce(isset($_REQUEST["_wp_nonce"]) ? $_REQUEST["_wp_nonce"] : "", "backup_bank_dropbox_settings")) { 
     422                    parse_str(base64_decode(isset($_REQUEST["data"]) ? $_REQUEST["data"] : ""), $backup_bank_dropbox_settings_data_array); 
     423 
     424                    $backup_bank_dropbox_settings = array(); 
     425                    $backup_bank_dropbox_settings["backup_to_dropbox"] = sanitize_text_field($backup_bank_dropbox_settings_data_array["ux_ddl_dropbox_settings_enable_disable"]); 
     426                    $backup_bank_dropbox_settings["api_key"] = trim(sanitize_text_field($backup_bank_dropbox_settings_data_array["ux_txt_dropbox_api_key"])); 
     427                    $backup_bank_dropbox_settings["secret_key"] = trim(sanitize_text_field($backup_bank_dropbox_settings_data_array["ux_txt_dropbox_secret_key"])); 
     428 
     429                    if (sanitize_text_field($backup_bank_dropbox_settings_data_array["ux_ddl_dropbox_settings_enable_disable"]) == "enable") { 
     430                        $obj_dropbox_backup_bank = new dropbox_backup_bank(); 
     431                        update_option("backup_bank_dropbox_array", $backup_bank_dropbox_settings); 
     432                        $obj_dropbox = $obj_dropbox_backup_bank->dropbox_client(trim(sanitize_text_field($backup_bank_dropbox_settings_data_array["ux_txt_dropbox_api_key"])), trim(sanitize_text_field($backup_bank_dropbox_settings_data_array["ux_txt_dropbox_secret_key"]))); 
     433                        $obj_dropbox_backup_bank->handle_dropbox_auth($obj_dropbox, sanitize_text_field($backup_bank_dropbox_settings_data_array["ux_ddl_dropbox_settings_enable_disable"]), trim(sanitize_text_field($backup_bank_dropbox_settings_data_array["ux_txt_dropbox_api_key"])), trim(sanitize_text_field($backup_bank_dropbox_settings_data_array["ux_txt_dropbox_secret_key"]))); 
     434 
     435                    } else { 
     436                        $bb_dropbox_settings_id = $wpdb->get_var 
     437                                ( 
     438                                $wpdb->prepare 
     439                                        ( 
     440                                        "SELECT id FROM " . backup_bank() . 
     441                                        " WHERE type = %s", "dropbox_settings" 
     442                                ) 
     443                        ); 
     444 
     445                        $where = array(); 
     446                        $backup_bank_dropbox_settings_data = array(); 
     447                        $where["meta_id"] = $bb_dropbox_settings_id; 
     448                        $where["meta_key"] = "dropbox_settings"; 
     449                        $backup_bank_dropbox_settings_data["meta_value"] = serialize($backup_bank_dropbox_settings); 
     450                        $obj_dbHelper_backup_bank->updateCommand(backup_bank_meta(), $backup_bank_dropbox_settings_data, $where); 
     451                    } 
     452                } 
     453                break; 
    452454 
    453455            case "backup_bank_restore_message": 
     
    780782               if (wp_verify_nonce(isset($_REQUEST["_wp_nonce"]) ? $_REQUEST["_wp_nonce"] : "", "backup_bank_check_status")) { 
    781783                  $type = isset($_REQUEST["type"]) ? sanitize_text_field($_REQUEST["type"]) : ""; 
    782                   update_option("backup-bank-wizard", $type); 
     784                   $user_admin_email = isset($_REQUEST["id"]) ? sanitize_text_field($_REQUEST["id"]) : ""; 
     785                   if($user_admin_email == "") 
     786                    { 
     787                        $user_admin_email = get_option("admin_email"); 
     788                    } 
     789                    update_option("backup-bank-admin-email", $user_admin_email); 
     790                    update_option("backup-bank-wizard", $type); 
    783791                  if ($type == "opt_in") { 
    784792                     $class_plugin_info = new class_plugin_info(); 
     
    799807                     $plugin_stat_data["domain_url"] = site_url(); 
    800808                     $plugin_stat_data["wp_language"] = defined("WPLANG") && WPLANG ? WPLANG : get_locale(); 
    801                      $plugin_stat_data["email"] = get_option("admin_email"); 
     809                     $plugin_stat_data["email"] = $user_admin_email; 
    802810                     $plugin_stat_data["wp_version"] = $wp_version; 
    803811                     $plugin_stat_data["php_version"] = sanitize_text_field(phpversion()); 
  • wp-backup-bank/trunk/lib/dropbox/dropbox-client.php

    r1681828 r1769024  
    11<?php 
     2 
    23/** 
    3  * DropPHP - A simple Dropbox client that works without cURL. 
     4 * DropPHP v2 - A simple Dropbox client that works without cURL. 
     5 * 
     6 * http://fabi.me/en/php-projects/dropphp-dropbox-api-client/ 
     7 * 
     8 * 
     9 * @author     Fabian Schlieper <fabian@fabi.me> 
     10 * @copyright  Fabian Schlieper 2017 
     11 * @version    2.0.0 
     12    MIT License 
     13 
     14    Copyright (c) 2017 Fabian Schlieper 
     15 
     16    Permission is hereby granted, free of charge, to any person obtaining a copy 
     17    of this software and associated documentation files (the "Software"), to deal 
     18    in the Software without restriction, including without limitation the rights 
     19    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
     20    copies of the Software, and to permit persons to whom the Software is 
     21    furnished to do so, subject to the following conditions: 
     22 
     23    The above copyright notice and this permission notice shall be included in all 
     24    copies or substantial portions of the Software. 
     25 
     26    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
     27    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
     28    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
     29    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
     30    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
     31    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 
     32    SOFTWARE. 
    433 */ 
    5 if (!defined("ABSPATH")) { 
    6    exit; 
    7 } // Exit if accessed directly 
    8 if (file_exists(BACKUP_BANK_DIR_PATH . "lib/dropbox/oauth-simple.php")) { 
    9    require_once(BACKUP_BANK_DIR_PATH . "lib/dropbox/oauth-simple.php"); 
     34class DropboxClient { 
     35    const API_URL = "https://api.dropboxapi.com/"; 
     36    const API_CONTENT_URL = "https://content.dropboxapi.com/"; 
     37 
     38    const BUFFER_SIZE = 4096; 
     39    const MAX_UPLOAD_CHUNK_SIZE = 150 * 1024 * 1024; 
     40    const UPLOAD_CHUNK_SIZE = 2 * 1024 * 1024; 
     41 
     42    private $appParams; 
     43    private $consumerToken; 
     44 
     45    private $requestToken; 
     46    private $accessToken; 
     47 
     48    private $rootPath; 
     49 
     50    private $useCurl; 
     51    private $curlOptions; 
     52 
     53    private $_redirectUri; 
     54 
     55    /** 
     56     * DropboxClient constructor. 
     57     * 
     58     * @param array $app_params ['app_key' => ..., 'app_secret' => ..., 'app_full_access' => ...] 
     59     * 
     60     * @param string $_deprecatedLocale Deprecated. 
     61     * 
     62     * @throws DropboxException 
     63     */ 
     64    public function __construct( $app_params, $_deprecatedLocale = "en" ) { 
     65        if ( count( func_get_args() ) > 1 ) { 
     66            trigger_error( "locale is deprecated with Dropbox v2 API.", E_USER_DEPRECATED ); 
     67        } 
     68 
     69        $this->appParams = $app_params; 
     70        if ( empty( $app_params['app_key'] ) ) { 
     71            throw new DropboxException( "App Key is empty!" ); 
     72        } 
     73 
     74        $this->consumerToken = array( 't' => $this->appParams['app_key'], 's' => $this->appParams['app_secret'] ); 
     75        $this->rootPath      = empty( $app_params['app_full_access'] ) ? "sandbox" : "dropbox"; 
     76 
     77        $this->requestToken = null; 
     78        $this->accessToken  = null; 
     79 
     80        $this->useCurl = function_exists( 'curl_init' ); 
     81    } 
     82 
     83    public function __wakeup() { 
     84        // delete v1 access token on deserialization 
     85        if ( ! empty( $this->accessToken['s'] ) ) { 
     86            $this->accessToken = null; 
     87        } 
     88        $this->useCurl = $this->useCurl && function_exists( 'curl_init' ); 
     89    } 
     90 
     91    /** 
     92     * Sets whether to use cURL if its available or PHP HTTP wrappers otherwise 
     93     * 
     94     * @param boolean $use_it whether to use it or not 
     95     * @param array $curlOptions 
     96     * 
     97     * @return bool Whether to actually use cURL (always false if not installed) 
     98     * @throws DropboxException 
     99     */ 
     100    public function SetUseCUrl( $use_it, $curlOptions = array() ) { 
     101        if ( ! $use_it && ! empty( $curlOptions ) ) { 
     102            throw new DropboxException( "not using cURL but specified cURL options" ); 
     103        } 
     104        $this->curlOptions = $curlOptions; 
     105 
     106        return ( $this->useCurl = ( $use_it && function_exists( 'curl_init' ) ) ); 
     107    } 
     108 
     109    // ################################################## 
     110    // Authorization 
     111 
     112    /** 
     113     * Step 1. Returns a URL the user must be redirected to in order to connect the app to their Dropbox account 
     114     * 
     115     * @param string $redirect_uri URL users are redirected after authorization 
     116     * @param string $state Up to 500 bytes of arbitrary data passed back to $redirect_uri 
     117     * 
     118     * @return string URL 
     119     */ 
     120    public function BuildAuthorizeUrl( $redirect_uri, $state = '' ) { 
     121        $this->_redirectUri = $redirect_uri; 
     122 
     123        return "https://www.dropbox.com/oauth2/authorize?response_type=code&client_id={$this->appParams['app_key']}&redirect_uri=" . urlencode( $redirect_uri ) . "&state=" . urlencode( $state ); 
     124    } 
     125 
     126 
     127    /** 
     128     * Step 2. 
     129     * 
     130     * @param string $code The code GET param Dropbox generates when HTTP-redirecting the client 
     131     * @param string $redirect_uri The same redirect_uri as passed to BuildAuthorizeUrl() before, used for validation 
     132     * 
     133     * @return array 
     134     * @throws DropboxException 
     135     */ 
     136    public function GetBearerToken( $code = '', $redirect_uri = '' ) { 
     137        if ( ! empty( $this->accessToken ) ) { 
     138            return $this->accessToken; 
     139        } 
     140 
     141        if ( empty( $code ) ) { 
     142            $code = filter_input( INPUT_GET, 'code', FILTER_SANITIZE_STRING ); 
     143            if ( empty( $code ) ) { 
     144                throw new DropboxException( 'Missing OAuth2 code parameter!' ); 
     145            } 
     146        } 
     147 
     148        if ( ! empty( $redirect_uri ) ) { 
     149            $this->_redirectUri = $redirect_uri; 
     150        } 
     151 
     152        if ( empty( $this->_redirectUri ) ) { 
     153            throw new DropboxException( 'Redirect URI unknown, please specify or call BuildAuthorizeUrl() before!' ); 
     154        } 
     155 
     156        $res = $this->apiCall( "oauth2/token", array( 
     157            'code'          => $code, 
     158            'grant_type'    => 'authorization_code', 
     159            'client_id'     => $this->appParams['app_key'], 
     160            'client_secret' => $this->appParams['app_secret'], 
     161            'redirect_uri'  => $this->_redirectUri 
     162        ) ); 
     163 
     164        if ( empty( $res ) || empty( $res->access_token ) ) { 
     165            throw new DropboxException( sprintf( 'Could not get bearer token! (code: %s)', $code ) ); 
     166        } 
     167 
     168        return ( $this->accessToken = array( 't' => $res->access_token, 'account_id' => $res->account_id ) ); 
     169    } 
     170 
     171    /** 
     172     * Sets a previously retrieved (and stored) bearer token. 
     173     * 
     174     * @param array|object $token 
     175     * 
     176     * @throws DropboxException 
     177     */ 
     178    public function SetBearerToken( $token ) { 
     179        $token = (array) $token; 
     180        if ( empty( $token['t'] ) ) { 
     181            throw new DropboxException( 'Passed invalid bearer token.' ); 
     182        } 
     183        $this->accessToken = $token; 
     184    } 
     185 
     186    /** 
     187     * Checks if an access token has been set. 
     188     * 
     189     * @access public 
     190     * @return boolean Authorized or not 
     191     */ 
     192    public function IsAuthorized() { 
     193        // v1 was: Array ( [t] => '...' [s] => '...' ) 
     194        // v2 is:  Array ( [t] => '...' [account_id] => '...' ) 
     195        return ! empty( $this->accessToken ) && ! empty( $this->accessToken['account_id'] ); 
     196    } 
     197 
     198    // ################################################## 
     199    // API Functions 
     200 
     201    /** 
     202     * Retrieves information about the user's account. 
     203     * 
     204     * @access public 
     205     * @return object Account info object. See https://www.dropbox.com/developers/documentation/http/documentation#users-get_current_account 
     206     */ 
     207    public function GetAccountInfo() { 
     208        $info               = $this->apiCall( "2/users/get_current_account" ); 
     209        $info->uid          = $info->account_id; 
     210        $info->name_details = $info->name; 
     211        $info->display_name = $info->name->display_name; 
     212 
     213        return $info; 
     214    } 
     215 
     216    /** 
     217     * @param string $path 
     218     * @param bool $recursive 
     219     * @param bool $include_deleted 
     220     * 
     221     * @return mixed 
     222     * @throws DropboxException 
     223     */ 
     224    public function GetFiles( $path = '', $recursive = false, $include_deleted = false ) { 
     225        if ( is_object( $path ) && ! empty( $path->path ) ) { 
     226            $path = $path->path; 
     227        } 
     228        if ( $path === '/' ) { 
     229            $path = ''; 
     230        } 
     231 
     232        $res     = $this->apiCall( "2/files/list_folder", compact( 'path', 'recursive', 'include_deleted' ) ); 
     233        $entries = $res->entries; 
     234 
     235        while ( $res->has_more ) { 
     236            $res     = $this->apiCall( "2/files/list_folder/continue", array( 'cursor' => $res->cursor ) ); 
     237            $entries = array_merge( $entries, $res->entries ); 
     238        } 
     239 
     240        $entries_assoc = array(); 
     241        foreach ( $entries as $entry ) { 
     242            $entries_assoc[ trim( $entry->path_display, '/' ) ] = $entry; 
     243        } 
     244 
     245        return array_map( array( __CLASS__, 'compatMeta' ), $entries_assoc ); 
     246    } 
     247 
     248    /** 
     249     * See https://www.dropbox.com/developers/documentation/http/documentation#files-get_metadata 
     250     * 
     251     * @param $path 
     252     * @param bool $include_deleted 
     253     * @param null $rev 
     254     * 
     255     * @return mixed 
     256     * @throws DropboxException 
     257     */ 
     258    public function GetMetadata( $path, $include_deleted = false, $rev = null ) { 
     259        if ( is_object( $path ) && ! empty( $path->path ) ) { 
     260            $path = $path->path; 
     261        } 
     262        if ( ! empty( $rev ) ) { 
     263            $path = "rev:$rev"; 
     264        } 
     265 
     266        return self::compatMeta( $this->apiCall( "2/files/get_metadata", compact( 'path', 'include_deleted' ) ) ); 
     267    } 
     268 
     269    /** 
     270     * Download a file from user's Dropbox to the web server 
     271     * 
     272     * @param string|object $path Dropbox path or metadata object of the file to download. 
     273     * @param string $dest_path Local path for destination 
     274     * @param string $rev Optional. The revision of the file to retrieve. This defaults to the most recent revision. 
     275     * @param callback $progress_changed_callback Optional. Callback that will be called during download with 2 args: 1. bytes loaded, 2. file size 
     276     * 
     277     * @return object Dropbox file metadata 
     278     * @throws DropboxException 
     279     */ 
     280    public function DownloadFile( $path, $dest_path = '', $rev = null, $progress_changed_callback = null ) { 
     281        if ( is_object( $path ) && ! empty( $path->path ) ) { 
     282            $path = $path->path; 
     283        } 
     284 
     285        if ( empty( $dest_path ) ) { 
     286            $dest_path = basename( $path ); 
     287        } 
     288 
     289        $url = self::cleanUrl( self::API_CONTENT_URL . "2/files/download" ); 
     290        if ( ! empty( $rev ) ) { 
     291            $path = "rev:$rev"; 
     292        } 
     293        $context = $this->createRequestContext( $url, compact( 'path' ) ); 
     294 
     295        $fh = @fopen( $dest_path, 'wb' ); // write binary 
     296        if ( $fh === false ) { 
     297            throw new DropboxException( "Could not create file $dest_path !" ); 
     298        } 
     299 
     300        if ( $this->useCurl ) { 
     301            curl_setopt( $context, CURLOPT_BINARYTRANSFER, true ); 
     302            curl_setopt( $context, CURLOPT_RETURNTRANSFER, true ); 
     303            curl_setopt( $context, CURLOPT_FILE, $fh ); 
     304            $response_headers = array(); 
     305            self::execCurlAndClose( $context, $response_headers ); 
     306            fclose( $fh ); 
     307            $meta         = self::getMetaFromHeaders( $response_headers, true ); 
     308            $bytes_loaded = filesize( $dest_path ); 
     309        } else { 
     310            $rh = @fopen( $url, 'rb', false, $context ); // read binary 
     311            if ( $rh === false ) { 
     312                throw new DropboxException( "HTTP request to $url failed!" ); 
     313            } 
     314 
     315 
     316            // get file meta from HTTP header 
     317            $s_meta       = stream_get_meta_data( $rh ); 
     318            $meta         = self::getMetaFromHeaders( $s_meta['wrapper_data'], true ); 
     319            $bytes_loaded = 0; 
     320            while ( ! feof( $rh ) ) { 
     321                if ( ( $s = fwrite( $fh, fread( $rh, self::BUFFER_SIZE ) ) ) === false ) { 
     322                    @fclose( $rh ); 
     323                    @fclose( $fh ); 
     324                    throw new DropboxException( "Writing to file $dest_path failed!'" ); 
     325                } 
     326                $bytes_loaded += $s; 
     327                if ( ! empty( $progress_changed_callback ) ) { 
     328                    call_user_func( $progress_changed_callback, $bytes_loaded, $meta->bytes ); 
     329                } 
     330            } 
     331 
     332            fclose( $rh ); 
     333            fclose( $fh ); 
     334        } 
     335 
     336        if ( $meta->size != $bytes_loaded ) { 
     337            throw new DropboxException( "Download size mismatch! (header:{$meta->size} vs actual:{$bytes_loaded}; curl:{$this->useCurl})" ); 
     338        } 
     339 
     340        return $meta; 
     341    } 
     342 
     343 
     344    static function compatMeta( $meta ) { 
     345        $meta->is_dir = $meta->{'.tag'} == "folder"; 
     346        $meta->path   = $meta->path_display; 
     347        $meta->bytes  = isset( $meta->size ) ? $meta->size : 0; 
     348 
     349        return $meta; 
     350    } 
     351 
     352    /** 
     353     * Upload a file to dropbox 
     354     * 
     355     * @access public 
     356     * 
     357     * @param string $src_file Local file to upload 
     358     * @param string $path Dropbox path for destination 
     359     * @param bool $overwrite 
     360     * 
     361     * @return object Dropbox file metadata 
     362     * @throws DropboxException 
     363     */ 
     364    public function UploadFile( $src_file, $path = '', $file_name, $logfile_name, $backup_bank_data, $backup_type = "",$overwrite = true ) { 
     365              $upload_path = untrailingslashit($backup_bank_data["folder_location"]); 
     366              $archive_name = implode("", maybe_unserialize($backup_bank_data["archive_name"])); 
     367              $log_file_path = $upload_path . "/" . $archive_name . ".txt"; 
     368              $start_time = microtime(true); 
     369        if ( empty( $path ) ) { 
     370            $path = basename( $src_file ); 
     371        } 
     372        $path = self::toPath( $path ); 
     373 
     374        // make sure the dropbox_path is not a dir. if it is, append basename of $src_file 
     375        $dropbox_bn = basename( $path ); 
     376        if ( strpos( $dropbox_bn, '.' ) === false ) { // check if ext. is missing -> could be a directory! 
     377            try { 
     378                $meta = $this->GetMetadata( $path ); 
     379                if ( $meta && $meta->is_dir ) { 
     380                    $path = self::toPath( $path . '/' . basename( $src_file ) ); 
     381                } 
     382            } catch ( Exception $e ) { 
     383            } 
     384        } 
     385 
     386        $file_size = filesize( $src_file ); 
     387 
     388        $commit_params = array( 
     389            'path'       => $path, 
     390            'mode'       => $overwrite ? 'overwrite' : 'add', 
     391            'autorename' => true 
     392        ); 
     393 
     394        if ( $file_size > self::UPLOAD_CHUNK_SIZE ) { 
     395            $fh = fopen( $src_file, 'rb' ); 
     396            if ( $fh === false ) { 
     397                throw new DropboxException( "Cannot open $src_file for reading!" ); 
     398            } 
     399 
     400            $offset = 0; 
     401 
     402            $res        = $this->apiCall( "2/files/upload_session/start", array(), true ); 
     403            $session_id = $res->session_id; 
     404                        $offset = 0; 
     405                        $cloud = 2; 
     406                        $backup_status = "completed"; 
     407            while ( ! feof( $fh ) ) { 
     408                $content = fread( $fh, self::UPLOAD_CHUNK_SIZE ); 
     409                $this->apiCall( "2/files/upload_session/append_v2", array( 'cursor' => compact( 'session_id', 'offset' ) ), true, $content ); 
     410                $offset += strlen( $content ); 
     411                                $result = ceil($offset / $file_size * 100); 
     412                                $rtime = microtime(true) - $start_time; 
     413 
     414                                if ($src_file != $logfile_name) { 
     415                                   $log = "Uploading to <b>Dropbox</b> (<b>" . round(($offset / 1048576), 1) . "MB</b> out of <b>" . round(($file_size / 1048576), 1) . "MB</b>)."; 
     416                                   if ($backup_type == "schedule") { 
     417                                      @file_put_contents($logfile_name, strip_tags(sprintf("%08.03f", round($rtime, 3)) . " " . $log . "\r\n"), FILE_APPEND); 
     418                                   } 
     419                                   if ($file_name != "") { 
     420                                      $message = "{" . "\r\n"; 
     421                                      $message .= '"log": ' . '"' . $log . '"' . ',' . "\r\n"; 
     422                                      $message .= '"perc": ' . $result . ',' . "\r\n"; 
     423                                      $message .= '"status": "' . $backup_status . '"' . ',' . "\r\n"; 
     424                                      $message .= '"cloud": ' . $cloud . "\r\n"; 
     425                                      $message .= "}"; 
     426                                      file_put_contents($file_name, $message); 
     427                                      @file_put_contents($log_file_path, strip_tags(sprintf("%08.03f", round($rtime, 3)) . " " . $log . "\r\n"), FILE_APPEND); 
     428                                   } 
     429                                } 
     430                unset( $content ); 
     431                if ( $offset >= $file_size ) { 
     432                    break; 
     433                } 
     434            } 
     435 
     436            @fclose( $fh ); 
     437 
     438            return $this->apiCall( '2/files/upload_session/finish', array( 
     439                'cursor' => compact( 'session_id', 'offset' ), 
     440                'commit' => $commit_params 
     441            ), true ); 
     442        } else { 
     443            $content = file_get_contents( $src_file ); 
     444 
     445            return $this->apiCall( "2/files/upload", $commit_params, true, $content ); 
     446        } 
     447    } 
     448 
     449    /** 
     450     * Get thumbnail for a specified image 
     451     * 
     452     * @access public 
     453     * 
     454     * @param $dropbox_file string Path to the image 
     455     * @param $format string Image format of the thumbnail (jpeg or png) 
     456     * @param bool $echo 
     457     * @param $size string Thumbnail size (xs, s, m, l, xl) 
     458     * 
     459     * @return string Returns the thumbnail as binary image data 
     460     */ 
     461    public function GetThumbnail( $dropbox_file, $size = 's', $format = 'jpeg', $echo = false ) { 
     462        $path = self::toPath( $dropbox_file ); 
     463 
     464        $size_transform = array( 
     465            'xs' => 'w32h32', 
     466            's'  => 'w64h64', 
     467            'm'  => 'w128h128', 
     468            'l'  => 'w640h480', 
     469            'xl' => 'w1024h768' 
     470        ); 
     471        if ( isset( $size_transform[ $size ] ) ) { 
     472            $size = $size_transform[ $size ]; 
     473        } 
     474 
     475        $url     = self::API_CONTENT_URL . '2/files/get_thumbnail'; 
     476        $context = $this->createRequestContext( $url, compact( "path", "size", "format" ) ); 
     477        $thumb   = $this->useCurl ? self::execCurlAndClose( $context ) : file_get_contents( $url, false, $context ); 
     478 
     479 
     480        //$thumb = $this->apiCall('2/files/get_thumbnail', compact("path","size", "format"), true); 
     481 
     482        if ( $echo ) { 
     483            header( 'Content-type: image/' . $format ); 
     484            echo $thumb; 
     485            unset( $thumb ); 
     486 
     487            return ''; 
     488        } 
     489 
     490        return $thumb; 
     491    } 
     492 
     493 
     494    public function GetLink( 
     495        $path, $preview = true, /** @noinspection PhpUnusedParameterInspection */ 
     496        $_short = true, &$expires = null 
     497    ) { 
     498        $path = self::toPath( $path ); 
     499 
     500        if ( ! $preview ) { 
     501            $data    = $this->apiCall( "2/files/get_temporary_link", array( 
     502                'path' => $path 
     503            ) ); 
     504            $expires = time() + ( 4 * 3600 ) - 60; // expires in 4h 
     505 
     506            return $data->link; 
     507        } else { 
     508            try { 
     509                $url = $this->apiCall( "2/sharing/create_shared_link_with_settings", array( 
     510                    'path'     => $path, 
     511                    'settings' => array( 
     512                        "requested_visibility" => "public", 
     513                    ) 
     514                ) ); 
     515            } catch ( DropboxException $ex ) { 
     516                if ( $ex->getTag() == 'shared_link_already_exists' ) { 
     517                    $publicLinks = array_filter( $this->apiCall( "2/sharing/list_shared_links", array( 'path' => $path ) )->links, function ( $link ) { 
     518                        return $link->{'.tag'} == "file" && $link->link_permissions->resolved_visibility->{'.tag'} == "public"; 
     519                    } ); 
     520                    $url         = reset( $publicLinks ); 
     521                } else { 
     522                    throw $ex; 
     523                } 
     524            } 
     525 
     526            // we leave $expires unset, Dropbox does not mention expiry of links from `get_temporary_link` 
     527 
     528            return $url->url; 
     529        } 
     530    } 
     531 
     532    public function Delta( $cursor ) { 
     533        return $this->apiCall( "2/files/list_folder/continue", array_merge( compact( 'cursor' ), array(//'recursive' => true 
     534        ) ) ); 
     535    } 
     536 
     537    public function LatestCursor( $path = '', $include_media_info = false ) { 
     538        $res = $this->apiCall( "2/files/list_folder/get_latest_cursor", compact( 'path', 'include_media_info' ) ); 
     539 
     540        return $res->cursor; 
     541    } 
     542 
     543    public function GetRevisions( $path, $limit = 10 ) { 
     544        $path = self::toPath( $path ); 
     545 
     546        return $this->apiCall( "2/files/list_revisions", compact( 'path', 'limit' ) )->entries; 
     547    } 
     548 
     549    public function Restore( $dropbox_file, $rev ) { 
     550        if ( is_object( $dropbox_file ) && ! empty( $dropbox_file->path ) ) { 
     551            $dropbox_file = $dropbox_file->path; 
     552        } 
     553 
     554        return $this->apiCall( "restore/$this->rootPath/$dropbox_file", compact( 'rev' ) ); 
     555    } 
     556 
     557    public function Search( $path, $query, $max_results = 1000, $include_deleted = false ) { 
     558        $path = self::toPath( $path ); 
     559        $mode = $include_deleted ? 'deleted_filename' : 'filename'; 
     560 
     561        $meta = array(); 
     562        foreach ( $this->apiCall( "2/files/search", compact( 'path', 'query', 'max_results', 'mode' ) )->matches as $match ) { 
     563            $meta[] = self::compatMeta( $match->metadata ); 
     564        } 
     565 
     566        return $meta; 
     567    } 
     568 
     569    public function GetCopyRef( $dropbox_file, &$expires = null ) { 
     570        if ( is_object( $dropbox_file ) && ! empty( $dropbox_file->path ) ) { 
     571            $dropbox_file = $dropbox_file->path; 
     572        } 
     573        $ref     = $this->apiCall( "copy_ref/$this->rootPath/$dropbox_file", "GET" ); 
     574        $expires = strtotime( $ref->expires ); 
     575 
     576        return $ref->copy_ref; 
     577    } 
     578 
     579 
     580    public function Copy( $from_path, $to_path, $copy_ref = false ) { 
     581        if ( is_object( $from_path ) && ! empty( $from_path->path ) ) { 
     582            $from_path = $from_path->path; 
     583        } 
     584 
     585        return $this->apiCall( "fileops/copy", array( 
     586            'root'                                        => $this->rootPath, 
     587            ( $copy_ref ? 'from_copy_ref' : 'from_path' ) => $from_path, 
     588            'to_path'                                     => $to_path 
     589        ) ); 
     590    } 
     591 
     592    /** 
     593     * Creates a new folder in the DropBox 
     594     * 
     595     * @access public 
     596     * 
     597     * @param $path string The path to the new folder to create 
     598     * @param bool $autorename 
     599     * 
     600     * @return object Dropbox folder metadata 
     601     */ 
     602    public function CreateFolder( $path, $autorename = false  ) { 
     603        $res = $this->apiCall( "2/files/create_folder_v2", 
     604            array( 'path' => $path, 'autorename' => $autorename ) ); 
     605        $res->metadata->{'.tag'} = 'folder'; 
     606        return self::compatMeta($res->metadata); 
     607    } 
     608 
     609    /** 
     610     * Delete file or folder 
     611     * 
     612     * @param $path mixed The path or metadata of the file/folder to be deleted. 
     613     * 
     614     * @return object Dropbox metadata of deleted file or folder 
     615     */ 
     616    public function Delete( $path ) { 
     617        if ( is_object( $path ) && ! empty( $path->path ) ) { 
     618            $path = $path->path; 
     619        } 
     620 
     621        $res = $this->apiCall( "2/files/delete_v2", array( 'path' => $path ) ); 
     622        return self::compatMeta($res->metadata); 
     623    } 
     624 
     625    public function Move( $from_path, $to_path ) { 
     626        if ( is_object( $from_path ) && ! empty( $from_path->path ) ) { 
     627            $from_path = $from_path->path; 
     628        } 
     629 
     630        return $this->apiCall( "fileops/move", array( 
     631            'root'      => $this->rootPath, 
     632            'from_path' => $from_path, 
     633            'to_path'   => $to_path 
     634        ) ); 
     635    } 
     636 
     637 
     638    // END of API functions 
     639 
     640 
     641    private function createCurl( $url, $http_context ) { 
     642        $ch = curl_init( $url ); 
     643 
     644        $curl_opts = array( 
     645            CURLOPT_HEADER         => false, // exclude header from output //CURLOPT_MUTE => true, // no output! 
     646            CURLOPT_RETURNTRANSFER => true, // but return! 
     647            CURLOPT_SSL_VERIFYPEER => false, 
     648            CURLOPT_BINARYTRANSFER => true 
     649        ); 
     650 
     651        $curl_opts[ CURLOPT_CUSTOMREQUEST ] = $http_context['method']; 
     652 
     653        if ( ! empty( $http_context['content'] ) ) { 
     654            $curl_opts[ CURLOPT_POSTFIELDS ] =& $http_context['content']; 
     655            if ( defined( "CURLOPT_POSTFIELDSIZE" ) ) { 
     656                $curl_opts[ CURLOPT_POSTFIELDSIZE ] = strlen( $http_context['content'] ); 
     657            } 
     658        } 
     659 
     660        $curl_opts[ CURLOPT_HTTPHEADER ] = array_map( 'trim', explode( "\n", $http_context['header'] ) ); 
     661 
     662        if ( ! empty( $this->curlOptions ) && is_array( $this->curlOptions ) ) { 
     663            $curl_opts = array_merge( $curl_opts, $this->curlOptions ); 
     664        } 
     665 
     666        curl_setopt_array( $ch, $curl_opts ); 
     667 
     668        return $ch; 
     669    } 
     670 
     671    static private $_curlHeadersRef; 
     672 
     673    private static function _curlHeaderCallback( 
     674        /** @noinspection PhpUnusedParameterInspection */ 
     675        $ch, $header 
     676    ) { 
     677        self::$_curlHeadersRef[] = trim( $header ); 
     678 
     679        return strlen( $header ); 
     680    } 
     681 
     682    private static function &execCurlAndClose( $ch, &$out_response_headers = null ) { 
     683        if ( is_array( $out_response_headers ) ) { 
     684            self::$_curlHeadersRef =& $out_response_headers; 
     685            curl_setopt( $ch, CURLOPT_HEADERFUNCTION, array( __CLASS__, '_curlHeaderCallback' ) ); 
     686        } 
     687        $res     = curl_exec( $ch ); 
     688        $err_no  = curl_errno( $ch ); 
     689        $err_str = curl_error( $ch ); 
     690        curl_close( $ch ); 
     691        if ( $err_no || $res === false ) { 
     692            throw new DropboxException( "cURL-Error ($err_no): $err_str" ); 
     693        } 
     694 
     695        return $res; 
     696    } 
     697 
     698    /** 
     699     * @param $url string 
     700     * @param $params 
     701     * @param string $content 
     702     * @param int $bearer_token 
     703     * 
     704     * @return resource 
     705     */ 
     706    private function createRequestContext( $url, $params, &$content = "", $bearer_token = - 1 ) { 
     707        if ( $bearer_token === - 1 ) { 
     708            $bearer_token = $this->accessToken['t']; 
     709        } 
     710 
     711        $http_context = array( 'method' => "POST", 'header' => '', 'content' => '' ); 
     712 
     713        if ( strpos( $url, '/oauth2/token' ) !== false ) { 
     714            $http_context['header']  .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
     715            $http_context['content'] = http_build_query( $params ); 
     716        } else { 
     717 
     718            if ( ! empty( $bearer_token ) ) { 
     719                $http_context['header'] .= "Authorization: Bearer $bearer_token\r\n"; 
     720            } 
     721 
     722            if ( empty( $content ) && strpos( $url, self::API_CONTENT_URL ) === false ) { 
     723                if ( ! empty( $params ) ) { 
     724                    $http_context['header']  .= "Content-Type: application/json\r\n"; 
     725                    $http_context['content'] = json_encode( $params ); 
     726                } 
     727            } else { 
     728                $http_context['header'] .= 'Dropbox-API-Arg: ' . str_replace( '"', '"', json_encode( (object) $params ) ) . "\r\n"; 
     729                $http_context['header'] .= "Content-Type: application/octet-stream\r\n"; 
     730                if ( ! empty( $content ) ) { 
     731                    $http_context['content'] = $content; 
     732                } 
     733            } 
     734 
     735        } 
     736 
     737        if ( strpos( $url, self::API_CONTENT_URL ) === false ) { 
     738            $http_context['header'] .= "Content-Length: " . strlen( $http_context['content'] ); 
     739        } 
     740 
     741        $http_context['header'] = trim( $http_context['header'] ); 
     742 
     743        // be able to retrieve error response body: 
     744        $http_context['ignore_errors'] = true; 
     745 
     746 
     747        // print_r($http_context); 
     748        return $this->useCurl ? $this->createCurl( $url, $http_context ) : stream_context_create( array( 'http' => $http_context ) ); 
     749    } 
     750 
     751    /** 
     752     * @param object $resp 
     753     * @param string $context 
     754     * 
     755     * @return object 
     756     * @throws DropboxException 
     757     */ 
     758    private 
     759    static function checkForError( 
     760        $resp, $context = null 
     761    ) { 
     762        if ( ! empty( $resp->error ) ) { 
     763            throw new DropboxException( $resp, $context ); 
     764        } 
     765 
     766        return $resp; 
     767    } 
     768 
     769 
     770    /** 
     771     * @param string $path 
     772     * @param array $params 
     773     * @param bool $content_call 
     774     * @param string $content 
     775     * 
     776     * @return object 
     777     * @throws DropboxException 
     778     */ 
     779    private function doSingleCall( $path, $params = array(), $content_call = false, &$content = null ) { 
     780        $url     = self::cleanUrl( ( $content_call ? self::API_CONTENT_URL : self::API_URL ) . $path ); 
     781        $context = $this->createRequestContext( $url, $params, $content ); 
     782 
     783        $json = $this->useCurl ? self::execCurlAndClose( $context ) : file_get_contents( $url, false, $context ); 
     784        $resp = json_decode( $json ); 
     785 
     786        if ( is_null( $resp ) && $content_call ) { 
     787            return null; 
     788        } 
     789 
     790        if ( is_null( $resp ) && ! empty( $json ) ) { 
     791            throw new DropboxException( "apiCall($path) failed: $json (URL was $url)" ); 
     792        } 
     793        if ( ( $resp === false || is_null( $resp ) ) && ! empty( $json ) && ! $content_call ) { 
     794            throw new DropboxException( "Error apiCall($path): $json" ); 
     795        } 
     796 
     797        return self::checkForError( $resp, "apiCall($path)" ); 
     798    } 
     799 
     800 
     801    /** 
     802     * @param object $target 
     803     * @param object $part 
     804     */ 
     805    private static function mergeContinue( &$target, $part ) { 
     806        $keys = array_keys( get_object_vars( $target ) ); 
     807        foreach ( $keys as $k ) { 
     808            if ( is_array( $target->$k ) && ! empty( $part->$k ) && is_array( $part->$k ) ) { 
     809                $target->$k = array_merge( $target->$k, $part->$k ); 
     810            } 
     811        } 
     812        $target->has_more = $part->has_more; 
     813        $target->cursor   = $part->cursor; 
     814    } 
     815 
     816 
     817    /** 
     818     * @param string $path 
     819     * @param array $params 
     820     * @param bool $content_call 
     821     * @param string $content 
     822     * 
     823     * @return object 
     824     * @throws DropboxException 
     825     */ 
     826    private 
     827    function apiCall( 
     828        $path, $params = array(), $content_call = false, &$content = null 
     829    ) { 
     830        $resp = $this->doSingleCall( $path, $params, $content_call, $content ); 
     831 
     832        // check for 'has_more' and run /continue requests 
     833        if ( ! empty( $resp->has_more ) && strpos( $path, '/continue' ) === false ) { 
     834            $path .= '/continue'; 
     835        } 
     836 
     837        while ( ! $content_call && ! empty( $resp->has_more ) ) { 
     838            if ( empty( $resp->cursor ) ) { 
     839                throw new DropboxException( "Unexpected response from $path: has_more without cursor!" ); 
     840            } 
     841            $params['cursor'] = is_string( $resp->cursor ) ? $resp->cursor : $resp->cursor->value; 
     842            self::mergeContinue( $resp, $this->doSingleCall( $path, $params, $content_call, $content ) ); 
     843        } 
     844 
     845        return $resp; 
     846    } 
     847 
     848 
     849    private 
     850    static function getMetaFromHeaders( 
     851        &$header_array, $throw_on_error = false 
     852    ) { 
     853        $obj = json_decode( substr( @array_shift( array_filter( $header_array, function ( $s ) { 
     854            return stripos( $s, "dropbox-api-result:" ) === 0; 
     855        } ) ), 20 ) ); 
     856        if ( $throw_on_error && ( empty( $obj ) || ! is_object( $obj ) ) ) { 
     857            throw new DropboxException( "Could not retrieve meta data from header data: " . print_r( $header_array, true ) ); 
     858        } 
     859        if ( $throw_on_error ) { 
     860            self::checkForError( $obj, __FUNCTION__ ); 
     861        } 
     862 
     863        return self::compatMeta( $obj ); 
     864    } 
     865 
     866    private static function toPath( $file_or_path ) { 
     867        if ( is_object( $file_or_path ) ) { 
     868            $file_or_path = $file_or_path->path; 
     869        } 
     870        $file_or_path = '/' . trim( $file_or_path, '/' ); 
     871        if ( $file_or_path == '/' ) { 
     872            $file_or_path = ''; 
     873        } 
     874 
     875        return $file_or_path; 
     876    } 
     877 
     878 
     879    private static function cleanUrl( $url ) { 
     880        $p   = substr( $url, 0, 8 ); 
     881        $url = str_replace( '//', '/', str_replace( '\\', '/', substr( $url, 8 ) ) ); 
     882        $url = rawurlencode( $url ); 
     883        $url = str_replace( '%2F', '/', $url ); 
     884 
     885        return $p . $url; 
     886    } 
     887 
     888    public static function contentHashStream( $stream, $chunksize = 1024 * 8 ) { 
     889        static $BLOCK_SIZE = 4 * 1024 * 1024; 
     890        $streamhasher      = hash_init( 'sha256' ); 
     891        $blockhasher       = hash_init( 'sha256' ); 
     892        $current_block     = 1; 
     893        $current_blocksize = 0; 
     894        while ( ! feof( $stream ) ) { 
     895            $max_bytes_to_read = min( $chunksize, $BLOCK_SIZE - $current_blocksize ); 
     896            $chunk             = fread( $stream, $max_bytes_to_read ); 
     897            if ( strlen( $chunk ) == 0 ) { 
     898                break; 
     899            } 
     900            hash_update( $blockhasher, $chunk ); 
     901            $current_blocksize += $max_bytes_to_read; 
     902            if ( $current_blocksize == $BLOCK_SIZE ) { 
     903                $blockhash = hash_final( $blockhasher, true ); 
     904                hash_update( $streamhasher, $blockhash ); 
     905                $blockhasher = hash_init( 'sha256' ); 
     906                ++ $current_block; 
     907                $current_blocksize = 0; 
     908            } 
     909        } 
     910 
     911        if ( $current_blocksize > 0 ) { 
     912            $blockhash = hash_final( $blockhasher, true ); 
     913            hash_update( $streamhasher, $blockhash ); 
     914        } 
     915 
     916        return hash_final( $streamhasher ); 
     917    } 
     918 
     919    public static function contentHashFile( $localFileName ) { 
     920        $handle = fopen( $localFileName, 'r' ); 
     921        $hash   = self::contentHashStream( $handle ); 
     922        fclose( $handle ); 
     923 
     924        return $hash; 
     925    } 
     926 
     927    /** 
     928     * @deprecated 
     929     * @throws DropboxException 
     930     */ 
     931    public 
     932    function GetRequestToken() { 
     933        throw new DropboxException( 'GetRequestToken() has been removed with v2 API. Request tokens do not exist in OAuth2 anymore.' ); 
     934    } 
     935 
     936    /** 
     937     * @deprecated 
     938     * @throws DropboxException 
     939     */ 
     940    public 
     941    function GetAccessToken() { 
     942        throw new DropboxException( 'GetAccessToken() has been removed with v2 API. Use GetBearerToken() instead!' ); 
     943    } 
     944 
    10945} 
    11 class DropboxClient { 
    12    const API_URL = "https://api.dropbox.com/1/"; 
    13    const API_CONTENT_URL = "https://api-content.dropbox.com/1/"; 
    14    const BUFFER_SIZE = 4096; 
    15    const MAX_UPLOAD_CHUNK_SIZE = 150000000; // 150MB 
    16    const UPLOAD_CHUNK_SIZE = 2097152; // 2MB 
    17    private $appParams; 
    18    private $consumerToken; 
    19    private $requestToken; 
    20    private $accessToken; 
    21    private $locale; 
    22    private $rootPath; 
    23    private $useCurl; 
    24    function __construct($app_params, $locale = "en") { 
    25       $this->appParams = $app_params; 
    26       if (empty($app_params["app_key"])) { 
    27          throw new DropboxException("App Key is empty!"); 
    28       } 
    29  
    30       $this->consumerToken = array("t" => $this->appParams["app_key"], "s" => $this->appParams["app_secret"]); 
    31       $this->locale = $locale; 
    32       // $this->rootPath = empty($app_params["app_full_access"]) ? "sandbox" : "dropbox"; 
    33       $this->rootPath = "auto"; 
    34       $this->requestToken = null; 
    35       $this->accessToken = null; 
    36       $this->useCurl = function_exists("curl_init"); 
    37    } 
    38    function __wakeup() { 
    39       $this->useCurl = $this->useCurl && function_exists("curl_init"); 
    40    } 
    41    /** 
    42     * Sets whether to use cURL if its available or PHP HTTP wrappers otherwise 
    43     * 
    44     * @access public 
    45     * @return boolean Whether to actually use cURL (always false if not installed) 
    46     */ 
    47    public function SetUseCUrl($use_it) { 
    48       return ($this->useCurl = ($use_it && function_exists("curl_init"))); 
    49    } 
    50    // ################################################## 
    51    // Authorization 
    52    /** 
    53     * Step 1 of authentication process. Retrieves a request token or returns a previously retrieved one. 
    54     * 
    55     * @access public 
    56     * @param boolean $get_new_token Optional (default false). Wether to retrieve a new request token. 
    57     * @return array Request Token array. 
    58     */ 
    59    public function GetRequestToken($get_new_token = false) { 
    60       if (!empty($this->requestToken) && !$get_new_token) 
    61          return $this->requestToken; 
    62  
    63       $rt = $this->authCall("oauth/request_token"); 
    64       if (empty($rt) || empty($rt["oauth_token"])) 
    65          if (empty($rt) || empty($rt["oauth_token"])) { 
    66             echo "101"; 
    67             //throw new DropboxException("Could not get request token!"); 
    68             die(); 
    69          } 
    70       return ($this->requestToken = array("t" => $rt["oauth_token"], "s" => $rt["oauth_token_secret"])); 
    71    } 
    72    /** 
    73     * Step 2. Returns a URL the user must be redirected to in order to connect the app to their Dropbox account 
    74     * 
    75     * @access public 
    76     * @param string $return_url URL users are redirected after authorization 
    77     * @return string URL 
    78     */ 
    79    public function BuildAuthorizeUrl($return_url) { 
    80       $rt = $this->GetRequestToken(); 
    81       if (empty($rt) || empty($rt["t"])) 
    82          throw new DropboxException("Request Token Invalid (" . print_r($rt, true) . ")."); 
    83       return "https://www.dropbox.com/1/oauth/authorize?oauth_token=" . $rt["t"] . "&oauth_callback=" . urlencode($return_url); 
    84    } 
    85    /** 
    86     * Step 3. Acquires an access token. This is the final step of authentication. 
    87     * 
    88     * @access public 
    89     * @param array $request_token Optional. The previously retrieved request token. This parameter can only be skipped if the DropboxClient object has been (de)serialized. 
    90     * @return array Access Token array. 
    91     */ 
    92    public function GetAccessToken($request_token = null) { 
    93       if (!empty($this->accessToken)) 
    94          return $this->accessToken; 
    95       if (empty($request_token)) 
    96          $request_token = $this->requestToken; 
    97       if (empty($request_token)) 
    98          throw new DropboxException("Request token required!"); 
    99  
    100       $at = $this->authCall("oauth/access_token", $request_token); 
    101       if (empty($at)) 
    102          throw new DropboxException(sprintf("Could not get access token! (request token: %s)", $request_token["t"])); 
    103       return ($this->accessToken = array("t" => $at["oauth_token"], "s" => $at["oauth_token_secret"])); 
    104    } 
    105    /** 
    106     * Sets a previously retrieved (and stored) access token. 
    107     * 
    108     * @access public 
    109     * @param string|object $token The Access Token 
    110     * @return none 
    111     */ 
    112    public function SetAccessToken($token) { 
    113       if (empty($token["t"]) || empty($token["s"])) 
    114          throw new DropboxException("Passed invalid access token."); 
    115       $this->accessToken = $token; 
    116    } 
    117    /** 
    118     * Checks if an access token has been set. 
    119     * 
    120     * @access public 
    121     * @return boolean Authorized or not 
    122     */ 
    123    public function IsAuthorized() { 
    124       if (empty($this->accessToken)) 
    125          return false; 
    126       return true; 
    127    } 
    128    // ################################################## 
    129    // API Functions 
    130    /** 
    131     * Retrieves information about the user"s account. 
    132     * 
    133     * @access public 
    134     * @return object Account info object. See https://www.dropbox.com/developers/reference/api#account-info 
    135     */ 
    136    public function GetAccountInfo() { 
    137       return $this->apiCall("account/info", "GET"); 
    138    } 
    139    /** 
    140     * Get file list of a dropbox folder. 
    141     * 
    142     * @access public 
    143     * @param string|object $dropbox_path Dropbox path of the folder 
    144     * @return array An array with metadata of files/folders keyed by paths 
    145     */ 
    146    public function GetFiles($dropbox_path = "", $recursive = false, $include_deleted = false) { 
    147       if (is_object($dropbox_path) && !empty($dropbox_path->path)) 
    148          $dropbox_path = $dropbox_path->path; 
    149       return $this->getFileTree($dropbox_path, $include_deleted, $recursive ? 1000 : 0); 
    150    } 
    151    /** 
    152     * Get file or folder metadata 
    153     * 
    154     * @access public 
    155     * @param $dropbox_path string Dropbox path of the file or folder 
    156     */ 
    157    public function GetMetadata($dropbox_path, $include_deleted = false, $rev = null) { 
    158       if (is_object($dropbox_path) && !empty($dropbox_path->path)) 
    159          $dropbox_path = $dropbox_path->path; 
    160       return $this->apiCall("metadata/$this->rootPath/$dropbox_path", "GET", compact("include_deleted", "rev")); 
    161    } 
    162    /** 
    163     * Download a file to the webserver 
    164     * 
    165     * @access public 
    166     * @param string|object $dropbox_file Dropbox path or metadata object of the file to download. 
    167     * @param string $dest_path Local path for destination 
    168     * @param string $rev Optional. The revision of the file to retrieve. This defaults to the most recent revision. 
    169     * @param callback $progress_changed_callback Optional. Callback that will be called during download with 2 args: 1. bytes loaded, 2. file size 
    170     * @return object Dropbox file metadata 
    171     */ 
    172    public function DownloadFile($dropbox_file, $dest_path = "", $rev = null, $progress_changed_callback = null) { 
    173       if (is_object($dropbox_file) && !empty($dropbox_file->path)) 
    174          $dropbox_file = $dropbox_file->path; 
    175  
    176       if (empty($dest_path)) 
    177          $dest_path = basename($dropbox_file); 
    178  
    179       $url = $this->cleanUrl(self::API_CONTENT_URL . "/files/$this->rootPath/$dropbox_file") 
    180           . (!empty($rev) ? ("?" . http_build_query(array("rev" => $rev), "", "&")) : ""); 
    181       $context = $this->createRequestContext($url, "GET"); 
    182  
    183       $fh = @fopen($dest_path, "wb"); // write binary 
    184       if ($fh === false) { 
    185          @fclose($rh); 
    186          throw new DropboxException("Could not create file $dest_path !"); 
    187       } 
    188  
    189       if ($this->useCurl) { 
    190          curl_setopt($context, CURLOPT_BINARYTRANSFER, true); 
    191          curl_setopt($context, CURLOPT_RETURNTRANSFER, true); 
    192          curl_setopt($context, CURLOPT_FILE, $fh); 
    193          $response_headers = array(); 
    194          self::execCurlAndClose($context, $response_headers); 
    195          fclose($fh); 
    196          $meta = self::getMetaFromHeaders($response_headers, true); 
    197          $bytes_loaded = filesize($dest_path); 
    198       } else { 
    199          $rh = @fopen($url, "rb", false, $context); // read binary 
    200          if ($rh === false) { 
    201             throw new DropboxException("HTTP request to $url failed!"); 
    202          } 
    203  
    204          // get file meta from HTTP header 
    205          $s_meta = stream_get_meta_data($rh); 
    206          $meta = self::getMetaFromHeaders($s_meta["wrapper_data"], true); 
    207          $bytes_loaded = 0; 
    208          while (!feof($rh)) { 
    209             if (($s = fwrite($fh, fread($rh, self::BUFFER_SIZE))) === false) { 
    210                @fclose($rh); 
    211                @fclose($fh); 
    212                throw new DropboxException("Writing to file $dest_path failed!'"); 
    213             } 
    214             $bytes_loaded += $s; 
    215             if (!empty($progress_changed_callback)) { 
    216                call_user_func($progress_changed_callback, $bytes_loaded, $meta->bytes); 
    217             } 
    218          } 
    219          fclose($rh); 
    220          fclose($fh); 
    221       } 
    222  
    223       if ($meta->bytes != $bytes_loaded) 
    224          throw new DropboxException("Download size mismatch! (header:{$meta->bytes} vs actual:{$bytes_loaded}; curl:{$this->useCurl})"); 
    225  
    226       return $meta; 
    227    } 
    228    /** 
    229     * Upload a file to dropbox 
    230     * 
    231     * @access public 
    232     * @param $src_file string Local file to upload 
    233     * @param $dropbox_path string Dropbox path for destination 
    234     * @return object Dropbox file metadata 
    235     */ 
    236    public function UploadFile($src_file, $dropbox_path = "", $file_name, $logfile_name, $backup_bank_data, $backup_type = "") { 
    237       $upload_path = untrailingslashit($backup_bank_data["folder_location"]); 
    238       $archive_name = implode("", maybe_unserialize($backup_bank_data["archive_name"])); 
    239       $log_file_path = $upload_path . "/" . $archive_name . ".txt"; 
    240       $start_time = microtime(true); 
    241       if (empty($dropbox_path)) 
    242          $dropbox_path = basename($src_file); 
    243       elseif (is_object($dropbox_path) && !empty($dropbox_path->path)) 
    244          $dropbox_path = $dropbox_path->path; 
    245  
    246       // make sure the dropbox_path is not a dir. if it is, append baseneme of $src_file 
    247       $dropbox_bn = basename($dropbox_path); 
    248       if (strpos($dropbox_bn, ".") === false) { // check if ext. is missing -> could be a directory! 
    249          try { 
    250             $meta = $this->GetMetadata($dropbox_path); 
    251             if ($meta && $meta->is_dir) 
    252                $dropbox_path = $dropbox_path . "/" . basename($src_file); 
    253          } catch (Exception $e) { 
    254              
    255          } 
    256       } 
    257  
    258       $file_size = filesize($src_file); 
    259       // if($file_size > self::MAX_UPLOAD_CHUNK_SIZE) 
    260       // { 
    261       $fh = fopen($src_file, "rb"); 
    262       if ($fh === false) 
    263          throw new DropboxException(); 
    264  
    265       $upload_id = null; 
    266       $offset = 0; 
    267       $cloud = 2; 
    268       $backup_status = "completed"; 
    269       while (!feof($fh)) { 
    270          $url = $this->cleanUrl(self::API_CONTENT_URL . "/chunked_upload") . "?" . http_build_query(compact("upload_id", "offset"), "", "&"); 
    271          $content = fread($fh, self::UPLOAD_CHUNK_SIZE); 
    272          $context = $this->createRequestContext($url, "PUT", $content); 
    273          $offset += strlen($content); 
    274          $result = ceil($offset / $file_size * 100); 
    275          $rtime = microtime(true) - $start_time; 
    276  
    277          if ($src_file != $logfile_name) { 
    278             $log = "Uploading to <b>Dropbox</b> (<b>" . round(($offset / 1048576), 1) . "MB</b> out of <b>" . round(($file_size / 1048576), 1) . "MB</b>)."; 
    279             if ($file_name != "") { 
    280                $message = "{" . "\r\n"; 
    281                $message .= '"log": ' . '"' . $log . '"' . ',' . "\r\n"; 
    282                $message .= '"perc": ' . $result . ',' . "\r\n"; 
    283                $message .= '"status": "' . $backup_status . '"' . ',' . "\r\n"; 
    284                $message .= '"cloud": ' . $cloud . "\r\n"; 
    285                $message .= "}"; 
    286                file_put_contents($file_name, $message); 
    287                @file_put_contents($log_file_path, strip_tags(sprintf("%08.03f", round($rtime, 3)) . " " . $log . "\r\n"), FILE_APPEND); 
    288             } 
    289          } 
    290          if ($this->useCurl) { 
    291             curl_setopt($context, CURLOPT_BINARYTRANSFER, true); 
    292             $response = json_decode(self::execCurlAndClose($context)); 
    293          } else { 
    294             $response = json_decode(file_get_contents($url, false, $context)); 
    295          } 
    296          unset($content); 
    297          unset($context); 
    298  
    299          self::checkForError($response); 
    300  
    301          if (empty($upload_id)) { 
    302             $upload_id = $response->upload_id; 
    303             if (empty($upload_id)) 
    304                throw new DropboxException("Upload ID empty!"); 
    305          } 
    306          if ($offset >= $file_size) 
    307             break; 
    308       } 
    309  
    310       @fclose($fh); 
    311       return $this->apiCall("commit_chunked_upload/$this->rootPath/$dropbox_path", "POST", compact("overwrite", "parent_rev", "upload_id"), true); 
    312       // } 
    313  
    314       $query = http_build_query(array_merge(compact("overwrite", "parent_rev"), array("locale" => $this->locale)), "", "&"); 
    315       $url = $this->cleanUrl(self::API_CONTENT_URL . "/files_put/$this->rootPath/$dropbox_path") . "?$query"; 
    316  
    317       if ($this->useCurl) { 
    318          $context = $this->createRequestContext($url, "PUT"); 
    319          curl_setopt($context, CURLOPT_BINARYTRANSFER, true); 
    320          $fh = fopen($src_file, "rb"); 
    321          curl_setopt($context, CURLOPT_PUT, 1); 
    322          curl_setopt($context, CURLOPT_INFILE, $fh); // file pointer 
    323          curl_setopt($context, CURLOPT_INFILESIZE, filesize($src_file)); 
    324          $meta = json_decode(self::execCurlAndClose($context)); 
    325          fclose($fh); 
    326          return self::checkForError($meta); 
    327       } else { 
    328          $content = file_get_contents($src_file); 
    329          if (strlen($content) == 0) 
    330             throw new DropboxException("Could not read file $src_file or file is empty!"); 
    331          $context = $this->createRequestContext($url, "PUT", $content); 
    332          return self::checkForError(json_decode(file_get_contents($url, false, $context))); 
    333       } 
    334    } 
    335    /** 
    336     * Get thumbnail for a specified image 
    337     * 
    338     * @access public 
    339     * @param $dropbox_file string Path to the image 
    340     * @param $format string Image format of the thumbnail (jpeg or png) 
    341     * @param $size string Thumbnail size (xs, s, m, l, xl) 
    342     * @return mime/* Returns the thumbnail as binary image data 
    343     */ 
    344    public function GetThumbnail($dropbox_file, $size = "s", $format = "jpeg", $echo = false) { 
    345       if (is_object($dropbox_file) && !empty($dropbox_file->path)) 
    346          $dropbox_file = $dropbox_file->path; 
    347       $url = $this->cleanUrl(self::API_CONTENT_URL . "thumbnails/$this->rootPath/$dropbox_file") 
    348           . "?" . http_build_query(array("format" => $format, "size" => $size), "", "&"); 
    349       $context = $this->createRequestContext($url, "GET"); 
    350  
    351       if ($this->useCurl) { 
    352          curl_setopt($context, CURLOPT_BINARYTRANSFER, true); 
    353          curl_setopt($context, CURLOPT_RETURNTRANSFER, true); 
    354       } 
    355  
    356       $thumb = $this->useCurl ? self::execCurlAndClose($context) : file_get_contents($url, NULL, $context); 
    357  
    358       if ($echo) { 
    359          header("Content-type: image/" . $format); 
    360          echo $thumb; 
    361          unset($thumb); 
    362          return; 
    363       } 
    364  
    365       return $thumb; 
    366    } 
    367    function GetLink($dropbox_file, $preview = true, $short = true, &$expires = null) { 
    368       if (is_object($dropbox_file) && !empty($dropbox_file->path)) 
    369          $dropbox_file = $dropbox_file->path; 
    370       $url = $this->apiCall(($preview ? "shares" : "media") . "/$this->rootPath/$dropbox_file", "POST", array("locale" => null, "short_url" => $preview ? $short : null)); 
    371       $expires = strtotime($url->expires); 
    372       return $url->url; 
    373    } 
    374    function Delta($cursor) { 
    375       return $this->apiCall("delta", "POST", compact("cursor")); 
    376    } 
    377    function GetRevisions($dropbox_file, $rev_limit = 10) { 
    378       if (is_object($dropbox_file) && !empty($dropbox_file->path)) 
    379          $dropbox_file = $dropbox_file->path; 
    380       return $this->apiCall("revisions/$this->rootPath/$dropbox_file", "GET", compact("rev_limit")); 
    381    } 
    382    function Restore($dropbox_file, $rev) { 
    383       if (is_object($dropbox_file) && !empty($dropbox_file->path)) 
    384          $dropbox_file = $dropbox_file->path; 
    385       return $this->apiCall("restore/$this->rootPath/$dropbox_file", "POST", compact("rev")); 
    386    } 
    387    function Search($path, $query, $file_limit = 1000, $include_deleted = false) { 
    388       return $this->apiCall("search/$this->rootPath/$path", "POST", compact("query", "file_limit", "include_deleted")); 
    389    } 
    390    function GetCopyRef($dropbox_file, &$expires = null) { 
    391       if (is_object($dropbox_file) && !empty($dropbox_file->path)) 
    392          $dropbox_file = $dropbox_file->path; 
    393       $ref = $this->apiCall("copy_ref/$this->rootPath/$dropbox_file", "GET", array("locale" => null)); 
    394       $expires = strtotime($ref->expires); 
    395       return $ref->copy_ref; 
    396    } 
    397    function Copy($from_path, $to_path, $copy_ref = false) { 
    398       if (is_object($from_path) && !empty($from_path->path)) 
    399          $from_path = $from_path->path; 
    400       return $this->apiCall("fileops/copy", "POST", array("root" => $this->rootPath, ($copy_ref ? "from_copy_ref" : "from_path") => $from_path, "to_path" => $to_path)); 
    401    } 
    402    /** 
    403     * Creates a new folder in the DropBox 
    404     * 
    405     * @access public 
    406     * @param $path string The path to the new folder to create 
    407     * @return object Dropbox folder metadata 
    408     */ 
    409    function CreateFolder($path) { 
    410       return $this->apiCall("fileops/create_folder", "POST", array("root" => $this->rootPath, "path" => $path)); 
    411    } 
    412    /** 
    413     * Delete file or folder 
    414     * 
    415     * @access public 
    416     * @param $path mixed The path or metadata of the file/folder to be deleted. 
    417     * @return object Dropbox metadata of deleted file or folder 
    418     */ 
    419    function Delete($path) { 
    420       if (is_object($path) && !empty($path->path)) 
    421          $path = $path->path; 
    422       return $this->apiCall("fileops/delete", "POST", array("locale" => null, "root" => $this->rootPath, "path" => $path)); 
    423    } 
    424    function Move($from_path, $to_path) { 
    425       if (is_object($from_path) && !empty($from_path->path)) 
    426          $from_path = $from_path->path; 
    427       return $this->apiCall("fileops/move", "POST", array("root" => $this->rootPath, "from_path" => $from_path, "to_path" => $to_path)); 
    428    } 
    429    function getFileTree($path = "", $include_deleted = false, $max_depth = 0, $depth = 0) { 
    430       static $files; 
    431       if ($depth == 0) 
    432          $files = array(); 
    433  
    434       $dir = $this->apiCall("metadata/$this->rootPath/$path", "GET", compact("include_deleted")); 
    435  
    436       if (empty($dir) || !is_object($dir)) 
    437          return false; 
    438  
    439       if (!empty($dir->error)) 
    440          throw new DropboxException($dir->error); 
    441  
    442       foreach ($dir->contents as $item) { 
    443          $files[trim($item->path, "/")] = $item; 
    444          if ($item->is_dir && $depth < $max_depth) { 
    445             $this->getFileTree($item->path, $include_deleted, $max_depth, $depth + 1); 
    446          } 
    447       } 
    448  
    449       return $files; 
    450    } 
    451    function createCurl($url, $http_context) { 
    452       $ch = curl_init($url); 
    453  
    454       $curl_opts = array( 
    455           CURLOPT_HEADER => false, // exclude header from output 
    456           //CURLOPT_MUTE => true, // no output! 
    457           CURLOPT_RETURNTRANSFER => true, // but return! 
    458           CURLOPT_SSL_VERIFYPEER => false, 
    459       ); 
    460  
    461       $curl_opts[CURLOPT_CUSTOMREQUEST] = $http_context["method"]; 
    462  
    463       if (!empty($http_context["content"])) { 
    464          $curl_opts[CURLOPT_POSTFIELDS] = & $http_context["content"]; 
    465          if (defined("CURLOPT_POSTFIELDSIZE")) 
    466             $curl_opts[CURLOPT_POSTFIELDSIZE] = strlen($http_context["content"]); 
    467       } 
    468  
    469       $curl_opts[CURLOPT_HTTPHEADER] = array_map("trim", explode("\n", $http_context["header"])); 
    470  
    471       curl_setopt_array($ch, $curl_opts); 
    472       return $ch; 
    473    } 
    474    static private $_curlHeadersRef; 
    475    static function _curlHeaderCallback($ch, $header) { 
    476       self::$_curlHeadersRef[] = trim($header); 
    477       return strlen($header); 
    478    } 
    479    static function &execCurlAndClose($ch, &$out_response_headers = null) { 
    480       if (is_array($out_response_headers)) { 
    481          self::$_curlHeadersRef = & $out_response_headers; 
    482          curl_setopt($ch, CURLOPT_HEADERFUNCTION, array(__CLASS__, "_curlHeaderCallback")); 
    483       } 
    484       $res = curl_exec($ch); 
    485       $err_no = curl_errno($ch); 
    486       $err_str = curl_error($ch); 
    487       curl_close($ch); 
    488       if ($err_no || $res === false) { 
    489          throw new DropboxException("cURL-Error ($err_no): $err_str"); 
    490       } 
    491  
    492       return $res; 
    493    } 
    494    private function createRequestContext($url, $method, &$content = null, $oauth_token = -1) { 
    495       if ($oauth_token === -1) 
    496          $oauth_token = $this->accessToken; 
    497  
    498       $method = strtoupper($method); 
    499       $http_context = array("method" => $method, "header" => ""); 
    500  
    501       $oauth = new OAuthSimple($this->consumerToken["t"], $this->consumerToken["s"]); 
    502  
    503       if (empty($oauth_token) && !empty($this->accessToken)) 
    504          $oauth_token = $this->accessToken; 
    505  
    506       if (!empty($oauth_token)) { 
    507          $oauth->setParameters(array("oauth_token" => $oauth_token["t"])); 
    508          $oauth->signatures(array("oauth_secret" => $oauth_token["s"])); 
    509       } 
    510  
    511       if (!empty($content)) { 
    512          $post_vars = ($method != "PUT" && preg_match("/^[a-z][a-z0-9_]*=/i", substr($content, 0, 32))); 
    513          $http_context["header"] .= "Content-Length: " . strlen($content) . "\r\n"; 
    514          $http_context["header"] .= "Content-Type: application/" . ($post_vars ? "x-www-form-urlencoded" : "octet-stream") . "\r\n"; 
    515          $http_context["content"] = & $content; 
    516          if ($method == "POST" && $post_vars) 
    517             $oauth->setParameters($content); 
    518       } 
    519       elseif ($method == "POST") { 
    520          // make sure that content-length is always set when post request (otherwise some wrappers fail!) 
    521          $http_context["content"] = ""; 
    522          $http_context["header"] .= "Content-Length: 0\r\n"; 
    523       } 
    524  
    525       // check for query vars in url and add them to oauth parameters (and remove from path) 
    526       $path = $url; 
    527       $query = strrchr($url, "?"); 
    528       if (!empty($query)) { 
    529          $oauth->setParameters(substr($query, 1)); 
    530          $path = substr($url, 0, -strlen($query)); 
    531       } 
    532  
    533       $signed = $oauth->sign(array( 
    534           "action" => $method, 
    535           "path" => $path)); 
    536       //print_r($signed); 
    537  
    538       $http_context["header"] .= "Authorization: " . $signed["header"] . "\r\n"; 
    539  
    540       return $this->useCurl ? $this->createCurl($url, $http_context) : stream_context_create(array("http" => $http_context)); 
    541    } 
    542    private function authCall($path, $request_token = null) { 
    543       $url = $this->cleanUrl(self::API_URL . $path); 
    544       $dummy = null; 
    545       $context = $this->createRequestContext($url, "POST", $dummy, $request_token); 
    546  
    547       $contents = $this->useCurl ? self::execCurlAndClose($context) : file_get_contents($url, false, $context); 
    548       $data = array(); 
    549       parse_str($contents, $data); 
    550       return $data; 
    551    } 
    552    private static function checkForError($resp) { 
    553       if (!empty($resp->error)) 
    554          throw new DropboxException($resp->error); 
    555       return $resp; 
    556    } 
    557    private function apiCall($path, $method, $params = array(), $content_call = false) { 
    558       $url = $this->cleanUrl(($content_call ? self::API_CONTENT_URL : self::API_URL) . $path); 
    559       $content = http_build_query(array_merge(array("locale" => $this->locale), $params), "", "&"); 
    560  
    561       // if($method == "GET") 
    562       // { 
    563       $url .= "?" . $content; 
    564       $content = null; 
    565       // } 
    566  
    567       $context = $this->createRequestContext($url, $method, $content); 
    568  
    569       $json = $this->useCurl ? self::execCurlAndClose($context) : file_get_contents($url, false, $context); 
    570       //if($json === false) 
    571       //throw new DropboxException(); 
    572       $resp = json_decode($json); 
    573       return self::checkForError($resp); 
    574    } 
    575    private static function getMetaFromHeaders(&$header_array, $throw_on_error = false) { 
    576       $obj = json_decode(substr(@array_shift(array_filter($header_array, create_function("$s", 'return stripos($s, "x-dropbox-metadata:") === 0;'))), 20)); 
    577       if ($throw_on_error && (empty($obj) || !is_object($obj))) 
    578          throw new DropboxException("Could not retrieve meta data from header data: " . print_r($header_array, true)); 
    579       if ($throw_on_error) 
    580          self::checkForError($obj); 
    581       return $obj; 
    582    } 
    583    function cleanUrl($url) { 
    584       $p = substr($url, 0, 8); 
    585       $url = str_replace("//", "/", str_replace("\\", "/", substr($url, 8))); 
    586       $url = rawurlencode($url); 
    587       $url = str_replace("%2F", "/", $url); 
    588       return $p . $url; 
    589    } 
     946 
     947class DropboxException extends Exception { 
     948    private $tag; 
     949 
     950    public function __construct( $resp = null, $context = null ) { 
     951        if ( is_null( $resp ) ) { 
     952            $el            = error_get_last(); 
     953            $this->message = $el['message']; 
     954            $this->file    = $el['file']; 
     955            $this->line    = $el['line']; 
     956        } elseif ( is_object( $resp ) && isset( $resp->error ) ) { 
     957            $this->message = empty( $resp->error_description ) ? ( json_encode( $resp ) . ( $context ? ", in $context" : "" ) ) : $resp->error_description; 
     958            /** @noinspection PhpUndefinedFieldInspection */ 
     959            $this->tag = is_object( $resp->error ) ? $resp->error->{'.tag'} : $resp->error; 
     960        } else { 
     961            $this->message = $resp . ( $context ? ", in $context" : "" ); 
     962        } 
     963    } 
     964 
     965    public function getTag() { 
     966        return $this->tag; 
     967    } 
    590968} 
    591 class DropboxException extends Exception { 
    592    public function __construct($err = null, $isDebug = FALSE) { 
    593       if (is_null($err)) { 
    594          $el = error_get_last(); 
    595          $this->message = $el["message"]; 
    596          $this->file = $el["file"]; 
    597          $this->line = $el["line"]; 
    598       } else 
    599          $this->message = $err; 
    600       self::log_error($err); 
    601       if ($isDebug) { 
    602          self::display_error($err, TRUE); 
    603       } 
    604    } 
    605    public static function log_error($err) { 
    606       error_log($err, 0); 
    607    } 
    608    public static function display_error($err, $kill = FALSE) { 
    609       print_r($err); 
    610       if ($kill === FALSE) { 
    611          die(); 
    612       } 
    613    } 
    614 } 
  • wp-backup-bank/trunk/lib/dropbox/tokens/access.token

    r1628959 r1769024  
    1 a:2:{s:1:"t";s:16:"0jnpnq9tmy37sqig";s:1:"s";s:15:"5dn1fwpgua68qqu";} 
     1a:2:{s:1:"t";s:64:"YgpaaGX3WmAAAAAAAAABZqO0JvkuP5w2eknYz3fn-WmWlnQF4T_ayaVspdJk3zmw";s:10:"account_id";s:40:"dbid:AAB1PIKcHxP1oO4XSRMdD7E2DSFVfW2pdSQ";} 
  • wp-backup-bank/trunk/lib/helper.php

    r1743303 r1769024  
    7575       */ 
    7676      class dropbox_backup_bank { 
    77          /* 
    78            Function Name: dropbox_client 
    79            Parameters: Yes($api_key,$secret_key) 
    80            Decription: This function is being used to return Dropbox object. 
    81            Created On: 29-02-2016 03:00 
    82            Created By: Tech-Banker Team 
    83           */ 
    84          function dropbox_client($api_key, $secret_key) { 
    85             if (file_exists(BACKUP_BANK_DIR_PATH . "lib/dropbox/dropbox-client.php")) { 
    86                include_once BACKUP_BANK_DIR_PATH . "lib/dropbox/dropbox-client.php"; 
    87             } 
    88             $dropbox = new DropboxClient(array 
    89                 ( 
    90                 "app_key" => $api_key, 
    91                 "app_secret" => $secret_key, 
    92                 "app_full_access" => false, 
    93                 ), "en"); 
    94             return $dropbox; 
    95          } 
    96          /* 
    97            Function Name: store_token 
    98            Parameters: Yes($token,$name) 
    99            Decription: This function is being used to store token. 
    100            Created On: 29-02-2016 03:00 
    101            Created By: Tech-Banker Team 
    102           */ 
    103          function store_token($token, $name) { 
    104             @file_put_contents(BACKUP_BANK_DIR_PATH . "lib/dropbox/tokens/$name.token", serialize($token)); 
    105          } 
    106          /* 
    107            Function Name: return_token 
    108            Parameters: Yes($token_file) 
    109            Decription: This function is being used to return token. 
    110            Created On: 29-02-2016 03:00 
    111            Created By: Tech-Banker Team 
    112           */ 
    113          function delete_token($name) { 
    114             @unlink(BACKUP_BANK_DIR_PATH . "lib/dropbox/tokens/$name.token"); 
    115          } 
    116          /* 
    117            Function Name: load_token 
    118            Parameters: Yes($name) 
    119            Decription: This function is being used to load token. 
    120            Created On: 29-02-2016 03:00 
    121            Created By: Tech-Banker Team 
    122           */ 
    123          function load_token($name) { 
    124             if (!file_exists(BACKUP_BANK_DIR_PATH . "lib/dropbox/tokens/$name.token")) { 
    125                return null; 
    126             } 
    127             return @maybe_unserialize(@file_get_contents(BACKUP_BANK_DIR_PATH . "lib/dropbox/tokens/$name.token")); 
    128          } 
    129          /* 
    130            Function Name: handle_dropbox_auth 
    131            Parameters: Yes($dropbox) 
    132            Decription: This function is being used to handle dropbox authentication. 
    133            Created On: 29-02-2016 03:00 
    134            Created By: Tech-Banker Team 
    135           */ 
    136          function handle_dropbox_auth($dropbox, $configure, $api_key, $secret_key) { 
    137             // first try to load existing access token 
    138             $access_token = $this->load_token("access"); 
    139             if (!empty($access_token)) { 
    140                $this->delete_token($access_token); 
    141             } 
    142  
    143             // checks if access token is required 
    144             if (!$dropbox->IsAuthorized()) { 
    145                $request_token = $dropbox->GetRequestToken(); 
    146                $this->store_token($request_token, $request_token["t"]); 
    147                $outh_token = $request_token["t"]; 
    148                $return_url = admin_url() . "admin.php?page=bb_dropbox_settings&auth_callback=1&api_key=$api_key&secret_key=$secret_key&configure=$configure&token=$outh_token"; 
    149                $auth_url = $dropbox->BuildAuthorizeUrl($return_url); 
    150                echo $auth_url; 
    151             } 
    152          } 
    153          /* 
    154            Function Name: handle_dropbox_auth_upload 
    155            Parameters: Yes($dropbox,$file,$path) 
    156            Decription: This function is being used to upload files on Dropbox. 
    157            Created On: 29-02-2016 03:00 
    158            Created By: Tech-Banker Team 
    159           */ 
    160          function handle_dropbox_auth_upload($dropbox, $files, $path, $file_name, $logfile_name, $backup_bank_data) { 
    161             // first try to load existing access token 
    162             $access_token = $this->load_token("access"); 
    163             if (!empty($access_token)) { 
    164                $dropbox->SetAccessToken($access_token); 
    165             } 
    166             if (isset($files) && count($files) > 0) { 
    167                foreach ($files as $file) { 
    168                   try { 
    169                      $dropbox->UploadFile($file, trailingslashit($path) . basename($file), $file_name, $logfile_name, $backup_bank_data); 
    170                   } catch (Exception $e) { 
    171                      throw $e; 
    172                   } 
    173                } 
    174             } 
    175          } 
    176          /* 
    177            Function Name: check_dropbox_build_authorize 
    178            Parameters: Yes($dropbox) 
    179            Decription: This function is used to check authorization for dropbox. 
    180            Created On: 07-04-2016 10:23 
    181            Created By: Tech-Banker Team 
    182           */ 
    183          function check_dropbox_build_authorize($dropbox) { 
    184             if (!$dropbox->IsAuthorized()) { 
    185                $return_url = admin_url() . "admin.php?page=bb_manual_backup"; 
    186                $auth_url = $dropbox->BuildAuthorizeUrl($return_url); 
    187             } 
    188          } 
    189          /* 
    190            Function Name: check_handle_dropbox_auth 
    191            Parameters: Yes($dropbox) 
    192            Decription: This function is used to check dropbox access token is valid or not. 
    193            Created On: 07-04-2016 10:25 
    194            Created By: Tech-Banker Team 
    195           */ 
    196          function check_handle_dropbox_auth($dropbox) { 
    197             $access_token = $this->load_token("access"); 
    198             if (!empty($access_token)) { 
    199                $dropbox->SetAccessToken($access_token); 
    200             } 
    201  
    202             if (!$dropbox->IsAuthorized()) { 
    203                $request_token = $dropbox->GetRequestToken(); 
    204                $this->store_token($request_token, $request_token["t"]); 
    205                $outh_token = $request_token["t"]; 
    206                $this->delete_token($outh_token); 
    207                $auth = false; 
    208             } else { 
    209                $auth = true; 
    210             } 
    211             return $auth; 
    212          } 
    213          /* 
    214            Function Name: create_folder 
    215            Parameters: Yes($dropbox,$folders) 
    216            Decription: This function is used to create folder in dropbox. 
    217            Created On: 26-05-2016 10:25 
    218            Created By: Tech-Banker Team 
    219           */ 
    220          function create_folder($dropbox, $folders) { 
    221             $access_token = $this->load_token("access"); 
    222             if (!empty($access_token)) { 
    223                $dropbox->SetAccessToken($access_token); 
    224             } 
    225             $dropbox->CreateFolder($folders); 
    226          } 
    227       } 
     77            /* 
     78              Function Name: dropbox_client 
     79              Parameters: Yes($api_key,$secret_key) 
     80              Decription: This function is being used to return Dropbox object. 
     81              Created On: 29-02-2016 03:00 
     82              Created By: Tech-Banker Team 
     83             */ 
     84            function dropbox_client($api_key, $secret_key) { 
     85               if (file_exists(BACKUP_BANK_DIR_PATH . "lib/dropbox/dropbox-client.php")) { 
     86                  include_once BACKUP_BANK_DIR_PATH . "lib/dropbox/dropbox-client.php"; 
     87               } 
     88               $dropbox = new DropboxClient(array 
     89                   ( 
     90                   "app_key" => $api_key, 
     91                   "app_secret" => $secret_key, 
     92                   "app_full_access" => false, 
     93                   )); 
     94               return $dropbox; 
     95            } 
     96            /* 
     97              Function Name: store_token 
     98              Parameters: Yes($token,$name) 
     99              Decription: This function is being used to store token. 
     100              Created On: 29-02-2016 03:00 
     101              Created By: Tech-Banker Team 
     102             */ 
     103            function store_token($token, $name) { 
     104               @file_put_contents(BACKUP_BANK_DIR_PATH . "lib/dropbox/tokens/$name.token", serialize($token)); 
     105            } 
     106            /* 
     107              Function Name: return_token 
     108              Parameters: Yes($token_file) 
     109              Decription: This function is being used to return token. 
     110              Created On: 29-02-2016 03:00 
     111              Created By: Tech-Banker Team 
     112             */ 
     113            function delete_token($name) { 
     114               @unlink(BACKUP_BANK_DIR_PATH . "lib/dropbox/tokens/$name.token"); 
     115            } 
     116            /* 
     117              Function Name: load_token 
     118              Parameters: Yes($name) 
     119              Decription: This function is being used to load token. 
     120              Created On: 29-02-2016 03:00 
     121              Created By: Tech-Banker Team 
     122             */ 
     123            function load_token($name) { 
     124               if (!file_exists(BACKUP_BANK_DIR_PATH . "lib/dropbox/tokens/$name.token")) 
     125                  return null; 
     126               return @maybe_unserialize(@file_get_contents(BACKUP_BANK_DIR_PATH . "lib/dropbox/tokens/$name.token")); 
     127            } 
     128            /* 
     129              Function Name: handle_dropbox_auth 
     130              Parameters: Yes($dropbox) 
     131              Decription: This function is being used to handle dropbox authentication. 
     132              Created On: 29-02-2016 03:00 
     133              Created By: Tech-Banker Team 
     134             */ 
     135            function handle_dropbox_auth($dropbox, $configure, $api_key, $secret_key) { 
     136               // first try to load existing access token 
     137               $access_token = $this->load_token("access"); 
     138               if (!empty($access_token)) { 
     139                  $this->delete_token($access_token); 
     140               } 
     141 
     142               // checks if access token is required 
     143               if (!$dropbox->IsAuthorized()) { 
     144                  $return_url = admin_url() . "admin.php?page=bb_dropbox_settings"; 
     145                  $auth_url = $dropbox->BuildAuthorizeUrl($return_url); 
     146                  echo $auth_url; 
     147               } 
     148            } 
     149            /* 
     150              Function Name: handle_dropbox_auth_upload 
     151              Parameters: Yes($dropbox,$file,$path) 
     152              Decription: This function is being used to upload files on Dropbox. 
     153              Created On: 29-02-2016 03:00 
     154              Created By: Tech-Banker Team 
     155             */ 
     156            function handle_dropbox_auth_upload($dropbox, $files, $path, $file_name, $logfile_name, $backup_bank_data) { 
     157               // first try to load existing access token 
     158               $access_token = $this->load_token("access"); 
     159               if (!empty($access_token)) { 
     160                  $dropbox->SetBearerToken($access_token); 
     161               } 
     162               if (isset($files) && count($files) > 0) { 
     163                  foreach ($files as $file) { 
     164                     try { 
     165                        $dropbox->UploadFile($file, trailingslashit($path) . basename($file), $file_name, $logfile_name, $backup_bank_data); 
     166                     } catch (Exception $e) { 
     167                        throw $e; 
     168                     } 
     169                  } 
     170               } 
     171            } 
     172            /* 
     173              Function Name: check_dropbox_build_authorize 
     174              Parameters: Yes($dropbox) 
     175              Decription: This function is used to check authorization for dropbox. 
     176              Created On: 07-04-2016 10:23 
     177              Created By: Tech-Banker Team 
     178             */ 
     179            function check_dropbox_build_authorize($dropbox) { 
     180               if (!$dropbox->IsAuthorized()) { 
     181                  $return_url = admin_url() . "admin.php?page=bb_manual_backup"; 
     182                  $auth_url = $dropbox->BuildAuthorizeUrl($return_url); 
     183               } 
     184            } 
     185            /* 
     186              Function Name: check_handle_dropbox_auth 
     187              Parameters: Yes($dropbox) 
     188              Decription: This function is used to check dropbox access token is valid or not. 
     189              Created On: 07-04-2016 10:25 
     190              Created By: Tech-Banker Team 
     191             */ 
     192            function check_handle_dropbox_auth($dropbox) { 
     193               $access_token = $this->load_token("access"); 
     194               if (!empty($access_token)) { 
     195                  $dropbox->SetBearerToken($access_token); 
     196               } 
     197 
     198               if (!$dropbox->IsAuthorized()) { 
     199                  $auth = false; 
     200               } else { 
     201                  $auth = true; 
     202               } 
     203               return $auth; 
     204            } 
     205            /* 
     206              Function Name: create_folder 
     207              Parameters: Yes($dropbox,$folders) 
     208              Decription: This function is used to create folder in dropbox. 
     209              Created On: 26-05-2016 10:25 
     210              Created By: Tech-Banker Team 
     211             */ 
     212            function create_folder($dropbox, $folders) { 
     213               $access_token = $this->load_token("access"); 
     214               if (!empty($access_token)) { 
     215                  $dropbox->SetBearerToken($access_token); 
     216               } 
     217               $dropbox->CreateFolder($folders); 
     218            } 
     219         } 
    228220      /* 
    229221        Class Name: ftp_connection_backup_bank 
  • wp-backup-bank/trunk/readme.txt

    r1747102 r1769024  
    33Tags: back up, backup, backup and restore, cloud backup, backup wordpress, backup wordpress site, database backup, dropbox, wordpress backup, wordpress backup plugin, wordpress database backup, data backup, backup data, wordpress database backup plugin, backup wordpress database 
    44Requires at least: 3.2 
    5 Tested up to: 4.8 
     5Tested up to: 4.9 
    66Requires PHP: 5.2 
    77Stable tag: trunk 
     
    384384== Changelog == 
    385385 
     386= 4.0.18 = 
     387 
     388* FIX: Dropbox Code Changed 
     389 
     390 
    386391= 4.0.14 = 
    387392 
  • wp-backup-bank/trunk/views/general-settings/dropbox-settings.php

    r1743303 r1769024  
    9898                              </div> 
    9999                           </div> 
     100                            <div class="form-group"> 
     101                                <label class="control-label"> 
     102                                    <?php echo $bb_redirect_url; ?> : 
     103                                    <i class="icon-custom-question tooltips" data-original-title="<?php echo $bb_redirect_url_tooltip; ?>" data-placement="right"></i> 
     104                                    <span class="required" aria-required="true">*</span> 
     105                                </label> 
     106                                <input name="ux_txt_dropbox_redirect_uri" id="ux_txt_dropbox_redirect_uri" readonly="readonly" type="text" value="<?php echo admin_url() . 'admin.php?page=bb_dropbox_settings' ?>" class="form-control"> 
     107                            </div> 
    100108                        </div> 
    101109                        <div class="line-separator"></div> 
  • wp-backup-bank/trunk/views/wizard/wizard.php

    r1743303 r1769024  
    88 */ 
    99if (!defined("ABSPATH")) { 
    10    exit; 
     10    exit; 
    1111} // Exit if accessed directly 
    1212if (!is_user_logged_in()) { 
    13    return; 
     13    return; 
    1414} else { 
    15    $access_granted = false; 
    16    foreach ($user_role_permission as $permission) { 
    17       if (current_user_can($permission)) { 
    18          $access_granted = true; 
    19          break; 
    20       } 
    21    } 
    22    if (!$access_granted) { 
    23       return; 
    24    } else { 
    25       $backup_bank_check_status = wp_create_nonce("backup_bank_check_status"); 
    26       ?> 
    27       <html> 
    28          <body> 
    29             <div><div><div> 
    30                      <div class="page-container header-wizard"> 
    31                         <div class="page-content"> 
    32                            <div class="row row-custom row-bg"> 
    33                               <div class="col-md-1"> 
    34                               </div> 
    35                               <div class="col-md-4 center"> 
    36                                  <b> 
    37                                     <i class="dashicons dashicons-wordpress bb-dashicons-wordpress"></i> 
    38                                  </b> 
    39                               </div> 
    40                               <div class="col-md-2 center"> 
    41                                  <i class="dashicons dashicons-plus bb-dashicons-plus"></i> 
    42                               </div> 
    43                               <div class="col-md-4 center"> 
    44                                  <img src="<?php echo plugins_url("assets/global/img/backup.png", dirname(dirname(__FILE__))); ?>" height="110" width="110"> 
    45                               </div> 
    46                               <div class="col-md-1"> 
    47                               </div> 
    48                            </div> 
    49                            <div class="row row-custom"> 
    50                               <div class="col-md-12 textalign"> 
    51                                  <p>Hi there!</p> 
    52                                  <p>Don't ever miss an opportunity to opt in for Email Notifications / Announcements about exciting New Features and Update Releases.</p> 
    53                                  <p>Contribute in helping us making our plugin compatible with most plugins and themes by allowing to share non-sensitive information about your website.</p> 
    54                                  <p>If you're not ready to Opt-In, that's ok too!</p> 
    55                                  <p><strong>Backup Bank will still work fine.</strong></p> 
    56                               </div> 
    57                            </div> 
    58                            <div class="row row-custom"> 
    59                               <div class="col-md-12"> 
    60                                  <a class="permissions" onclick="show_hide_details_backup_bank();">What permissions are being granted?</a> 
    61                               </div> 
    62                               <div class="col-md-12" style="display:none;" id="ux_div_wizard_set_up"> 
    63                                  <div class="col-md-6"> 
    64                                     <ul> 
    65                                        <li> 
    66                                           <i class="dashicons dashicons-admin-users bb-dashicons-admin-users"></i> 
    67                                           <div class="admin"> 
    68                                              <span><strong>User Details</strong></span> 
    69                                              <p>Name and Email Address</p> 
    70                                           </div> 
    71                                        </li> 
    72                                     </ul> 
    73                                  </div> 
    74                                  <div class="col-md-6 align align2"> 
    75                                     <ul> 
    76                                        <li> 
    77                                           <i class="dashicons dashicons-admin-plugins bb-dashicons-admin-plugins"></i> 
    78                                           <div class="admin-plugins"> 
    79                                              <span><strong>Current Plugin Status</strong></span> 
    80                                              <p>Activation, Deactivation and Uninstall</p> 
    81                                           </div> 
    82                                        </li> 
    83                                     </ul> 
    84                                  </div> 
    85                                  <div class="col-md-6"> 
    86                                     <ul> 
    87                                        <li> 
    88                                           <i class="dashicons dashicons-testimonial bb-dashicons-testimonial"></i> 
    89                                           <div class="testimonial"> 
    90                                              <span><strong>Notifications</strong></span> 
    91                                              <p>Updates &amp; Announcements</p> 
    92                                           </div> 
    93                                        </li> 
    94                                     </ul> 
    95                                  </div> 
    96                                  <div class="col-md-6 align2"> 
    97                                     <ul> 
    98                                        <li> 
    99                                           <i class="dashicons dashicons-welcome-view-site bb-dashicons-welcome-view-site"></i> 
    100                                           <div class="settings"> 
    101                                              <span><strong>Website Overview</strong></span> 
    102                                              <p>Site URL, WP Version, PHP Info, Plugins &amp; Themes Info</p> 
    103                                           </div> 
    104                                        </li> 
    105                                     </ul> 
    106                                  </div> 
    107                               </div> 
    108                               <div class="col-md-12 allow"> 
    109                                  <div class="tech-banker-actions"> 
    110                                     <a onclick="plugin_stats('opt_in');" class="button button-primary-wizard"> 
    111                                        <strong>Opt-In &amp; Continue </strong> 
    112                                        <i class="dashicons dashicons-arrow-right-alt bb-dashicons-arrow-right-alt"></i> 
    113                                     </a> 
    114                                     <a onclick="plugin_stats('skip');" class="button button-secondary-wizard" tabindex="2"> 
    115                                        <strong>Skip &amp; Continue </strong> 
    116                                        <i class="dashicons dashicons-arrow-right-alt bb-dashicons-arrow-right-alt"></i> 
    117                                     </a> 
    118                                     <div class="clearfix"></div> 
    119                                  </div> 
    120                               </div> 
    121                               <div class="col-md-12 terms"> 
    122                                  <a href="https://backup-bank.tech-banker.com/privacy-policy/" target="_blank">Privacy Policy</a> 
    123                                  <span> - </span> 
    124                                  <a href="https://backup-bank.tech-banker.com/terms-conditions/" target="_blank">Terms &amp; Conditions</a> 
    125                               </div> 
    126                            </div> 
    127                         </div> 
    128                      </div> 
    129                      </body> 
    130                      </html> 
    131                      <?php 
    132                   } 
    133                } 
     15    $access_granted = false; 
     16    foreach ($user_role_permission as $permission) { 
     17        if (current_user_can($permission)) { 
     18            $access_granted = true; 
     19            break; 
     20        } 
     21    } 
     22    if (!$access_granted) { 
     23        return; 
     24    } else { 
     25        $backup_bank_check_status = wp_create_nonce("backup_bank_check_status"); 
     26        ?> 
     27        <html> 
     28            <body> 
     29                <div><div><div> 
     30                            <div class="page-container header-wizard"> 
     31                                <div class="page-content"> 
     32                                    <div class="row row-custom row-bg"> 
     33                                        <div class="col-md-1"> 
     34                                        </div> 
     35                                        <div class="col-md-4 center"> 
     36                                            <b> 
     37                                                <i class="dashicons dashicons-wordpress bb-dashicons-wordpress"></i> 
     38                                            </b> 
     39                                        </div> 
     40                                        <div class="col-md-2 center"> 
     41                                            <i class="dashicons dashicons-plus bb-dashicons-plus"></i> 
     42                                        </div> 
     43                                        <div class="col-md-4 center"> 
     44                                            <img src="<?php echo plugins_url("assets/global/img/backup.png", dirname(dirname(__FILE__))); ?>" height="110" width="110"> 
     45                                        </div> 
     46                                        <div class="col-md-1"> 
     47                                        </div> 
     48                                    </div> 
     49                                    <div class="row row-custom"> 
     50                                        <div class="col-md-12 textalign"> 
     51                                            <p>Hi there!</p> 
     52                                            <p>Don't ever miss an opportunity to opt in for Email Notifications / Announcements about exciting New Features and Update Releases.</p> 
     53                                            <p>Contribute in helping us making our plugin compatible with most plugins and themes by allowing to share non-sensitive information about your website.</p> 
     54                                        </div> 
     55                                    </div> 
     56                                    <div class="row row-custom"> 
     57                                        <div class="col-md-12"> 
     58                                            <div style="padding-left: 40px;"> 
     59                                                <label class="control-label" style="font-size: 16px;"> 
     60                                                    <?php echo "Email Address for Notifications"; ?> : 
     61                                                </label> 
     62                                                <input type="text" style="width: 90%;" class="form-control" name="ux_txt_email_address_notifications" id="ux_txt_email_address_notifications" value="<?php echo get_option("admin_email"); ?>"> 
     63                                            </div> 
     64                                            <div class="textalign"> 
     65                                                <p>If you're not ready to Opt-In, that's ok too!</p> 
     66                                                <p><strong>Backup Bank will still work fine.</strong></p> 
     67                                            </div> 
     68                                        </div> 
     69                                        <div class="col-md-12"> 
     70                                            <a class="permissions" onclick="show_hide_details_backup_bank();">What permissions are being granted?</a> 
     71                                        </div> 
     72                                        <div class="col-md-12" style="display:none;" id="ux_div_wizard_set_up"> 
     73                                            <div class="col-md-6"> 
     74                                                <ul> 
     75                                                    <li> 
     76                                                        <i class="dashicons dashicons-admin-users bb-dashicons-admin-users"></i> 
     77                                                        <div class="admin"> 
     78                                                            <span><strong>User Details</strong></span> 
     79                                                            <p>Name and Email Address</p> 
     80                                                        </div> 
     81                                                    </li> 
     82                                                </ul> 
     83                                            </div> 
     84                                            <div class="col-md-6 align align2"> 
     85                                                <ul> 
     86                                                    <li> 
     87                                                        <i class="dashicons dashicons-admin-plugins bb-dashicons-admin-plugins"></i> 
     88                                                        <div class="admin-plugins"> 
     89                                                            <span><strong>Current Plugin Status</strong></span> 
     90                                                            <p>Activation, Deactivation and Uninstall</p> 
     91                                                        </div> 
     92                                                    </li> 
     93                                                </ul> 
     94                                            </div> 
     95                                            <div class="col-md-6"> 
     96                                                <ul> 
     97                                                    <li> 
     98                                                        <i class="dashicons dashicons-testimonial bb-dashicons-testimonial"></i> 
     99                                                        <div class="testimonial"> 
     100                                                            <span><strong>Notifications</strong></span> 
     101                                                            <p>Updates &amp; Announcements</p> 
     102                                                        </div> 
     103                                                    </li> 
     104                                                </ul> 
     105                                            </div> 
     106                                            <div class="col-md-6 align2"> 
     107                                                <ul> 
     108                                                    <li> 
     109                                                        <i class="dashicons dashicons-welcome-view-site bb-dashicons-welcome-view-site"></i> 
     110                                                        <div class="settings"> 
     111                                                            <span><strong>Website Overview</strong></span> 
     112                                                            <p>Site URL, WP Version, PHP Info, Plugins &amp; Themes Info</p> 
     113                                                        </div> 
     114                                                    </li> 
     115                                                </ul> 
     116                                            </div> 
     117                                        </div> 
     118                                        <div class="col-md-12 allow"> 
     119                                            <div class="tech-banker-actions"> 
     120                                                <a onclick="plugin_stats('opt_in');" class="button button-primary-wizard"> 
     121                                                    <strong>Opt-In &amp; Continue </strong> 
     122                                                    <i class="dashicons dashicons-arrow-right-alt bb-dashicons-arrow-right-alt"></i> 
     123                                                </a> 
     124                                                <a onclick="plugin_stats('skip');" class="button button-secondary-wizard" tabindex="2"> 
     125                                                    <strong>Skip &amp; Continue </strong> 
     126                                                    <i class="dashicons dashicons-arrow-right-alt bb-dashicons-arrow-right-alt"></i> 
     127                                                </a> 
     128                                                <div class="clearfix"></div> 
     129                                            </div> 
     130                                        </div> 
     131                                        <div class="col-md-12 terms"> 
     132                                            <a href="https://backup-bank.tech-banker.com/privacy-policy/" target="_blank">Privacy Policy</a> 
     133                                            <span> - </span> 
     134                                            <a href="https://backup-bank.tech-banker.com/terms-conditions/" target="_blank">Terms &amp; Conditions</a> 
     135                                        </div> 
     136                                    </div> 
     137                                </div> 
     138                            </div> 
     139                            </body> 
     140                            </html> 
     141                            <?php 
     142                        } 
     143                    } 
  • wp-backup-bank/trunk/wp-backup-bank.php

    r1747103 r1769024  
    66  Author: Tech Banker 
    77  Author URI: https://backup-bank.tech-banker.com 
    8   Version: 4.0.16 
     8  Version: 4.0.18 
    99  License: GPLv3 
    1010  Text Domain: wp-backup-bank 
     
    7777} 
    7878if (!defined("backup_bank_version_number")) { 
    79    define("backup_bank_version_number", "4.0.16"); 
     79   define("backup_bank_version_number", "4.0.18"); 
    8080} 
    8181function backup_folders_for_backup_bank() { 
     
    757757   function deactivation_function_for_backup_bank() { 
    758758      $type = get_option("backup-bank-wizard"); 
     759      $user_admin_email = get_option("backup-bank-admin-email"); 
    759760      if ($type == "opt_in") { 
    760761         $class_plugin_info = new class_plugin_info(); 
     
    775776         $plugin_stat_data["domain_url"] = site_url(); 
    776777         $plugin_stat_data["wp_language"] = defined("WPLANG") && WPLANG ? WPLANG : get_locale(); 
    777          $plugin_stat_data["email"] = get_option("admin_email"); 
     778         $plugin_stat_data["email"] = $user_admin_email != "" ? $user_admin_email : get_option("admin_email"); 
    778779         $plugin_stat_data["wp_version"] = $wp_version; 
    779780         $plugin_stat_data["php_version"] = esc_html(phpversion()); 
Note: See TracChangeset for help on using the changeset viewer.