dropbox-sdk 1.5.1 → 1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +4 -0
- data/README +52 -7
- data/cli_example.rb +14 -28
- data/dropbox_controller.rb +91 -41
- data/lib/dropbox_sdk.rb +468 -135
- data/web_file_browser.rb +65 -61
- metadata +50 -36
data/web_file_browser.rb
CHANGED
@@ -13,68 +13,63 @@
|
|
13
13
|
require 'rubygems'
|
14
14
|
require 'sinatra'
|
15
15
|
require 'pp'
|
16
|
+
require 'securerandom'
|
16
17
|
require './lib/dropbox_sdk'
|
17
18
|
|
18
19
|
# Get your app's key and secret from https://www.dropbox.com/developers/
|
19
20
|
APP_KEY = ''
|
20
21
|
APP_SECRET = ''
|
21
|
-
ACCESS_TYPE = :app_folder #The two valid values here are :app_folder and :dropbox
|
22
|
-
#The default is :app_folder, but your application might be
|
23
|
-
#set to have full :dropbox access. Check your app at
|
24
|
-
#https://www.dropbox.com/developers/apps
|
25
22
|
|
26
23
|
# -------------------------------------------------------------------
|
27
24
|
# OAuth stuff
|
28
25
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
db_session.get_request_token
|
34
|
-
rescue DropboxError => e
|
35
|
-
return html_page "Exception in OAuth step 1", "<p>#{h e}</p>"
|
36
|
-
end
|
26
|
+
def get_web_auth()
|
27
|
+
return DropboxOAuth2Flow.new(APP_KEY, APP_SECRET, url('/dropbox-auth-finish'),
|
28
|
+
session, :dropbox_auth_csrf_token)
|
29
|
+
end
|
37
30
|
|
38
|
-
|
31
|
+
get '/dropbox-auth-start' do
|
32
|
+
authorize_url = get_web_auth().start()
|
39
33
|
|
40
|
-
#
|
41
|
-
#
|
42
|
-
|
43
|
-
auth_url = db_session.get_authorize_url url('/oauth-callback')
|
44
|
-
redirect auth_url
|
34
|
+
# Send the user to the Dropbox website so they can authorize our app. After the user
|
35
|
+
# authorizes our app, Dropbox will redirect them to our '/dropbox-auth-finish' endpoint.
|
36
|
+
redirect authorize_url
|
45
37
|
end
|
46
38
|
|
47
|
-
get '/
|
48
|
-
# Finish OAuth Step 2
|
49
|
-
ser = session[:request_db_session]
|
50
|
-
unless ser
|
51
|
-
return html_page "Error in OAuth step 2", "<p>Couldn't find OAuth state in session.</p>"
|
52
|
-
end
|
53
|
-
db_session = DropboxSession.deserialize(ser)
|
54
|
-
|
55
|
-
# OAuth Step 3: Get an access token from Dropbox.
|
39
|
+
get '/dropbox-auth-finish' do
|
56
40
|
begin
|
57
|
-
|
41
|
+
access_token, user_id, url_state = get_web_auth.finish(params)
|
42
|
+
rescue DropboxOAuth2Flow::BadRequestError => e
|
43
|
+
return html_page "Error in OAuth 2 flow", "<p>Bad request to /dropbox-auth-finish: #{e}</p>"
|
44
|
+
rescue DropboxOAuth2Flow::BadStateError => e
|
45
|
+
return html_page "Error in OAuth 2 flow", "<p>Auth session expired: #{e}</p>"
|
46
|
+
rescue DropboxOAuth2Flow::CsrfError => e
|
47
|
+
logger.info("/dropbox-auth-finish: CSRF mismatch: #{e}")
|
48
|
+
return html_page "Error in OAuth 2 flow", "<p>CSRF mismatch</p>"
|
49
|
+
rescue DropboxOAuth2Flow::NotApprovedError => e
|
50
|
+
return html_page "Not Approved?", "<p>Why not, bro?</p>"
|
51
|
+
rescue DropboxOAuth2Flow::ProviderError => e
|
52
|
+
return html_page "Error in OAuth 2 flow", "Error redirect from Dropbox: #{e}"
|
58
53
|
rescue DropboxError => e
|
59
|
-
|
54
|
+
logger.info "Error getting OAuth 2 access token: #{e}"
|
55
|
+
return html_page "Error in OAuth 2 flow", "<p>Error getting access token</p>"
|
60
56
|
end
|
61
|
-
|
62
|
-
|
57
|
+
|
58
|
+
# In this simple example, we store the authorized DropboxSession in the session.
|
59
|
+
# A real webapp might store it somewhere more persistent.
|
60
|
+
session[:access_token] = access_token
|
63
61
|
redirect url('/')
|
64
|
-
|
65
|
-
|
62
|
+
end
|
63
|
+
|
64
|
+
get '/dropbox-unlink' do
|
65
|
+
session.delete(:access_token)
|
66
|
+
nil
|
66
67
|
end
|
67
68
|
|
68
69
|
# If we already have an authorized DropboxSession, returns a DropboxClient.
|
69
|
-
def
|
70
|
-
if session[:
|
71
|
-
|
72
|
-
begin
|
73
|
-
return DropboxClient.new(db_session, ACCESS_TYPE)
|
74
|
-
rescue DropboxAuthError => e
|
75
|
-
# The stored session didn't work. Fall through and start OAuth.
|
76
|
-
session[:authorized_db_session].delete
|
77
|
-
end
|
70
|
+
def get_dropbox_client
|
71
|
+
if session[:access_token]
|
72
|
+
return DropboxClient.new(session[:access_token])
|
78
73
|
end
|
79
74
|
end
|
80
75
|
|
@@ -83,34 +78,36 @@ end
|
|
83
78
|
|
84
79
|
get '/' do
|
85
80
|
# Get the DropboxClient object. Redirect to OAuth flow if necessary.
|
86
|
-
|
87
|
-
unless
|
88
|
-
redirect url("/
|
81
|
+
client = get_dropbox_client
|
82
|
+
unless client
|
83
|
+
redirect url("/dropbox-auth-start")
|
89
84
|
end
|
90
85
|
|
91
86
|
# Call DropboxClient.metadata
|
92
87
|
path = params[:path] || '/'
|
93
88
|
begin
|
94
|
-
entry =
|
89
|
+
entry = client.metadata(path)
|
95
90
|
rescue DropboxAuthError => e
|
96
|
-
session.delete(:
|
97
|
-
|
91
|
+
session.delete(:access_token) # An auth error means the access token is probably bad
|
92
|
+
logger.info "Dropbox auth error: #{e}"
|
93
|
+
return html_page "Dropbox auth error"
|
98
94
|
rescue DropboxError => e
|
99
95
|
if e.http_response.code == '404'
|
100
|
-
return html_page "Path not found: #{h path}"
|
96
|
+
return html_page "Path not found: #{h path}"
|
101
97
|
else
|
102
|
-
|
98
|
+
logger.info "Dropbox API error: #{e}"
|
99
|
+
return html_page "Dropbox API error"
|
103
100
|
end
|
104
101
|
end
|
105
102
|
|
106
103
|
if entry['is_dir']
|
107
|
-
render_folder(
|
104
|
+
render_folder(client, entry)
|
108
105
|
else
|
109
|
-
render_file(
|
106
|
+
render_file(client, entry)
|
110
107
|
end
|
111
108
|
end
|
112
109
|
|
113
|
-
def render_folder(
|
110
|
+
def render_folder(client, entry)
|
114
111
|
# Provide an upload form (so the user can add files to this folder)
|
115
112
|
out = "<form action='/upload' method='post' enctype='multipart/form-data'>"
|
116
113
|
out += "<label for='file'>Upload file:</label> <input name='file' type='file'/>"
|
@@ -128,7 +125,7 @@ def render_folder(db_client, entry)
|
|
128
125
|
html_page "Folder: #{entry['path']}", out
|
129
126
|
end
|
130
127
|
|
131
|
-
def render_file(
|
128
|
+
def render_file(client, entry)
|
132
129
|
# Just dump out metadata hash
|
133
130
|
html_page "File: #{entry['path']}", "<pre>#{h entry.pretty_inspect}</pre>"
|
134
131
|
end
|
@@ -144,19 +141,21 @@ post '/upload' do
|
|
144
141
|
end
|
145
142
|
|
146
143
|
# Get the DropboxClient object.
|
147
|
-
|
148
|
-
unless
|
144
|
+
client = get_dropbox_client
|
145
|
+
unless client
|
149
146
|
return html_page "Upload error", "<p>Not linked with a Dropbox account.</p>"
|
150
147
|
end
|
151
148
|
|
152
149
|
# Call DropboxClient.put_file
|
153
150
|
begin
|
154
|
-
entry =
|
151
|
+
entry = client.put_file("#{params[:folder]}/#{name}", temp_file.read)
|
155
152
|
rescue DropboxAuthError => e
|
156
|
-
session.delete(:
|
157
|
-
|
153
|
+
session.delete(:access_token) # An auth error means the access token is probably bad
|
154
|
+
logger.info "Dropbox auth error: #{e}"
|
155
|
+
return html_page "Dropbox auth error"
|
158
156
|
rescue DropboxError => e
|
159
|
-
|
157
|
+
logger.info "Dropbox API error: #{e}"
|
158
|
+
return html_page "Dropbox API error"
|
160
159
|
end
|
161
160
|
|
162
161
|
html_page "Upload complete", "<pre>#{h entry.pretty_inspect}</pre>"
|
@@ -164,13 +163,18 @@ end
|
|
164
163
|
|
165
164
|
# -------------------------------------------------------------------
|
166
165
|
|
167
|
-
def html_page(title, body)
|
166
|
+
def html_page(title, body='')
|
168
167
|
"<html>" +
|
169
168
|
"<head><title>#{h title}</title></head>" +
|
170
169
|
"<body><h1>#{h title}</h1>#{body}</body>" +
|
171
170
|
"</html>"
|
172
171
|
end
|
173
172
|
|
173
|
+
# Rack will issue a warning if no session secret key is set. A real web app would not have
|
174
|
+
# a hard-coded secret in the code but would load it from a config file.
|
175
|
+
use Rack::Session::Cookie, :secret => 'dummy_secret'
|
176
|
+
|
177
|
+
set :port, 5000
|
174
178
|
enable :sessions
|
175
179
|
|
176
180
|
helpers do
|
metadata
CHANGED
@@ -1,40 +1,45 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: dropbox-sdk
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 3
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 6
|
9
|
+
version: "1.6"
|
6
10
|
platform: ruby
|
7
|
-
authors:
|
11
|
+
authors:
|
8
12
|
- Dropbox, Inc.
|
9
13
|
autorequire:
|
10
14
|
bindir: bin
|
11
15
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
16
|
+
|
17
|
+
date: 2013-07-08 00:00:00 Z
|
18
|
+
dependencies:
|
19
|
+
- !ruby/object:Gem::Dependency
|
15
20
|
name: json
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '0'
|
22
|
-
type: :runtime
|
23
21
|
prerelease: false
|
24
|
-
|
22
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
23
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
hash: 3
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
version: "0"
|
31
|
+
type: :runtime
|
32
|
+
version_requirements: *id001
|
33
|
+
description: " A library that provides a plain function-call interface to the\n Dropbox API web endpoints.\n"
|
34
|
+
email:
|
33
35
|
- support-api@dropbox.com
|
34
36
|
executables: []
|
37
|
+
|
35
38
|
extensions: []
|
39
|
+
|
36
40
|
extra_rdoc_files: []
|
37
|
-
|
41
|
+
|
42
|
+
files:
|
38
43
|
- CHANGELOG
|
39
44
|
- LICENSE
|
40
45
|
- README
|
@@ -44,28 +49,37 @@ files:
|
|
44
49
|
- lib/dropbox_sdk.rb
|
45
50
|
- lib/trusted-certs.crt
|
46
51
|
homepage: http://www.dropbox.com/developers/
|
47
|
-
licenses:
|
52
|
+
licenses:
|
48
53
|
- MIT
|
49
54
|
post_install_message:
|
50
55
|
rdoc_options: []
|
51
|
-
|
56
|
+
|
57
|
+
require_paths:
|
52
58
|
- lib
|
53
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
54
60
|
none: false
|
55
|
-
requirements:
|
56
|
-
- -
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
|
59
|
-
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
hash: 3
|
65
|
+
segments:
|
66
|
+
- 0
|
67
|
+
version: "0"
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
69
|
none: false
|
61
|
-
requirements:
|
62
|
-
- -
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
hash: 3
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
version: "0"
|
65
77
|
requirements: []
|
78
|
+
|
66
79
|
rubyforge_project:
|
67
|
-
rubygems_version: 1.8.
|
80
|
+
rubygems_version: 1.8.25
|
68
81
|
signing_key:
|
69
82
|
specification_version: 3
|
70
83
|
summary: Dropbox REST API Client.
|
71
84
|
test_files: []
|
85
|
+
|