s3_swf_upload 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. data/.gitignore +6 -0
  2. data/CHANGELOG +26 -0
  3. data/Gemfile +4 -0
  4. data/MIT-LICENSE +20 -0
  5. data/Manifest +34 -0
  6. data/README.textile +223 -0
  7. data/Rakefile +14 -0
  8. data/flex_src/bin-release/flex-config.xml +361 -0
  9. data/flex_src/compile +2 -0
  10. data/flex_src/src/Globals.as +15 -0
  11. data/flex_src/src/S3Uploader.as +204 -0
  12. data/flex_src/src/com/adobe/net/MimeTypeMap.as +196 -0
  13. data/flex_src/src/com/elctech/S3UploadOptions.as +32 -0
  14. data/flex_src/src/com/elctech/S3UploadRequest.as +259 -0
  15. data/flex_src/src/com/nathancolgate/s3_swf_upload/BrowseButton.as +55 -0
  16. data/flex_src/src/com/nathancolgate/s3_swf_upload/S3Queue.as +117 -0
  17. data/flex_src/src/com/nathancolgate/s3_swf_upload/S3Signature.as +118 -0
  18. data/flex_src/src/com/nathancolgate/s3_swf_upload/S3Upload.as +111 -0
  19. data/lib/patch/integer.rb +12 -0
  20. data/lib/s3_swf_upload/railtie.rb +16 -0
  21. data/lib/s3_swf_upload/railties/generators/s3_swf_upload.rb +19 -0
  22. data/lib/s3_swf_upload/railties/generators/uploader/USAGE +10 -0
  23. data/lib/s3_swf_upload/railties/generators/uploader/templates/amazon_s3.yml +20 -0
  24. data/lib/s3_swf_upload/railties/generators/uploader/templates/s3_down_button.gif +0 -0
  25. data/lib/s3_swf_upload/railties/generators/uploader/templates/s3_over_button.gif +0 -0
  26. data/lib/s3_swf_upload/railties/generators/uploader/templates/s3_up_button.gif +0 -0
  27. data/lib/s3_swf_upload/railties/generators/uploader/templates/s3_upload.js +118 -0
  28. data/lib/s3_swf_upload/railties/generators/uploader/templates/s3_upload.swf +0 -0
  29. data/lib/s3_swf_upload/railties/generators/uploader/templates/s3_uploads_controller.rb +53 -0
  30. data/lib/s3_swf_upload/railties/generators/uploader/uploader_generator.rb +20 -0
  31. data/lib/s3_swf_upload/railties/tasks/crossdomain.xml +5 -0
  32. data/lib/s3_swf_upload/s3_config.rb +43 -0
  33. data/lib/s3_swf_upload/signature.rb +203 -0
  34. data/lib/s3_swf_upload/view_helpers.rb +171 -0
  35. data/lib/s3_swf_upload.rb +10 -0
  36. data/s3_swf_upload.gemspec +29 -0
  37. metadata +103 -0
@@ -0,0 +1,203 @@
1
+ module S3SwfUpload
2
+ module Signature
3
+ $hexcase = false # hex output format. false - lowercase; true - uppercase
4
+ $b64pad = "=" # base-64 pad character. "=" for strict RFC compliance
5
+ $chrsz = 8 # bits per input character. 8 - ASCII; 16 - Unicode
6
+
7
+ def hex_sha1(s)
8
+ return binb2hex(core_sha1(str2binb(s), s.length * $chrsz))
9
+ end
10
+
11
+ def b64_hmac_sha1(key, data)
12
+ return binb2b64(core_hmac_sha1(key, data))
13
+ end
14
+
15
+ # Absolute barebones "unit" tests
16
+ def assert(expr)
17
+ raise 'Assertion failed' unless (expr)
18
+ end
19
+
20
+ def self_test
21
+ num, cnt = [1732584193, 5]
22
+
23
+ assert(core_sha1(str2binb('abc'), 'abc'.length) == [-519653305, -1566383753, -2070791546, -753729183, -204968198])
24
+ assert(rol(num, cnt) == -391880660)
25
+ assert(safe_add(2042729798, num) == -519653305)
26
+ assert((num.js_shl(cnt)) == -391880672)
27
+ assert((num.js_shr_zf(32 - cnt)) == 12)
28
+ assert(sha1_ft(0, -271733879, -1732584194, 271733878) == -1732584194)
29
+ assert(sha1_kt(0) == 1518500249)
30
+ assert(safe_add(safe_add(rol(num, cnt), sha1_ft(0, -271733879, -1732584194, 271733878)), safe_add(safe_add(-1009589776, 1902273280), sha1_kt(0))) == 286718899)
31
+ assert(str2binb('foo bar hey there') == [1718578976, 1650553376, 1751480608, 1952998770, 1694498816])
32
+ assert(hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d")
33
+ assert(b64_hmac_sha1("foo", "abc") == "frFXMR9cNoJdsSPnjebZpBhUKzI=")
34
+ end
35
+
36
+ # Calculate the SHA-1 of an array of big-endian words, and a bit length
37
+ def core_sha1(x, len)
38
+ # append padding
39
+ x[len >> 5] ||= 0
40
+ x[len >> 5] |= 0x80 << (24 - len % 32)
41
+ x[((len + 64 >> 9) << 4) + 15] = len
42
+
43
+ w = Array.new(80, 0)
44
+ a = 1732584193
45
+ b = -271733879
46
+ c = -1732584194
47
+ d = 271733878
48
+ e = -1009589776
49
+
50
+ #for(var i = 0; i < x.length; i += 16)
51
+ i = 0
52
+ while(i < x.length)
53
+ olda = a
54
+ oldb = b
55
+ oldc = c
56
+ oldd = d
57
+ olde = e
58
+
59
+ #for(var j = 0; j < 80; j++)
60
+ j = 0
61
+ while(j < 80)
62
+ if(j < 16)
63
+ w[j] = x[i + j] || 0
64
+ else
65
+ w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1)
66
+ end
67
+
68
+ t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)),
69
+ safe_add(safe_add(e, w[j]), sha1_kt(j)))
70
+ e = d
71
+ d = c
72
+ c = rol(b, 30)
73
+ b = a
74
+ a = t
75
+ j += 1
76
+ end
77
+
78
+ a = safe_add(a, olda)
79
+ b = safe_add(b, oldb)
80
+ c = safe_add(c, oldc)
81
+ d = safe_add(d, oldd)
82
+ e = safe_add(e, olde)
83
+ i += 16
84
+ end
85
+ return [a, b, c, d, e]
86
+ end
87
+
88
+ # Perform the appropriate triplet combination function for the current
89
+ # iteration
90
+ def sha1_ft(t, b, c, d)
91
+ return (b & c) | ((~b) & d) if(t < 20)
92
+ return b ^ c ^ d if(t < 40)
93
+ return (b & c) | (b & d) | (c & d) if(t < 60)
94
+ return b ^ c ^ d;
95
+ end
96
+
97
+ # Determine the appropriate additive constant for the current iteration
98
+ def sha1_kt(t)
99
+ return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
100
+ (t < 60) ? -1894007588 : -899497514
101
+ end
102
+
103
+ # Calculate the HMAC-SHA1 of a key and some data
104
+ def core_hmac_sha1(key, data)
105
+ bkey = str2binb(key)
106
+ if(bkey.length > 16)
107
+ bkey = core_sha1(bkey, key.length * $chrsz)
108
+ end
109
+
110
+ ipad = Array.new(16, 0)
111
+ opad = Array.new(16, 0)
112
+ #for(var i = 0; i < 16; i++)
113
+ i = 0
114
+ while(i < 16)
115
+ ipad[i] = (bkey[i] || 0) ^ 0x36363636
116
+ opad[i] = (bkey[i] || 0) ^ 0x5C5C5C5C
117
+ i += 1
118
+ end
119
+
120
+ hash = core_sha1((ipad + str2binb(data)), 512 + data.length * $chrsz)
121
+ return core_sha1((opad + hash), 512 + 160)
122
+ end
123
+
124
+ # Add integers, wrapping at 2^32. This uses 16-bit operations internally
125
+ # to work around bugs in some JS interpreters.
126
+ def safe_add(x, y)
127
+ v = (x+y) % (2**32)
128
+ return v > 2**31 ? v- 2**32 : v
129
+ end
130
+
131
+ # Bitwise rotate a 32-bit number to the left.
132
+ def rol(num, cnt)
133
+ #return (num << cnt) | (num >>> (32 - cnt))
134
+ return (num.js_shl(cnt)) | (num.js_shr_zf(32 - cnt))
135
+ end
136
+
137
+ # Convert an 8-bit or 16-bit string to an array of big-endian words
138
+ # In 8-bit function, characters >255 have their hi-byte silently ignored.
139
+ def str2binb(str)
140
+ bin = []
141
+ mask = (1 << $chrsz) - 1
142
+ #for(var i = 0; i < str.length * $chrsz; i += $chrsz)
143
+ i = 0
144
+ while(i < str.length * $chrsz)
145
+ bin[i>>5] ||= 0
146
+ bin[i>>5] |= (str[i / $chrsz].ord & mask) << (32 - $chrsz - i%32)
147
+ i += $chrsz
148
+ end
149
+ return bin
150
+ end
151
+
152
+ # Convert an array of big-endian words to a string
153
+ # function binb2str(bin)
154
+ # {
155
+ # var str = "";
156
+ # var mask = (1 << $chrsz) - 1;
157
+ # for(var i = 0; i < bin.length * 32; i += $chrsz)
158
+ # str += String.fromCharCode((bin[i>>5] >>> (32 - $chrsz - i%32)) & mask);
159
+ # return str;
160
+ # }
161
+ #
162
+
163
+ # Convert an array of big-endian words to a hex string.
164
+ def binb2hex(binarray)
165
+ hex_tab = $hexcase ? "0123456789ABCDEF" : "0123456789abcdef"
166
+ str = ""
167
+ #for(var i = 0; i < binarray.length * 4; i++)
168
+ i = 0
169
+ while(i < binarray.length * 4)
170
+ str += hex_tab[(binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF].chr +
171
+ hex_tab[(binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF].chr
172
+ i += 1
173
+ end
174
+ return str;
175
+ end
176
+
177
+ # Convert an array of big-endian words to a base-64 string
178
+ def binb2b64(binarray)
179
+ tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
180
+ str = ""
181
+
182
+ #for(var i = 0; i < binarray.length * 4; i += 3)
183
+ i = 0
184
+ while(i < binarray.length * 4)
185
+ triplet = (((binarray[i >> 2].to_i >> 8 * (3 - i %4)) & 0xFF) << 16) |
186
+ (((binarray[i+1 >> 2].to_i >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 ) |
187
+ ((binarray[i+2 >> 2].to_i >> 8 * (3 - (i+2)%4)) & 0xFF)
188
+ #for(var j = 0; j < 4; j++)
189
+ j = 0
190
+ while(j < 4)
191
+ if(i * 8 + j * 6 > binarray.length * 32)
192
+ str += $b64pad
193
+ else
194
+ str += tab[(triplet >> 6*(3-j)) & 0x3F].chr
195
+ end
196
+ j += 1
197
+ end
198
+ i += 3
199
+ end
200
+ return str
201
+ end
202
+ end
203
+ end
@@ -0,0 +1,171 @@
1
+ module S3SwfUpload
2
+ module ViewHelpers
3
+ def s3_swf_upload_tag(options = {})
4
+ buttonWidth = options[:buttonWidth] || 100
5
+ buttonHeight = options[:buttonHeight] || 30
6
+ flashVersion = options[:height] || '9.0.0'
7
+ queueSizeLimit = options[:queueSizeLimit] || 100
8
+ fileSizeLimit = options[:fileSizeLimit] || 524288000
9
+ fileTypes = options[:fileTypes] || '*.*'
10
+ fileTypeDescs = options[:fileTypeDescs] || 'All Files'
11
+ selectMultipleFiles = options.has_key?(:selectMultipleFiles) ? options[:selectMultipleFiles] : true
12
+ keyPrefix = options[:keyPrefix] || ''
13
+ signaturePath = options[:signaturePath] || '/s3_uploads.xml'
14
+ swfFilePath = options[:swfFilePath] || '/flash/s3_upload.swf'
15
+ buttonUpPath = options[:buttonUpPath] || '/flash/s3_up_button.gif'
16
+ buttonOverPath = options[:buttonOverPath] || '/flash/s3_over_button.gif'
17
+ buttonDownPath = options[:buttonDownPath] || '/flash/s3_down_button.gif'
18
+
19
+ onFileAdd = options[:onFileAdd] || false
20
+ onFileRemove = options[:onFileRemove] || false
21
+ onFileSizeLimitReached = options[:onFileSizeLimitReached] || false
22
+ onFileNotInQueue = options[:onFileNotInQueue] || false
23
+
24
+ onQueueChange = options[:onQueueChange] || false
25
+ onQueueClear = options[:onQueueClear] || false
26
+ onQueueSizeLimitReached = options[:onQueueSizeLimitReached] || false
27
+ onQueueEmpty = options[:onQueueEmpty] || false
28
+
29
+ onUploadingStop = options[:onUploadingStop] || false
30
+ onUploadingStart = options[:onUploadingStart] || false
31
+ onUploadingFinish = options[:onUploadingFinish] || false
32
+
33
+ onSignatureOpen = options[:onSignatureOpen] || false
34
+ onSignatureProgress = options[:onSignatureProgress] || false
35
+ onSignatureHttpStatus = options[:onSignatureHttpStatus] || false
36
+ onSignatureComplete = options[:onSignatureComplete] || false
37
+ onSignatureSecurityError= options[:onSignatureSecurityError] || false
38
+ onSignatureIOError = options[:onSignatureIOError] || false
39
+ onSignatureXMLError = options[:onSignatureXMLError] || false
40
+
41
+ onUploadOpen = options[:onUploadOpen] || false
42
+ onUploadProgress = options[:onUploadProgress] || false
43
+ onUploadHttpStatus = options[:onUploadHttpStatus] || false
44
+ onUploadComplete = options[:onUploadComplete] || false
45
+ onUploadIOError = options[:onUploadIOError] || false
46
+ onUploadSecurityError = options[:onUploadSecurityError] || false
47
+ onUploadError = options[:onUploadError] || false
48
+
49
+ @include_s3_upload ||= false
50
+ @count ||= 1
51
+
52
+ out = ''
53
+
54
+ if !@include_s3_upload
55
+ out << javascript_include_tag('s3_upload')
56
+ @include_s3_upload = true
57
+ end
58
+
59
+ out << "\n<script type=\"text/javascript\">\n"
60
+ out << "var s3_swf_#{@count}_object = s3_swf_init('s3_swf_#{@count}', {\n"
61
+ out << "buttonWidth: #{buttonWidth},\n" if buttonWidth
62
+ out << "buttonHeight: #{buttonHeight},\n" if buttonHeight
63
+ out << "flashVersion: '#{flashVersion}',\n" if flashVersion
64
+ out << "queueSizeLimit: #{queueSizeLimit},\n" if queueSizeLimit
65
+ out << "fileSizeLimit: #{fileSizeLimit},\n" if fileSizeLimit
66
+ out << "fileTypes: '#{fileTypes}',\n" if fileTypes
67
+ out << "fileTypeDescs: '#{fileTypeDescs}',\n" if fileTypeDescs
68
+ out << "selectMultipleFiles: #{selectMultipleFiles.to_s},\n"
69
+ out << "keyPrefix: '#{keyPrefix}',\n" if keyPrefix
70
+ out << "signaturePath: '#{signaturePath}',\n" if signaturePath
71
+ out << "swfFilePath: '#{swfFilePath}',\n" if swfFilePath
72
+ out << "buttonUpPath: '#{buttonUpPath}',\n" if buttonUpPath
73
+ out << "buttonOverPath: '#{buttonOverPath}',\n" if buttonOverPath
74
+ out << "buttonDownPath: '#{buttonDownPath}',\n" if buttonDownPath
75
+ out << "swfVarObj: 's3_swf_#{@count}_object',\n"
76
+
77
+ out << %(onFileAdd: function(file){
78
+ #{onFileAdd}
79
+ },) if onFileAdd
80
+ out << %(onFileRemove: function(file){
81
+ #{onFileRemove}
82
+ },) if onFileRemove
83
+ out << %(onFileSizeLimitReached: function(file){
84
+ #{onFileSizeLimitReached}
85
+ },) if onFileSizeLimitReached
86
+ out << %(onFileNotInQueue: function(file){
87
+ #{onFileNotInQueue}
88
+ },) if onFileNotInQueue
89
+
90
+ out << %(onQueueChange: function(queue){
91
+ #{onQueueChange}
92
+ },) if onQueueChange
93
+ out << %(onQueueSizeLimitReached: function(queue){
94
+ #{onQueueSizeLimitReached}
95
+ },) if onQueueSizeLimitReached
96
+ out << %(onQueueEmpty: function(queue){
97
+ #{onQueueEmpty}
98
+ },) if onQueueEmpty
99
+ out << %(onQueueClear: function(queue){
100
+ #{onQueueClear}
101
+ },) if onQueueClear
102
+
103
+ out << %(onUploadingStart: function(){
104
+ #{onUploadingStart}
105
+ },) if onUploadingStart
106
+ out << %(onUploadingStop: function(){
107
+ #{onUploadingStop}
108
+ },) if onUploadingStop
109
+ out << %(onUploadingFinish: function(){
110
+ #{onUploadingFinish}
111
+ },) if onUploadingFinish
112
+
113
+ out << %(onSignatureOpen: function(file,event){
114
+ #{onSignatureOpen}
115
+ },) if onSignatureOpen
116
+ out << %(onSignatureProgress: function(file,progress_event){
117
+ #{onSignatureProgress}
118
+ },) if onSignatureProgress
119
+ out << %(onSignatureSecurityError: function(file,security_error_event){
120
+ #{onSignatureSecurityError}
121
+ },) if onSignatureSecurityError
122
+ out << %(onSignatureComplete: function(file,event){
123
+ #{onSignatureComplete}
124
+ },) if onSignatureComplete
125
+ out << %(onSignatureIOError: function(file,io_error_event){
126
+ #{onSignatureIOError}
127
+ },) if onSignatureIOError
128
+ out << %(onSignatureHttpStatus: function(file,http_status_event){
129
+ #{onSignatureHttpStatus}
130
+ },) if onSignatureHttpStatus
131
+ out << %(onSignatureXMLError: function(file,error_message){
132
+ #{onSignatureXMLError}
133
+ },) if onSignatureXMLError
134
+
135
+ out << %(onUploadError: function(upload_options,error){
136
+ #{onUploadError}
137
+ },) if onUploadError
138
+ out << %(onUploadOpen: function(upload_options,event){
139
+ #{onUploadOpen}
140
+ },) if onUploadOpen
141
+ out << %(onUploadProgress: function(upload_options,progress_event){
142
+ #{onUploadProgress}
143
+ },) if onUploadProgress
144
+ out << %(onUploadIOError: function(upload_options,io_error_event){
145
+ #{onUploadIOError}
146
+ },) if onUploadIOError
147
+ out << %(onUploadHttpStatus: function(upload_options,http_status_event){
148
+ #{onUploadHttpStatus}
149
+ },) if onUploadHttpStatus
150
+ out << %(onUploadSecurityError: function(upload_options,security_error_event){
151
+ #{onUploadSecurityError}
152
+ },) if onUploadSecurityError
153
+ out << %(onUploadComplete: function(upload_options,event){
154
+ #{onUploadComplete}
155
+ },) if onUploadComplete
156
+ # This closes out the object (no comma)
157
+ out << "foo: 'bar'"
158
+ out << "});\n"
159
+ out << "</script>\n"
160
+ out << "<div id=\"s3_swf_#{@count}\">\n"
161
+ out << "Please <a href=\"http://www.adobe.com/go/getflashplayer\">Update</a> your Flash Player to Flash v#{flashVersion} or higher...\n"
162
+ out << "</div>\n"
163
+
164
+ @count += 1
165
+ out
166
+ end
167
+
168
+ end
169
+ end
170
+
171
+ ActionView::Base.send(:include, S3SwfUpload::ViewHelpers)
@@ -0,0 +1,10 @@
1
+ require 'patch/integer'
2
+ require 's3_swf_upload/signature'
3
+ require 's3_swf_upload/s3_config'
4
+ require 's3_swf_upload/view_helpers'
5
+
6
+ module S3SwfUpload
7
+ # Rails 3 Railties!
8
+ # https://gist.github.com/af7e572c2dc973add221
9
+ require 's3_swf_upload/railtie' if defined?(Rails)
10
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "s3_swf_upload"
5
+ s.rubyforge_project = "s3_swf_upload"
6
+ s.version = "0.3.2"
7
+ s.rubygems_version = "1.3.6"
8
+ s.date = "2010-11-16"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Nathan Colgate"]
12
+ s.email = "nathan@brandnewbox.com"
13
+ s.homepage = "https://github.com/nathancolgate/s3-swf-upload-plugin"
14
+ s.description = "Rails 3 gem that allows you to upload files directly to S3 from your application using flex for file management, css for presentation, and javascript for behavior."
15
+ s.summary = "Rails 3 gem that allows you to upload files directly to S3 from your application using flex for file management, css for presentation, and javascript for behavior."
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "S3_swf_upload", "--main", "README.textile"]
21
+ s.require_paths = ["lib"]
22
+
23
+ if s.respond_to? :specification_version
24
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
25
+ s.specification_version = 3
26
+
27
+ # if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0')
28
+ end
29
+ end
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: s3_swf_upload
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 3
8
+ - 2
9
+ version: 0.3.2
10
+ platform: ruby
11
+ authors:
12
+ - Nathan Colgate
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-11-16 00:00:00 -08:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: Rails 3 gem that allows you to upload files directly to S3 from your application using flex for file management, css for presentation, and javascript for behavior.
22
+ email: nathan@brandnewbox.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files: []
28
+
29
+ files:
30
+ - .gitignore
31
+ - CHANGELOG
32
+ - Gemfile
33
+ - MIT-LICENSE
34
+ - Manifest
35
+ - README.textile
36
+ - Rakefile
37
+ - flex_src/bin-release/flex-config.xml
38
+ - flex_src/compile
39
+ - flex_src/src/Globals.as
40
+ - flex_src/src/S3Uploader.as
41
+ - flex_src/src/com/adobe/net/MimeTypeMap.as
42
+ - flex_src/src/com/elctech/S3UploadOptions.as
43
+ - flex_src/src/com/elctech/S3UploadRequest.as
44
+ - flex_src/src/com/nathancolgate/s3_swf_upload/BrowseButton.as
45
+ - flex_src/src/com/nathancolgate/s3_swf_upload/S3Queue.as
46
+ - flex_src/src/com/nathancolgate/s3_swf_upload/S3Signature.as
47
+ - flex_src/src/com/nathancolgate/s3_swf_upload/S3Upload.as
48
+ - lib/patch/integer.rb
49
+ - lib/s3_swf_upload.rb
50
+ - lib/s3_swf_upload/railtie.rb
51
+ - lib/s3_swf_upload/railties/generators/s3_swf_upload.rb
52
+ - lib/s3_swf_upload/railties/generators/uploader/USAGE
53
+ - lib/s3_swf_upload/railties/generators/uploader/templates/amazon_s3.yml
54
+ - lib/s3_swf_upload/railties/generators/uploader/templates/s3_down_button.gif
55
+ - lib/s3_swf_upload/railties/generators/uploader/templates/s3_over_button.gif
56
+ - lib/s3_swf_upload/railties/generators/uploader/templates/s3_up_button.gif
57
+ - lib/s3_swf_upload/railties/generators/uploader/templates/s3_upload.js
58
+ - lib/s3_swf_upload/railties/generators/uploader/templates/s3_upload.swf
59
+ - lib/s3_swf_upload/railties/generators/uploader/templates/s3_uploads_controller.rb
60
+ - lib/s3_swf_upload/railties/generators/uploader/uploader_generator.rb
61
+ - lib/s3_swf_upload/railties/tasks/crossdomain.xml
62
+ - lib/s3_swf_upload/s3_config.rb
63
+ - lib/s3_swf_upload/signature.rb
64
+ - lib/s3_swf_upload/view_helpers.rb
65
+ - s3_swf_upload.gemspec
66
+ has_rdoc: true
67
+ homepage: https://github.com/nathancolgate/s3-swf-upload-plugin
68
+ licenses: []
69
+
70
+ post_install_message:
71
+ rdoc_options:
72
+ - --line-numbers
73
+ - --inline-source
74
+ - --title
75
+ - S3_swf_upload
76
+ - --main
77
+ - README.textile
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ segments:
85
+ - 0
86
+ version: "0"
87
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ segments:
92
+ - 1
93
+ - 2
94
+ version: "1.2"
95
+ requirements: []
96
+
97
+ rubyforge_project: s3_swf_upload
98
+ rubygems_version: 1.3.6
99
+ signing_key:
100
+ specification_version: 3
101
+ summary: Rails 3 gem that allows you to upload files directly to S3 from your application using flex for file management, css for presentation, and javascript for behavior.
102
+ test_files: []
103
+