caboose-cms 0.4.49 → 0.4.50

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.
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