caboose-cms 0.4.49 → 0.4.50

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- M2Y4YWZhODBhMmEyYmJjYmI4MDJjZjBmMWNlYmQ2NTk0ODA3NTU2Mg==
4
+ NjVkMTFlNjhiNDVlM2QxY2U5NDI1OGFlMjdiOTZlNTBiNzkxOTEzMA==
5
5
  data.tar.gz: !binary |-
6
- ZWE0N2ZlM2JjZDJhNDA3ZWIxNzhmMGJkYzQ0YzYwOTYyNDFhMWNjZA==
6
+ YmI5ODI3ZGRjZDhjMGVhZjA5MjE3YzgyNzNkY2JjZTBlMjA0ZGZiOQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- NTQwODIyMDA4ZTE4YzY1ZjgyYmFkNGYyOTcyM2YwMTM0NjZjOGQ2YWI1YmIx
10
- MjE4NjUyMzcyMDQyMGIyMzFiYzkzMDkyNzlhM2UxZTYwNGYyZTU5ZjcxMDU5
11
- MWI1MTc3OTFmMzM1MjU4ODUyOGI2MzlhNmQ4MGU3MGMzZmVmYzk=
9
+ N2I4Y2Q0NzcwZjQxOWNiYzU3MDVhNmViOGNiNDFkZTg4N2RiZDQ2ZGZkOTBl
10
+ ZGMzY2QwM2I5ZTNhY2RhN2ZiMzcwMmYxOTFjYjYxMTk4NTVkNGMxZDdmMzc2
11
+ ODVkNmVmZWE4YzgxMTA0ZmMyNTMyOTM0NThiMTUzZTU4MDJhNmQ=
12
12
  data.tar.gz: !binary |-
13
- ZTdjMTE3Y2E5YjM3Njk2MWI2M2U3ZmRjMjRjNjJlZmE3MzJiNDRhMWYyNDgz
14
- ZjIzOWQ5ZGFkOGI3OGQ0MmZiOTc0ZmNjMjExZjRiZGY1ZDQwYjA0NjNkMTVi
15
- N2VjNTExYTI3NzQxODcwNWIwZWZhYmYwZjViNGVjNTI5ZTU5OTA=
13
+ ODU1OGE5OGZjN2M5YjFiMDU5YjdhMTQwM2EwYzZkNmQ5NDgzZmRhNDY2MWQ4
14
+ MDg1NzBjOTg2MWRlNzEyNTJlOTczZDk3ZDgyZGY1YzZmZGYwYjYxYWE1MDhi
15
+ ZTUwZmNmYWVhMDA1NDFlM2U4ZmM3YTkwZGU1OGUzOGRjMjYxZmY=
@@ -0,0 +1 @@
1
+ (function(a,b){a.ajaxPrefilter(function(d,c,e){if(d.iframe){d.originalURL=d.url;return"iframe"}});a.ajaxTransport("iframe",function(l,j,k){var f=null,i=null,e="iframe-"+a.now(),d=a(l.files).filter(":file:enabled"),h=null,c=null;function g(){d.each(function(o,n){var m=a(n);m.data("clone").replaceWith(m)});f.remove();i.one("load",function(){i.remove()});i.attr("src","javascript:false;")}l.dataTypes.shift();l.data=j.data;if(d.length){f=a("<form enctype='multipart/form-data' method='post'></form>").hide().attr({action:l.originalURL,target:e});if(typeof(l.data)==="string"&&l.data.length>0){a.error("data must not be serialized")}a.each(l.data||{},function(m,n){if(a.isPlainObject(n)){m=n.name;n=n.value}a("<input type='hidden' />").attr({name:m,value:n}).appendTo(f)});a("<input type='hidden' value='IFrame' name='X-Requested-With' />").appendTo(f);if(l.dataTypes[0]&&l.accepts[l.dataTypes[0]]){c=l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", */*; q=0.01":"")}else{c=l.accepts["*"]}a("<input type='hidden' name='X-HTTP-Accept'>").attr("value",c).appendTo(f);h=d.after(function(m){var o=a(this),n=o.clone().prop("disabled",true);o.data("clone",n);return n}).next();d.appendTo(f);return{send:function(n,m){i=a("<iframe src='javascript:false;' name='"+e+"' id='"+e+"' style='display:none'></iframe>");i.one("load",function(){i.one("load",function(){var u=this.contentWindow?this.contentWindow.document:(this.contentDocument?this.contentDocument:this.document),q=u.documentElement?u.documentElement:u.body,p=q.getElementsByTagName("textarea")[0],r=p&&p.getAttribute("data-type")||null,o=p&&p.getAttribute("data-status")||200,t=p&&p.getAttribute("data-statusText")||"OK",s={html:q.innerHTML,text:r?p.value:q?(q.textContent||q.innerText):null};g();m(o,t,s,r?("Content-Type: "+r):null)});f[0].submit()});a("body").append(f,i)},abort:function(){if(i!==null){i.unbind("load").attr("src","javascript:false;");g()}}}}})})(jQuery);
@@ -19,8 +19,7 @@ module Caboose
19
19
  # GET /admin/images/new
20
20
  def admin_new
21
21
  return unless user_is_allowed('images', 'add')
22
- @parent_id = params[:parent_id] ? params[:parent_id] : 1
23
- @parent = Page.find(@parent_id)
22
+ @media_category_id = params[:media_category_id]
24
23
  render :layout => 'caboose/admin'
25
24
  end
26
25
 
@@ -217,52 +216,98 @@ module Caboose
217
216
  render json: resp
218
217
  end
219
218
 
220
- # PUT /admin/images/sign-s3
219
+ ## PUT /admin/images/sign-s3
220
+ #def admin_sign_s3
221
+ # return unless user_is_allowed('images', 'add')
222
+ #
223
+ # config = YAML.load(File.read(Rails.root.join('config', 'aws.yml')))[Rails.env]
224
+ # access_key = config['access_key_id']
225
+ # secret_key = config['secret_access_key']
226
+ # bucket = config['bucket']
227
+ # s3 = AWS::S3.new(
228
+ # :access_key_id => access_key,
229
+ # :secret_access_key => secret_key
230
+ # )
231
+ #
232
+ # name = params[:name]
233
+ # mi = MediaImage.create(
234
+ # :media_category_id => params[:media_category_id],
235
+ # :name => params[:name]
236
+ # )
237
+ # pp = s3.buckets[bucket].presigned_post(
238
+ # :key => "media-images/test.jpg", #{mi.id}.#{File.extname(name)}",
239
+ # :expires => DateTime.now + 10.seconds,
240
+ # :success_action_status => 201,
241
+ # :acl => :public_read
242
+ # )
243
+ #
244
+ # render :json => {
245
+ # 'media_image' => mi,
246
+ # 'presigned_post' => {
247
+ # 'url' => pp.url.to_s,
248
+ # 'fields' => pp.fields
249
+ # }
250
+ # }
251
+ #
252
+ # #expires = (DateTime.now.utc + 10.seconds).to_i
253
+ # #amz_headers = "x-amz-acl:public-read"
254
+ # #put_request = "PUT\n\n#{mime_type}\n#{expires}\n#{amz_headers}\n/#{bucket}/media-images/#{object_name}"
255
+ # #signature = CGI.escape(Base64.encode64("#{OpenSSL::HMAC.digest('sha1', secret_key, put_request)}\n"))
256
+ # ##signature = base64.encodestring(hmac.new(secret_key, put_request, sha1).digest())
257
+ # ##signature = urllib.quote_plus(signature.strip())
258
+ # #render :json => {
259
+ # # 'signed_request' => "#{url}?AWSAccessKeyId=#{access_key}&Expires=#{expires}&Signature=#{signature}",
260
+ # # 'url' => url
261
+ # #}
262
+ #
263
+ # #pp = AWS::S3::PresignedPost.new(s3.buckets[bucket],
264
+ # # :key => "media-images/#{object_name}",
265
+ # # :expires => DateTime.now + 10.seconds,
266
+ # # :content_type => mime_type
267
+ # #)
268
+ # #url = "#{pp.url.to_s}#{pp.key}" #"https://#{pp.bucket.name}.s3.amazonaws.com/#{pp.key}"
269
+ # #render :json => {
270
+ # # 'signed_request' => "#{url}?AWSAccessKeyId=#{access_key}&Expires=#{pp.expires.to_time.to_i}&Signature=#{pp.fields[:signature]}",
271
+ # # 'url' => url
272
+ # #}
273
+ #
274
+ #end
275
+
221
276
  def admin_sign_s3
222
- return unless user_is_allowed('images', 'add')
223
-
224
- config = YAML.load(File.read(Rails.root.join('config', 'aws.yml')))[Rails.env]
225
- Caboose.log(config)
226
- access_key = config['access_key_id']
227
- secret_key = config['secret_access_key']
228
- bucket = config['bucket']
229
- s3 = AWS::S3.new(
230
- :access_key_id => access_key,
231
- :secret_access_key => secret_key
232
- )
277
+ @document = Document.create(params[:doc])
233
278
 
234
- object_name = params[:s3_object_name]
235
- mime_type = params[:s3_object_type]
279
+ policy = {"expiration" => 10.seconds.from_now.utc.xmlschema,
280
+ "conditions" => [
281
+ {"bucket" => 'cabooseit'},
282
+ {"acl" => "public-read"},
283
+ {"success_action_status" => "200"}
284
+ ]
285
+ }
286
+ policy = Base64.encode64(policy.to_json).gsub(/\n/,'')
236
287
 
237
- #expires = (DateTime.now.utc + 10.seconds).to_i
238
- #amz_headers = "x-amz-acl:public-read"
239
- #put_request = "PUT\n\n#{mime_type}\n#{expires}\n#{amz_headers}\n/#{bucket}/media-images/#{object_name}"
240
- #signature = CGI.escape(Base64.encode64("#{OpenSSL::HMAC.digest('sha1', secret_key, put_request)}\n"))
241
- ##signature = base64.encodestring(hmac.new(secret_key, put_request, sha1).digest())
242
- ##signature = urllib.quote_plus(signature.strip())
243
- #render :json => {
244
- # 'signed_request' => "#{url}?AWSAccessKeyId=#{access_key}&Expires=#{expires}&Signature=#{signature}",
245
- # 'url' => url
246
- #}
247
-
248
- pp = AWS::S3::PresignedPost.new(s3.buckets[bucket],
249
- :key => "media-images/#{object_name}",
250
- :expires => DateTime.now + 10.seconds,
251
- :content_type => mime_type
252
- )
253
- url = "#{pp.url.to_s}#{pp.key}" #"https://#{pp.bucket.name}.s3.amazonaws.com/#{pp.key}"
254
288
  render :json => {
255
- 'signed_request' => "#{url}?AWSAccessKeyId=#{access_key}&Expires=#{pp.expires.to_time.to_i}&Signature=#{pp.fields[:signature]}",
256
- 'url' => url
289
+ :policy => policy,
290
+ :signature => s3_upload_signature,
291
+ :key => @document.s3_key,
292
+ :success_action_redirect => document_upload_success_document_url(@document)
257
293
  }
258
-
259
- @s3_direct_post = S3_BUCKET.presigned_post(
260
- :key => "uploads/#{SecureRandom.uuid}/${filename}",
261
- :success_action_status => 201,
262
- :acl => :public_read
263
- )
264
-
265
-
294
+ end
295
+
296
+ def s3_upload_policy_document
297
+ ret = {"expiration" => 10.seconds.from_now.utc.xmlschema,
298
+ "conditions" => [
299
+ {"bucket" => 'cabooseit'},
300
+ {"acl" => "public-read"},
301
+ {"success_action_status" => "200"}
302
+ ]
303
+ }
304
+ return Base64.encode64(ret.to_json).gsub(/\n/,'')
305
+ end
306
+
307
+ # sign our request by Base64 encoding the policy document.
308
+ def s3_upload_signature
309
+ signature = Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new('sha1'),
310
+ YOUR_SECRET_KEY, s3_upload_policy_document)).gsub("\n","")
266
311
  end
267
312
 
268
313
  end
@@ -73,7 +73,7 @@ class Caboose::Page < ActiveRecord::Base
73
73
  uri.chop! if uri.end_with?('/')
74
74
  uri[0] = '' if uri.starts_with?('/')
75
75
 
76
- return self.index_page if uri.length == 0
76
+ return self.index_page(host_with_port) if uri.length == 0
77
77
 
78
78
  page = false
79
79
  parts = uri.split('/')
@@ -1,9 +1,10 @@
1
1
 
2
2
  <h1>Upload Images</h1>
3
3
 
4
- <input type="file" id="file" onchange="s3_upload();"/>
5
- <p id="status">Please select a file</p>
6
- <div id="preview"><img src="/static/default.png" /></div>
4
+ <form action='https://cabooseit.s3.amazonaws.com' method='post' id='new_image_form' enctype='multipart/form-data'>
5
+ <input type="file" name="new_image" id="new_image" />
6
+ <div class='#progress'><div class='#bar'></div></div>
7
+ <form>
7
8
 
8
9
  <% content_for :caboose_css do %>
9
10
  <style type='text/css'>
@@ -14,49 +15,47 @@
14
15
 
15
16
  <% content_for :caboose_js do %>
16
17
  <%= javascript_include_tag 'jquery.ui.all' %>
18
+ <%= javascript_include_tag 'caboose/jquery.iframe-transport.js' %>
17
19
  <%= javascript_include_tag 'caboose/jquery.fileupload.js' %>
18
20
  <script type='text/javascript'>
19
21
 
20
- $(function() {
21
- $('.directUpload').find("input:file").each(function(i, elem) {
22
-
23
- var fileInput = $(elem);
24
- var form = $(fileInput.parents('form:first'));
25
- var submitButton = form.find('input[type="submit"]');
26
- var progressBar = $("<div class='bar'></div>");
27
- var barContainer = $("<div class='progress'></div>").append(progressBar);
22
+ $(document).ready(function() {
23
+ $('#new_image').fileupload({
24
+ forceIframeTransport: true,
25
+ autoUpload: true,
28
26
 
29
- fileInput.after(barContainer);
30
- fileInput.fileupload({
31
- fileInput: fileInput,
32
- url: '', // @s3_direct_post.url
33
- type: 'POST',
34
- autoUpload: true,
35
- formData: '', // @s3_direct_post.fields.to_json.html_safe
36
- paramName: 'file', // S3 does not like nested name fields i.e. name="user[avatar_url]"
37
- dataType: 'XML', // S3 returns XML if success_action_status is set to 201
38
- replaceFileInput: false,
39
- fileuploadsubmit: function() {
40
- alert('Testing');
41
- },
42
- progressall: function (e, data) {
43
- var progress = parseInt(data.loaded / data.total * 100, 10);
44
- progressBar.css('width', progress + '%')
45
- },
46
- start: function (e) {
47
- submitButton.prop('disabled', true);
48
- progressBar.css('background', 'green').css('display', 'block').css('width', '0%').text("Loading...");
49
- },
50
- done: function(e, data) {
51
- submitButton.prop('disabled', false);
52
- progressBar.text("Uploading done");
53
- },
54
- fail: function(e, data) {
55
- submitButton.prop('disabled', false);
56
- progressBar.css("background", "red").text("Failed");
57
- }
58
- });
59
- });
27
+ //fileInput: $('#new_image'),
28
+ //url: pp.url,
29
+ type: 'POST',
30
+ //formData: pp.fields,
31
+ //paramName: 'file', // S3 does not like nested name fields i.e. name="user[avatar_url]"
32
+ //dataType: 'XML', // S3 returns XML if success_action_status is set to 201
33
+ replaceFileInput: false,
34
+
35
+ add: function(e, data) {
36
+ $.ajax({
37
+ url: '/admin/images/sign-s3',
38
+ type: 'get',
39
+ data: {
40
+ name: document.getElementById('new_image').value,
41
+ media_category_id: <%= @media_category_id %>
42
+ },
43
+ async: false,
44
+ success: function(resp) {
45
+ pp = resp.presigned_post;
46
+ var form = $('#new_image_form');
47
+ for (var i in pp.fields)
48
+ form.append($('<input/>').attr('type', 'hidden').attr('name', i).val(pp.fields[i]));
49
+ //form.attr('action', pp.url);
50
+ }
51
+ });
52
+ data.submit();
53
+ },
54
+ progressall: function (e, data) { $('#bar').css('width', parseInt(data.loaded / data.total * 100, 10) + '%') },
55
+ start: function (e) { $('#bar').css('background', 'green').css('display', 'block').css('width', '0%').text("Loading..."); },
56
+ done: function(e, data) { $('#bar').text("Uploading done"); },
57
+ fail: function(e, data) { $('#bar').css("background", "red").text("Failed"); }
58
+ });
60
59
  });
61
60
 
62
61
  </script>
@@ -1,3 +1,3 @@
1
1
  module Caboose
2
- VERSION = '0.4.49'
2
+ VERSION = '0.4.50'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caboose-cms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.49
4
+ version: 0.4.50
5
5
  platform: ruby
6
6
  authors:
7
7
  - William Barry
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-21 00:00:00.000000000 Z
11
+ date: 2014-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -196,6 +196,7 @@ files:
196
196
  - app/assets/javascripts/caboose/application.js
197
197
  - app/assets/javascripts/caboose/jquery.detect.js
198
198
  - app/assets/javascripts/caboose/jquery.fileupload.js
199
+ - app/assets/javascripts/caboose/jquery.iframe-transport.js
199
200
  - app/assets/javascripts/caboose/jquery.placeholder.js
200
201
  - app/assets/javascripts/caboose/lodash.min.js
201
202
  - app/assets/javascripts/caboose/main.js