dropio 3.0.0.pre1 → 3.0.0.pre2

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/dropio.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{dropio}
5
- s.version = "3.0.0.pre1"
5
+ s.version = "3.0.0.pre2"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Jake Good"]
data/lib/dropio/api.rb CHANGED
@@ -16,12 +16,11 @@ class Dropio::Api
16
16
  end
17
17
 
18
18
  def drop(drop_name, token = nil)
19
- self.class.get("/drops/#{drop_name}", :query => {:token => token})
19
+ self.class.get("/drops/#{drop_name}", :query => sign_if_needed({:token => token}))
20
20
  end
21
21
 
22
22
  def manager_drops(manager_api_token, page = 1)
23
- # Locked to version 2.0 as there's a bug in 3.0
24
- self.class.get("/accounts/drops", :query => {:version=> '2.0', :manager_api_token => manager_api_token, :page => page})
23
+ self.class.get("/accounts/drops", :query => sign_if_needed({:manager_api_token => manager_api_token, :page => page}))
25
24
  end
26
25
 
27
26
  def generate_drop_url(drop_name, token)
@@ -29,42 +28,42 @@ class Dropio::Api
29
28
  end
30
29
 
31
30
  def create_drop(params = {})
32
- self.class.post("/drops",:body => params)
31
+ self.class.post("/drops",:body => sign_if_needed(params))
33
32
  end
34
33
 
35
34
  def update_drop(drop_name, admin_token, params = {})
36
35
  params[:token] = admin_token
37
- self.class.put("/drops/#{drop_name}", :body => params)
36
+ self.class.put("/drops/#{drop_name}", :body => sign_if_needed(params))
38
37
  end
39
38
 
40
39
  def change_drop_name(drop_name, admin_token, new_name)
41
40
  params = {:token => admin_token, :name => new_name}
42
- self.class.put("/drops/#{drop_name}", :body => params)
41
+ self.class.put("/drops/#{drop_name}", :body => sign_if_needed(params))
43
42
  end
44
43
 
45
44
  def empty_drop(drop_name, admin_token)
46
- self.class.put("/drops/#{drop_name}/empty", :query => {:token => admin_token})
45
+ self.class.put("/drops/#{drop_name}/empty", :query => sign_if_needed({:token => admin_token}))
47
46
  end
48
47
 
49
48
  def delete_drop(drop_name, admin_token)
50
- self.class.delete("/drops/#{drop_name}", :query => {:token => admin_token})
49
+ self.class.delete("/drops/#{drop_name}", :query => sign_if_needed({:token => admin_token}))
51
50
  end
52
51
 
53
52
  def promote_nick(drop_name, nick, admin_token)
54
- self.class.post("/drops/#{drop_name}", :query => {:nick => nick, :token => admin_token})
53
+ self.class.post("/drops/#{drop_name}", :query => sign_if_needed({:nick => nick, :token => admin_token}))
55
54
  end
56
55
 
57
56
  def drop_upload_code(drop_name, token = nil)
58
- self.class.get("/drops/#{drop_name}/upload_code", :query => {:token => token})
57
+ self.class.get("/drops/#{drop_name}/upload_code", :query => sign_if_needed({:token => token}))
59
58
  end
60
59
 
61
60
  def create_link(drop_name, url, title = nil, description = nil, token = nil)
62
- self.class.post("/drops/#{drop_name}/assets", :body => {:url => url, :title => title, :description => description, :token => token})
61
+ self.class.post("/drops/#{drop_name}/assets", :body => sign_if_needed({:url => url, :title => title, :description => description, :token => token}))
63
62
  end
64
63
 
65
64
  def create_note(drop_name, contents, title = nil, description = nil, token = nil)
66
65
  params = {:contents => contents, :title => title, :token => token, :description => description}
67
- self.class.post("/drops/#{drop_name}/assets", :body => params)
66
+ self.class.post("/drops/#{drop_name}/assets", :body => sign_if_needed(params))
68
67
  end
69
68
 
70
69
  def add_file(drop_name, file_path, description = nil, convert_to = nil, pingback_url = nil, comment = nil, token = nil)
@@ -73,9 +72,9 @@ class Dropio::Api
73
72
  File.open(file_path) do |file|
74
73
  mime_type = (MIME::Types.type_for(file_path)[0] || MIME::Types["application/octet-stream"][0])
75
74
  req = Net::HTTP::Post::Multipart.new url.path,
76
- { 'api_key' => self.class.default_params[:api_key], 'drop_name' => drop_name, 'format' => 'json', 'description' => description,
75
+ sign_if_needed({ 'api_key' => self.class.default_params[:api_key], 'drop_name' => drop_name, 'format' => 'json', 'description' => description,
77
76
  'token' => token, 'version' => Dropio::Config.version, 'convert_to' => convert_to, 'pingback_url' => pingback_url,
78
- 'comment' => comment, 'file' => UploadIO.new(file, mime_type, file_path) }
77
+ 'comment' => comment, 'file' => UploadIO.new(file, mime_type, file_path) })
79
78
  http = Net::HTTP.new(url.host, url.port)
80
79
  http.set_debug_output $stderr if Dropio::Config.debug
81
80
  r = http.start{|http| http.request(req)}
@@ -85,108 +84,152 @@ class Dropio::Api
85
84
  end
86
85
 
87
86
  def add_file_from_url(drop_name, url, description = nil, convert_to = nil, pingback_url = nil, token = nil)
88
- self.class.post("/drops/#{drop_name}/assets", :body => {:token => token, :file_url => url, :description => description, :convert_to => convert_to, :pingback_url => pingback_url})
87
+ self.class.post("/drops/#{drop_name}/assets", :body => sign_if_needed({:token => token, :file_url => url, :description => description, :convert_to => convert_to, :pingback_url => pingback_url}))
89
88
  end
90
89
 
91
90
  def assets(drop_name, page = 1, order = :oldest, token = nil)
92
- self.class.get("/drops/#{drop_name}/assets", :query => {:token => token, :page => page, :order => order.to_s, :show_pagination_details => true})
91
+ self.class.get("/drops/#{drop_name}/assets", :query => sign_if_needed({:token => token, :page => page, :order => order.to_s, :show_pagination_details => true}))
93
92
  end
94
93
 
95
94
  def asset(drop_name, asset_name, token = nil)
96
- self.class.get("/drops/#{drop_name}/assets/#{asset_name}", :query => {:token => token})
95
+ self.class.get("/drops/#{drop_name}/assets/#{asset_name}", :query => sign_if_needed({:token => token}))
97
96
  end
98
97
 
99
98
  def generate_asset_url(drop_name, asset_name, token)
100
99
  signed_url(drop_name, token, asset_name)
101
100
  end
102
101
 
103
- def generate_original_file_url(drop_name, asset_name, token)
104
- Dropio::Config.api_url + "/drops/#{drop_name}/assets/#{asset_name}/download/original?version=#{Dropio::Config.version}&api_key=#{self.class.default_params[:api_key]}&format=json&token=#{token}"
102
+ def generate_original_file_url(drop_name, asset_name, time_to_live = 600)
103
+ #TODO - signed download URLs
104
+ #this is now available via the API response itself
105
+ download_url = Dropio::Config.api_url + "/drops/#{drop_name}/assets/#{asset_name}/download/original?"
106
+ params = {:version => Dropio::Config.version, :api_key=>self.class.default_params[:api_key], :format=>'json'}
107
+ params = sign_if_needed(params)
108
+ paramstring = ''
109
+ params.each do |k, v|
110
+ paramstring << "#{k}=#{v}&"
111
+ end
112
+ paramstring.chop!
113
+ download_url += paramstring
105
114
  end
106
115
 
107
116
  def asset_embed_code(drop_name, asset_name, token = nil)
108
- self.class.get("/drops/#{drop_name}/assets/#{asset_name}/embed_code", :query => {:token => token})
117
+ self.class.get("/drops/#{drop_name}/assets/#{asset_name}/embed_code", :query => sign_if_needed({:token => token}))
109
118
  end
110
119
 
111
120
  def update_asset(drop_name, asset_name, params = {}, token = nil)
112
121
  params[:token] = token
113
- self.class.put("/drops/#{drop_name}/assets/#{asset_name}", :body => params)
122
+ self.class.put("/drops/#{drop_name}/assets/#{asset_name}", :body => sign_if_needed(params))
114
123
  end
115
124
 
116
125
  def change_asset_name(drop_name, asset_name, token, new_name)
117
126
  params = {:token => token, :name => new_name}
118
- self.class.put("/drops/#{drop_name}/assets/#{asset_name}", :body => params)
127
+ self.class.put("/drops/#{drop_name}/assets/#{asset_name}", :body => sign_if_needed(params))
119
128
  end
120
129
 
121
130
  def delete_asset(drop_name, asset_name, token = nil)
122
- self.class.delete("/drops/#{drop_name}/assets/#{asset_name}", :body => {:token => token})
131
+ self.class.delete("/drops/#{drop_name}/assets/#{asset_name}", :body => sign_if_needed({:token => token}))
123
132
  end
124
133
 
125
134
  def send_asset_to_drop(drop_name, asset_name, target_drop, drop_token = nil, token = nil)
126
- self.class.post("/drops/#{drop_name}/assets/#{asset_name}/send_to", :body => {:medium => "drop", :drop_name => target_drop, :token => token, :drop_token => drop_token})
135
+ self.class.post("/drops/#{drop_name}/assets/#{asset_name}/send_to", :body => sign_if_needed({:medium => "drop", :drop_name => target_drop, :token => token, :drop_token => drop_token}))
127
136
  end
128
137
 
129
138
  def send_asset_to_fax(drop_name, asset_name, fax_number, token = nil)
130
- self.class.post("/drops/#{drop_name}/assets/#{asset_name}/send_to", :body => {:medium => "fax", :fax_number => fax_number, :token => token})
139
+ self.class.post("/drops/#{drop_name}/assets/#{asset_name}/send_to", :body => sign_if_needed({:medium => "fax", :fax_number => fax_number, :token => token}))
131
140
  end
132
141
 
133
142
  def send_asset_to_emails(drop_name, asset_name, emails, message = nil, token = nil)
134
- self.class.post("/drops/#{drop_name}/assets/#{asset_name}/send_to", :body => {:medium => "emails", :emails => emails, message => message, :token => token})
143
+ self.class.post("/drops/#{drop_name}/assets/#{asset_name}/send_to", :body => sign_if_needed({:medium => "emails", :emails => emails, message => message, :token => token}))
135
144
  end
136
145
 
137
146
  def copy_asset(drop_name, asset_name, target_drop, target_drop_token, token = nil)
138
147
  params = {:token => token, :drop_name => target_drop, :drop_token => target_drop_token}
139
- self.class.post("/drops/#{drop_name}/assets/#{asset_name}/copy", :body => params)
148
+ self.class.post("/drops/#{drop_name}/assets/#{asset_name}/copy", :body => sign_if_needed(params))
140
149
  end
141
150
 
142
151
  def move_asset(drop_name, asset_name, target_drop, target_drop_token, token = nil)
143
152
  params = {:token => token, :drop_name => target_drop, :drop_token => target_drop_token}
144
- self.class.post("/drops/#{drop_name}/assets/#{asset_name}/move", :body => params)
153
+ self.class.post("/drops/#{drop_name}/assets/#{asset_name}/move", :body => sign_if_needed(params))
145
154
  end
146
155
 
147
156
  def comments(drop_name, asset_name, page = 1, token = nil)
148
- self.class.get("/drops/#{drop_name}/assets/#{asset_name}/comments", :query => {:token => token, :page => page, :show_pagination_details => true})
157
+ self.class.get("/drops/#{drop_name}/assets/#{asset_name}/comments", :query => sign_if_needed({:token => token, :page => page, :show_pagination_details => true}))
149
158
  end
150
159
 
151
160
  def create_comment(drop_name, asset_name, contents, token = nil)
152
- self.class.post("/drops/#{drop_name}/assets/#{asset_name}/comments",:body => {:contents => contents, :token => token})
161
+ self.class.post("/drops/#{drop_name}/assets/#{asset_name}/comments",:body => sign_if_needed({:contents => contents, :token => token}))
153
162
  end
154
163
 
155
164
  def comment(drop_name, asset_name, comment_id, token = nil)
156
- self.class.get("/drops/#{drop_name}/assets/#{asset_name}/comments/#{comment_id}", :query => {:token => token})
165
+ self.class.get("/drops/#{drop_name}/assets/#{asset_name}/comments/#{comment_id}", :query => sign_if_needed({:token => token}))
157
166
  end
158
167
 
159
168
  def update_comment(drop_name, asset_name, comment_id, contents, admin_token)
160
- self.class.put("/drops/#{drop_name}/assets/#{asset_name}/comments/#{comment_id}", :body => {:contents => contents, :token => admin_token})
169
+ self.class.put("/drops/#{drop_name}/assets/#{asset_name}/comments/#{comment_id}", :body => sign_if_needed({:contents => contents, :token => admin_token}))
161
170
  end
162
171
 
163
172
  def delete_comment(drop_name, asset_name, comment_id, admin_token)
164
- self.class.delete("/drops/#{drop_name}/assets/#{asset_name}/comments/#{comment_id}", :body => {:token => admin_token})
173
+ self.class.delete("/drops/#{drop_name}/assets/#{asset_name}/comments/#{comment_id}", :body => sign_if_needed({:token => admin_token}))
165
174
  end
166
175
 
167
176
  def create_twitter_subscription(drop_name, username, password, message = nil, events = {}, token = nil)
168
- self.class.post("/drops/#{drop_name}/subscriptions", :body => { :token => token, :type => "twitter", :username => username, :password => password, :message => message}.merge(events))
177
+ self.class.post("/drops/#{drop_name}/subscriptions", :body => sign_if_needed({ :token => token, :type => "twitter", :username => username, :password => password, :message => message}.merge(events)))
169
178
  end
170
179
 
171
180
  def create_pingback_subscription(drop_name, url, events = {}, token = nil)
172
- self.class.post("/drops/#{drop_name}/subscriptions", :body => { :token => token, :type => "pingback", :url => url}.merge(events))
181
+ self.class.post("/drops/#{drop_name}/subscriptions", :body => sign_if_needed({ :token => token, :type => "pingback", :url => url}.merge(events)))
173
182
  end
174
183
 
175
184
  def create_email_subscription(drop_name, emails, message = nil, welcome_message = nil, welcome_subject = nil, welcome_from = nil, events = {}, token = nil)
176
185
  params = {:token => token, :type => "email", :emails => emails, :message => message, :welcome_from => welcome_from , :welcome_subject => welcome_subject, :welcome_message => welcome_message }.merge(events)
177
- self.class.post("/drops/#{drop_name}/subscriptions", :body => params)
186
+ self.class.post("/drops/#{drop_name}/subscriptions", :body => sign_if_needed(params))
178
187
  end
179
188
 
180
189
  def subscriptions(drop_name, page, admin_token)
181
- self.class.get("/drops/#{drop_name}/subscriptions", :query => {:token => admin_token, :page => page, :show_pagination_details => true})
190
+ self.class.get("/drops/#{drop_name}/subscriptions", :query => sign_if_needed({:token => admin_token, :page => page, :show_pagination_details => true}))
182
191
  end
183
192
 
184
193
  def delete_subscription(drop_name, subscription_id, admin_token)
185
- self.class.delete("/drops/#{drop_name}/subscriptions/#{subscription_id}", :body => {:token => admin_token})
194
+ self.class.delete("/drops/#{drop_name}/subscriptions/#{subscription_id}", :body => sign_if_needed({:token => admin_token}))
195
+ end
196
+
197
+ def get_signature(params={})
198
+ #returns a signature for the passed params, without any modifcation to the params
199
+ params = sign_request(params)
200
+ params[:signature]
186
201
  end
187
202
 
188
203
  private
189
204
 
205
+ def sign_request(params={})
206
+ #returns all params, including signature and any required params for signing (currently only timestamp)
207
+ params_for_sig = params.clone
208
+ params_for_sig[:api_key] = Dropio::Config.api_key.to_s
209
+ params_for_sig[:version] = Dropio::Config.version.to_s
210
+ params_for_sig[:format] ||= 'json'
211
+ paramstring = ''
212
+ params_for_sig.keys.sort_by {|s| s.to_s}.each {|key| paramstring += key.to_s + '=' + params_for_sig[key].to_s}
213
+ params[:signature] = Digest::SHA1.hexdigest(paramstring + Dropio::Config.api_secret)
214
+ params
215
+ end
216
+
217
+ def sign_if_needed(params = {})
218
+ if Dropio::Config.api_secret
219
+ params = add_required_params(params)
220
+ params = sign_request(params)
221
+ params
222
+ else
223
+ params
224
+ end
225
+ end
226
+
227
+ def add_required_params(params = {})
228
+ #10 minute window
229
+ params[:timestamp] = (Time.now.to_i + 600).to_s
230
+ params
231
+ end
232
+
190
233
  def signed_url(drop_name, token, asset_name = nil)
191
234
  # 10 minute window.
192
235
  expires = (Time.now.utc + 10*60).to_i
data/lib/dropio/asset.rb CHANGED
@@ -84,8 +84,8 @@ class Dropio::Asset < Dropio::Resource
84
84
  end
85
85
 
86
86
  # Generates a url if there's access to the original file.
87
- def original_file_url
88
- Dropio::Resource.client.generate_original_file_url(self) if self.can_download_original
87
+ def original_file_url(time_to_live = 600)
88
+ Dropio::Resource.client.generate_original_file_url(self)
89
89
  end
90
90
 
91
91
  end
data/lib/dropio.rb CHANGED
@@ -8,7 +8,7 @@ module Dropio
8
8
 
9
9
  class Config
10
10
  class << self
11
- attr_accessor :api_key, :base_url, :api_url, :upload_url, :version, :debug, :timeout
11
+ attr_accessor :api_key, :api_secret, :base_url, :api_url, :upload_url, :version, :debug, :timeout
12
12
  end
13
13
  end
14
14
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dropio
3
3
  version: !ruby/object:Gem::Version
4
- hash: -1876988208
4
+ hash: -1876988207
5
5
  prerelease: true
6
6
  segments:
7
7
  - 3
8
8
  - 0
9
9
  - 0
10
- - pre1
11
- version: 3.0.0.pre1
10
+ - pre2
11
+ version: 3.0.0.pre2
12
12
  platform: ruby
13
13
  authors:
14
14
  - Jake Good