mezza-bcms_s3 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown ADDED
@@ -0,0 +1,64 @@
1
+ # A [BrowserCMS](http://www.browsercms.org) module to allow storage of images and files on the Amazon S3 storage facility
2
+ ## Using S3 for file storage
3
+ To enable S3 file storage set Cms::S3.enabled in config/initializers/browsercms.rb (create this if it does not exist) to true. Ensure that you as provide a s3.yml file that contains your credentials and bucket.
4
+ This should be in the following format
5
+
6
+ access_key_id: your AWS access key
7
+ secret_access_key: your AWS secret access key
8
+ bucket: your unique bucket name
9
+
10
+ ## Using this module with [Heroku](http://heroku.com)
11
+ If using this module in conjunction with deployment on heroku you should probably turning heroku caching on by setting Cms::S3.heroku_caching in config/initializers/browsercms.rb to true.
12
+
13
+ In order to avoid putting your secret AWS key in the s3.yml file, you can take advantage of [heroku's config vars](http://docs.heroku.com/config-vars). Use ERB to read the values from the environment. This way you can safely commit your s3.yml file to the repository without revealing your amazon credentials.
14
+
15
+ access_key_id: <%= ENV['s3_access_key_id'] %>
16
+ secret_access_key: <%= ENV['s3_secret_access_key'] %>
17
+ bucket: <%= ENV['s3_bucket'] %>
18
+
19
+ For developing on your local machine, export the s3 variables to your environment.
20
+
21
+ export s3_access_key_id='your AWS access key'
22
+ export s3_secret_access_key='your AWS secret access key'
23
+ export s3_bucket='your unique bucket name'
24
+
25
+ Set the config vars on heroku to get it working there as well.
26
+
27
+ heroku config:add s3_access_key_id='your AWS access key'
28
+ heroku config:add s3_secret_access_key='your AWS secret access key'
29
+ heroku config:add s3_bucket='your unique bucket name'
30
+
31
+ ## www prefix for non cms urls
32
+ If your non cms domain is www.myapp.com rather than app.com this can be enabled by setting Cms::S3.www_domain_prefix in config/initializers/browsercms.rb to true.
33
+
34
+ ## using cnames to your S3 bucket
35
+ If you've set up CNAMES in your DNS to point to your bucket, then you can enable the use of that instead of the FQDN ending in amazonaws.com by setting Cms::S3.options[:s3_cname] in your s3.yml file.
36
+
37
+ ## Important things to note
38
+ 1. The s3.yml should be excluded from public repositories (e.g github) since it contains your secret AWS key which should **never** be revealed to the public.
39
+ **Please note**. This no longer applies since the access keys and buckets are now specified in environmental variables and therefore the s3.yml file now contains just references to these environmental variables.
40
+ 2. Changing from local storage to S3 storage will require you to re-upload all your files (or copy the tree to s3)
41
+ 3. This module requires the RightAWS gem from RightScale (sudo gem install right_aws)
42
+
43
+ ##### Based on original work on S3 storage for BrowserCMS by [Neil Middleton](http://github.com/neilmiddleton/)
44
+
45
+ ## Important note for use with Rails 3 and BCMS 3.1.x-axes
46
+
47
+ Due to the use of Engines, I can't work out how to extend the Cms::AttachmentsController and Models from within the module, so you will need to add the block below in the initializer for browsercms.rb
48
+
49
+ Cms::AttachmentsController.send(:include, Cms::S3::AttachmentsController)
50
+ Cms::ContentController.send(:include, Cms::S3::ContentController)
51
+ Attachment.send(:include, Cms::S3::Attachment)
52
+ Cms::ApplicationController.send(:include, Cms::S3::ApplicationController)
53
+ # ensure S3 storage disabled by default
54
+ Cms::S3.enabled = false if Cms::S3.enabled.nil?
55
+ # ensure heroku caching disabled by default
56
+ Cms::S3.heroku_caching = false if Cms::S3.heroku_caching.nil?
57
+ # function to set domain prefix without url to 'www' is disabled by default
58
+ Cms::S3.www_domain_prefix = false if Cms::S3.www_domain_prefix.nil?
59
+ # load s3 options if s3.yml exists
60
+ if File.exists?("#{RAILS_ROOT}/config/s3.yml")
61
+ yaml_string = IO.read("#{RAILS_ROOT}/config/s3.yml")
62
+ Cms::S3.options = YAML::load(ERB.new(yaml_string).result)
63
+ Cms::S3.options.symbolize_keys!
64
+ end
data/lib/bcms_s3.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'bcms_s3/routes'
2
+ require 'bcms_s3/s3_module'
@@ -0,0 +1,7 @@
1
+ module Cms::Routes
2
+ def routes_for_bcms_s3
3
+ namespace(:cms) do |cms|
4
+ #cms.content_blocks :s3s
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,138 @@
1
+ require 'right_aws'
2
+ module Cms
3
+ module S3
4
+ class << self
5
+ attr_accessor :enabled
6
+ attr_accessor :heroku_caching
7
+ attr_accessor :www_domain_prefix
8
+ attr_accessor :options
9
+ end
10
+ module AttachmentsController
11
+ def self.included(controller_class)
12
+ controller_class.alias_method_chain :show, :s3
13
+ end
14
+
15
+ def show_with_s3
16
+ @attachment = ::Attachment.find(params[:id])
17
+ @attachment = @attachment.as_of_version(params[:version]) if params[:version]
18
+ if Cms::S3.enabled
19
+ #get the file off S3
20
+ if Cms::S3.options[:s3_cname]
21
+ redirect_to("http://#{Cms::S3.options[:s3_cname]}/#{@attachment.file_location}")
22
+ else
23
+ redirect_to("http://#{Cms::S3.options[:bucket]}.s3.amazonaws.com/#{@attachment.file_location}")
24
+ end
25
+ else
26
+ #Construct a path to where this file would be if it were cached
27
+ @file = @attachment.full_file_location
28
+
29
+ #Stream the file if it exists
30
+ if @path != "/" && File.exists?(@file)
31
+ send_file(@file,
32
+ :filename => @attachment.file_name,
33
+ :type => @attachment.file_type,
34
+ :disposition => "inline"
35
+ )
36
+ end
37
+ end
38
+ end
39
+ end
40
+ module ContentController
41
+ def self.included(controller_class)
42
+ controller_class.alias_method_chain :render_page_with_caching, :s3
43
+ controller_class.alias_method_chain :try_to_stream_file, :s3
44
+ end
45
+ def render_page_with_caching_with_s3
46
+ render_page
47
+ response.headers['Cache-Control'] = 'public, max-age=300' if Cms::S3.heroku_caching
48
+ end
49
+ def try_to_stream_file_with_s3
50
+ split = @paths.last.to_s.split('.')
51
+ ext = split.size > 1 ? split.last.to_s.downcase : nil
52
+
53
+ #Only try to stream cache file if it has an extension
54
+ unless ext.blank?
55
+
56
+ #Check access to file
57
+ @attachment = ::Attachment.find_live_by_file_path(@path)
58
+ if @attachment
59
+ raise Cms::Errors::AccessDenied unless current_user.able_to_view?(@attachment)
60
+
61
+ if Cms::S3.enabled
62
+ #get the file off S3
63
+ if Cms::S3.options[:s3_cname]
64
+ redirect_to("http://#{Cms::S3.options[:s3_cname]}/#{@attachment.file_location}")
65
+ else
66
+ redirect_to("http://#{Cms::S3.options[:bucket]}.s3.amazonaws.com/#{@attachment.file_location}")
67
+ end
68
+ else
69
+ #Construct a path to where this file would be if it were cached
70
+ @file = @attachment.full_file_location
71
+
72
+ #Stream the file if it exists
73
+ if @path != "/" && File.exists?(@file)
74
+ send_file(@file,
75
+ :filename => @attachment.file_name,
76
+ :type => @attachment.file_type,
77
+ :disposition => "inline"
78
+ )
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+ module Attachment
86
+ def self.included(model_class)
87
+ model_class.alias_method_chain :set_file_location, :s3
88
+ model_class.alias_method_chain :write_temp_file_to_storage_location, :s3
89
+ end
90
+ def set_file_location_with_s3
91
+ unless temp_file.blank?
92
+ prefix = temp_file.original_filename.sub(/\..+$/,'')
93
+ if temp_file.original_filename =~ /.+(\..+)$/
94
+ suffix = $1
95
+ else
96
+ suffix = ""
97
+ end
98
+ new_filename = "#{prefix}-#{ActiveSupport::SecureRandom.hex(4)}#{suffix}"
99
+ self.file_location = "#{Time.now.strftime("%Y/%m/%d")}/#{new_filename}"
100
+ end
101
+ end
102
+ def write_temp_file_to_storage_location_with_s3
103
+ unless temp_file.blank?
104
+ FileUtils.mkdir_p File.dirname(full_file_location) if !Cms::S3.enabled
105
+ if temp_file.local_path
106
+
107
+ if Cms::S3.enabled
108
+ s3 = RightAws::S3.new(Cms::S3.options[:access_key_id], Cms::S3.options[:secret_access_key] )
109
+ bucket = s3.bucket(Cms::S3.options[:bucket], true, 'public-read')
110
+ key = RightAws::S3::Key.create(bucket, file_location)
111
+ key.put(temp_file.read,'public-read', {"Content-Type" => file_type})
112
+ else
113
+ FileUtils.copy temp_file.local_path, full_file_location
114
+ end
115
+ else
116
+ open(full_file_location, 'w') {|f| f << temp_file.read }
117
+ end
118
+
119
+ if Cms.attachment_file_permission && !Cms::S3.enabled
120
+ FileUtils.chmod Cms.attachment_file_permission, full_file_location
121
+ end
122
+ end
123
+ end
124
+ end
125
+ module ApplicationController
126
+ def self.included(controller_class)
127
+ controller_class.alias_method_chain :url_without_cms_domain_prefix, :www
128
+ end
129
+ def url_without_cms_domain_prefix_with_www
130
+ if Cms::S3.www_domain_prefix
131
+ request.url.sub(/#{cms_domain_prefix}\./,'www.')
132
+ else
133
+ request.url.sub(/#{cms_domain_prefix}\./,'')
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,31 @@
1
+ # Remove the file on both *unix and Windows
2
+ if Gem.win_platform?
3
+ run "del public\\index.html"
4
+ else
5
+ run "rm public/index.html"
6
+ end
7
+
8
+ gem "browsercms"
9
+ if Gem.win_platform?
10
+ puts " rake db:create"
11
+ `rake.cmd db:create`
12
+ else
13
+ rake "db:create"
14
+ end
15
+ route "map.routes_for_browser_cms"
16
+ generate :browser_cms
17
+ environment 'SITE_DOMAIN="localhost:3000"', :env => "development"
18
+ environment 'SITE_DOMAIN="localhost:3000"', :env => "test"
19
+ environment 'SITE_DOMAIN="localhost:3000"', :env => "production"
20
+ environment 'config.action_view.cache_template_loading = false', :env => "production"
21
+ environment 'config.action_controller.page_cache_directory = RAILS_ROOT + "/public/cache/"', :env => "production"
22
+ initializer 'browsercms.rb', <<-CODE
23
+ Cms.attachment_file_permission = 0640
24
+ Cms::S3.enabled = false
25
+ Cms::S3.heroku_caching = false
26
+ CODE
27
+ if Gem.win_platform?
28
+ puts " rake db:migrate"
29
+ `rake.cmd db:migrate`
30
+ else
31
+ rak
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mezza-bcms_s3
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 3
8
+ - 0
9
+ version: 0.3.0
10
+ platform: ruby
11
+ authors:
12
+ - Anthony Underwood
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-08-25 00:00:00 +01:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description:
22
+ email: email2ants@gmail.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files:
28
+ - README.markdown
29
+ files:
30
+ - lib/bcms_s3.rb
31
+ - lib/bcms_s3/routes.rb
32
+ - lib/bcms_s3/s3_module.rb
33
+ - templates/blank.rb
34
+ - README.markdown
35
+ has_rdoc: true
36
+ homepage: http://github.com/aunderwo/bcms_s3
37
+ licenses: []
38
+
39
+ post_install_message:
40
+ rdoc_options:
41
+ - --charset=UTF-8
42
+ require_paths:
43
+ - lib
44
+ required_ruby_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ segments:
49
+ - 0
50
+ version: "0"
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ segments:
56
+ - 0
57
+ version: "0"
58
+ requirements: []
59
+
60
+ rubyforge_project:
61
+ rubygems_version: 1.3.6
62
+ signing_key:
63
+ specification_version: 3
64
+ summary: This is a browsercms (browsercms.org) module to allow the facility to have attachments stored on Amazon S3. Also there is the option to change caching to suit heroku and/or use 'www' as the prefix for the non-cms site. Based on original work by Neil Middleton
65
+ test_files: []
66
+