dropio 3.0.0.pre1 → 3.0.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
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