From 5f80be7664f86115caad1ceac9ea670a7b033029 Mon Sep 17 00:00:00 2001 From: Michael Gapczynski Date: Tue, 12 Jun 2012 11:36:25 -0400 Subject: [PATCH] Add support for mounting Dropbox in external storage UI --- apps/files_external/ajax/dropbox.php | 41 +++++++++++ apps/files_external/js/dropbox.js | 53 +++++++++++++ apps/files_external/js/settings.js | 86 ++++++++++++---------- apps/files_external/lib/config.php | 3 + apps/files_external/templates/settings.php | 9 ++- 5 files changed, 150 insertions(+), 42 deletions(-) create mode 100644 apps/files_external/ajax/dropbox.php create mode 100644 apps/files_external/js/dropbox.js diff --git a/apps/files_external/ajax/dropbox.php b/apps/files_external/ajax/dropbox.php new file mode 100644 index 00000000000..5f2ff17e625 --- /dev/null +++ b/apps/files_external/ajax/dropbox.php @@ -0,0 +1,41 @@ +getRequestToken(); + OCP\JSON::success(array('data' => array('url' => $oauth->getAuthorizeUrl($callback), 'request_token' => $token['token'], 'request_token_secret' => $token['token_secret']))); + } catch (Exception $exception) { + OCP\JSON::error(array('data' => array('message' => 'Fetching request tokens failed. Verify that your Dropbox app key and secret are correct.'))); + } + break; + case 2: + if (isset($_POST['request_token']) && isset($_POST['request_token_secret'])) { + try { + $oauth->setToken($_POST['request_token'], $_POST['request_token_secret']); + $token = $oauth->getAccessToken(); + OCP\JSON::success(array('access_token' => $token['token'], 'access_token_secret' => $token['token_secret'])); + } catch (Exception $exception) { + OCP\JSON::error(array('data' => array('message' => 'Fetching access tokens failed. Verify that your Dropbox app key and secret are correct.'))); + } + } + break; + } + } +} else { + OCP\JSON::error(array('data' => array('message' => 'Please provide a valid Dropbox app key and secret.'))); +} + +?> \ No newline at end of file diff --git a/apps/files_external/js/dropbox.js b/apps/files_external/js/dropbox.js new file mode 100644 index 00000000000..67f3c46a6ed --- /dev/null +++ b/apps/files_external/js/dropbox.js @@ -0,0 +1,53 @@ +$(document).ready(function() { + + $('#externalStorage tbody tr').each(function() { + if ($(this).find('.backend').data('class') == 'OC_Filestorage_Dropbox') { + var app_key = $(this).find('.configuration [data-parameter="app_key"]').val(); + var app_secret = $(this).find('.configuration [data-parameter="app_secret"]').val(); + if (app_key == '' && app_secret == '') { + $(this).find('.configuration').append('Grant access'); + } else { + var pos = window.location.search.indexOf('oauth_token') + 12 + var token = $(this).find('.configuration [data-parameter="token"]'); + if (pos != -1 && window.location.search.substr(pos, $(token).val().length) == $(token).val()) { + var token_secret = $(this).find('.configuration [data-parameter="token_secret"]'); + var tr = $(this); + $.post(OC.filePath('files_external', 'ajax', 'dropbox.php'), { step: 2, app_key: app_key, app_secret: app_secret, request_token: $(token).val(), request_token_secret: $(token_secret).val() }, function(result) { + if (result && result.status == 'success') { + $(token).val(result.access_token); + $(token_secret).val(result.access_token_secret); + OC.MountConfig.saveStorage(tr); + } else { + OC.dialogs.alert(result.data.message, 'Error configuring Dropbox storage'); + } + }); + } + } + return false; + } + }); + + $('.dropbox').live('click', function(event) { + event.preventDefault(); + var app_key = $(this).parent().find('[data-parameter="app_key"]').val(); + var app_secret = $(this).parent().find('[data-parameter="app_secret"]').val(); + if (app_key != '' && app_secret != '') { + var tr = $(this).parent().parent(); + var token = $(this).parent().find('[data-parameter="token"]'); + var token_secret = $(this).parent().find('[data-parameter="token_secret"]'); + $.post(OC.filePath('files_external', 'ajax', 'dropbox.php'), { step: 1, app_key: app_key, app_secret: app_secret, callback: window.location.href }, function(result) { + if (result && result.status == 'success') { + $(token).val(result.data.request_token); + $(token_secret).val(result.data.request_token_secret); + OC.MountConfig.saveStorage(tr); + window.location = result.data.url; + } else { + OC.dialogs.alert(result.data.message, 'Error configuring Dropbox storage'); + } + }); + } else { + OC.dialogs.alert('Please provide a valid Dropbox app key and secret.', 'Error configuring Dropbox storage') + } + }); + +}); diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js index 38291d5f7e2..57188a6a266 100644 --- a/apps/files_external/js/settings.js +++ b/apps/files_external/js/settings.js @@ -1,40 +1,5 @@ -$(document).ready(function() { - - $('.chzn-select').chosen(); - - $('#selectBackend').live('change', function() { - var tr = $(this).parent().parent(); - $('#externalStorage tbody').last().append($(tr).clone()); - var selected = $(this).find('option:selected').text(); - var backendClass = $(this).val(); - $(this).parent().text(selected); - $(tr).find('.backend').data('class', $(this).val()); - var configurations = $(this).data('configurations'); - var td = $(tr).find('td.configuration'); - $.each(configurations, function(backend, parameters) { - if (backend == backendClass) { - $.each(parameters['configuration'], function(parameter, placeholder) { - if (placeholder.indexOf('*') != -1) { - td.append(''); - } else if (placeholder.indexOf('!') != -1) { - td.append(''); - } else if (placeholder.indexOf('&') != -1) { - td.append(''); - } else { - td.append(''); - } - }); - return false; - } - }); - $('.chz-select').chosen(); - $(tr).find('td').last().attr('class', 'remove'); - $(tr).removeAttr('id'); - $(this).remove(); - }); - - $('#externalStorage td').live('change', function() { - var tr = $(this).parent(); +OC.MountConfig={ + saveStorage:function(tr) { var mountPoint = $(tr).find('.mountPoint input').val(); if (mountPoint == '') { return false; @@ -99,6 +64,51 @@ $(document).ready(function() { $.post(OC.filePath('files_external', 'ajax', 'addMountPoint.php'), { mountPoint: mountPoint, class: backendClass, classOptions: classOptions, mountType: mountType, applicable: applicable, isPersonal: isPersonal }); } } + } +} + +$(document).ready(function() { + + $('.chzn-select').chosen(); + + $('#selectBackend').live('change', function() { + var tr = $(this).parent().parent(); + $('#externalStorage tbody').last().append($(tr).clone()); + var selected = $(this).find('option:selected').text(); + var backendClass = $(this).val(); + $(this).parent().text(selected); + $(tr).find('.backend').data('class', backendClass); + var configurations = $(this).data('configurations'); + var td = $(tr).find('td.configuration'); + $.each(configurations, function(backend, parameters) { + if (backend == backendClass) { + $.each(parameters['configuration'], function(parameter, placeholder) { + if (placeholder.indexOf('*') != -1) { + td.append(''); + } else if (placeholder.indexOf('!') != -1) { + td.append(''); + } else if (placeholder.indexOf('&') != -1) { + td.append(''); + } else if (placeholder.indexOf('#') != -1) { + td.append(''); + } else { + td.append(''); + } + }); + if (parameters['custom']) { + OC.addScript('files_external', parameters['custom']); + } + return false; + } + }); + $('.chz-select').chosen(); + $(tr).find('td').last().attr('class', 'remove'); + $(tr).removeAttr('id'); + $(this).remove(); + }); + + $('#externalStorage td').live('change', function() { + OC.MountConfig.saveStorage($(this).parent()); }); $('td.remove>img').live('click', function() { @@ -130,8 +140,6 @@ $(document).ready(function() { $(tr).remove(); }); - - $('#allowUserMounting').bind('change', function() { if (this.checked) { OC.AppConfig.setValue('files_external', 'allow_user_mounting', 'yes'); diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php index 56a61e9ab89..b2ebcd96fcc 100755 --- a/apps/files_external/lib/config.php +++ b/apps/files_external/lib/config.php @@ -30,15 +30,18 @@ class OC_Mount_Config { /** * Get details on each of the external storage backends, used for the mount config UI + * If a custom UI is needed, add the key 'custom' and a javascript file with that name will be loaded * If the configuration parameter should be secret, add a '*' to the beginning of the value * If the configuration parameter is a boolean, add a '!' to the beginning of the value * If the configuration parameter is optional, add a '&' to the beginning of the value + * If the configuration parameter is hidden, add a '#' to the begining of the value * @return array */ public static function getBackends() { return array( 'OC_Filestorage_Local' => array('backend' => 'Local', 'configuration' => array('datadir' => 'Location')), 'OC_Filestorage_AmazonS3' => array('backend' => 'Amazon S3', 'configuration' => array('key' => 'Key', 'secret' => '*Secret', 'bucket' => 'Bucket')), + 'OC_Filestorage_Dropbox' => array('backend' => 'Dropbox', 'configuration' => array('app_key' => 'App key', 'app_secret' => 'App secret', 'token' => '#token', 'token_secret' => '#token_secret' ), 'custom' => 'dropbox'), 'OC_Filestorage_FTP' => array('backend' => 'FTP', 'configuration' => array('host' => 'URL', 'user' => 'Username', 'password' => '*Password', 'root' => '&Root', 'secure' => '!Secure ftps://')), 'OC_Filestorage_SWIFT' => array('backend' => 'OpenStack Swift', 'configuration' => array('host' => 'URL', 'user' => 'Username', 'token' => '*Token', 'root' => '&Root', 'secure' => '!Secure ftps://')), 'OC_Filestorage_SMB' => array('backend' => 'SMB', 'configuration' => array('host' => 'URL', 'user' => 'Username', 'password' => '*Password', 'root' => '&Root')), diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php index af185c28030..a995ee34194 100644 --- a/apps/files_external/templates/settings.php +++ b/apps/files_external/templates/settings.php @@ -35,16 +35,19 @@ - + - + + + - + +