bcms_webdav 1.0.2 → 1.0.4

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/README.rdoc CHANGED
@@ -14,6 +14,8 @@ For more information on WebDAV see: http://en.wikipedia.org/wiki/WebDAV
14
14
  * Users must have 'Administer CMS' permissions in order to access resources via WebDAV.
15
15
  * Users can use their normal cms username and password.
16
16
 
17
+ Note: Currently this module is tested to work on Passenger and Mongrel. Other rack servers may work, but implementations for file upload differ slightly.
18
+
17
19
  === Clients
18
20
 
19
21
  In order to take advantage of this module, users will need a WebDAV client. Many FTP clients will support this, including:
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.2
1
+ 1.0.4
@@ -125,13 +125,13 @@ module Bcms
125
125
 
126
126
  # Handle uploading file.
127
127
  def put(request, response)
128
+ temp_file = extract_tempfile(request)
128
129
 
129
- temp_file = request.body
130
130
  add_rails_like_methods(temp_file)
131
131
 
132
132
  section = find_section_for(path)
133
133
 
134
- file_block = FileBlock.new(:name=>path, :attachment_file=>request.body, :attachment_section => section, :attachment_file_path=>path, :publish_on_save=>true)
134
+ file_block = FileBlock.new(:name=>path, :attachment_file=>temp_file, :attachment_section => section, :attachment_file_path=>path, :publish_on_save=>true)
135
135
  unless file_block.save
136
136
  log "Couldn't save file."
137
137
  file_block.errors.each do |error|
@@ -154,6 +154,28 @@ module Bcms
154
154
 
155
155
  private
156
156
 
157
+ # Different webservers have slightly different behavior for uploaded files.
158
+ # 1. Webrick/mongrel - body is a TempFile
159
+ # 2. Passenger - body is a PhusionPassenger::Utils::RewindableInput
160
+ #
161
+ # Until Rails 3, which may have a consistent middleware for extracting a Tempfile, we have to do it this way.
162
+ def extract_tempfile(request)
163
+ input = request.body
164
+ if input
165
+ # Handle Mongrel
166
+ return input if input.is_a?(Tempfile)
167
+
168
+ # Handle Passenger
169
+ # This is highly brittle and terrible.
170
+ if input.respond_to?(:make_rewindable, true)
171
+ input.size # Force creation of Tempfile
172
+ return input.instance_variable_get(:@rewindable_io)
173
+ end
174
+ end
175
+
176
+
177
+ end
178
+
157
179
  def log_exists(type, path)
158
180
  log "Resource of type '#{type}' with path '#{path}' exists."
159
181
  end
@@ -15,6 +15,7 @@ class WebDavSectionResourceTest < ActiveSupport::TestCase
15
15
 
16
16
  end
17
17
 
18
+
18
19
  test 'users with administrate permissions can access resources' do
19
20
  mock_user = mock()
20
21
  User.expects(:authenticate).with("abc", "123").returns(mock_user)
@@ -292,9 +293,35 @@ class FileResourceTest < ActiveSupport::TestCase
292
293
  test "parse missing slash section" do
293
294
  path = Bcms::WebDAV::Path.new('test.jpg')
294
295
  assert_equal "test.jpg", path.file_name
296
+ end
297
+
298
+ test "extract tempfile from mongrel style requests" do
299
+ tempfile = Tempfile.new("testing")
300
+ @request.expects(:body).returns(tempfile)
301
+
302
+ assert_equal tempfile, @resource.send(:extract_tempfile, @request)
303
+
304
+ end
305
+
306
+ test "extract tempfile from passenger style requests" do
307
+ class FakeRewindable
308
+ def size
309
+ @rewindable_io = 'EXPECTED'
310
+ end
311
+ private
295
312
 
313
+ # Matches passengers rewindable input signature
314
+ def make_rewindable
315
+ 'do nothing'
316
+ end
317
+ end
296
318
 
319
+ rewindable_input = FakeRewindable.new
320
+ @request.expects(:body).returns(rewindable_input)
321
+
322
+ assert_equal 'EXPECTED', @resource.send(:extract_tempfile, @request)
297
323
  end
324
+
298
325
  private
299
326
  def resource_for(path)
300
327
  Bcms::WebDAV::Resource.new(path, path, @request, @response, {})
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bcms_webdav
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 31
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 2
10
- version: 1.0.2
9
+ - 4
10
+ version: 1.0.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - BrowserMedia