excursion 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fa219ff3cceb9e5784a69dd6ce6aeca3dd2e8bb2
4
- data.tar.gz: 3c325aff19013e5e14dfad13bb5528d877cea8f9
3
+ metadata.gz: ab8132a7eecf4dbcd15c02be1910a80ff4f99251
4
+ data.tar.gz: 09b7d1bb9d3c3df27b13943717da2fc425d1b173
5
5
  SHA512:
6
- metadata.gz: f53750d0d718d610eb166038656d7b95678222a116237a9243b9c7951d38c070c199a93d144f996d78a86a4a7610f53153883381491d2918eaf4939d7df659da
7
- data.tar.gz: 4788c23938cae5cca1589708e9b8fff3dc6414b8ce8f7b7aebe0c4e30d86168f025fba5568c6edc9b09998de713b01f397be3ba3a4c1d38e178f62088f515f9f
6
+ metadata.gz: 96cbfb48309e2b4e238b9ec4fb07c9e8ce6832f29001b6b2869ef1ee2d75466b20867245510d44c8b3598e35ae797c0c078cd892f80a65294f5b43d2ae599054
7
+ data.tar.gz: 56e54a5963c2ef247b8ba511613c98bb1967ca33acf05689bbbba088a2757497ac37d0c1831db47569a3c73345a1ef7245b11628778412aa67de1ad2cc5d967d
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ Excursion::Engine.routes.draw do
2
+ match '*path' => 'application#cors_preflight', :via => :options if Excursion.configuration.enable_cors
3
+ end
@@ -6,7 +6,14 @@ module Excursion
6
6
  # include_pattern: to only include certain routes
7
7
  register_app: true, # whether or not to register the app automatically on init
8
8
  default_url_options: {}, # default_url_options used when building routes for this app
9
- retry_limit: 3 # retry limit for datastores that user remote servers
9
+ retry_limit: 3, # retry limit for datastores that user remote servers
10
+ enable_cors: false, # enables cross-origin resource sharing for this app
11
+ cors_whitelist: :pool, # whitelist for allowing cors for specific domains - defaults to only allow registered excursion apps
12
+ cors_blacklist: nil, # blacklist for denying cors for specific domains
13
+ cors_allow_methods: %w(POST PUT PATCH GET DELETE), # list of allowed cors request methods (Access-Control-Allow-Methods)
14
+ cors_allow_headers: %w(origin content-type accept x-requested-with x-csrf-token), # list of allowed cors request headers (Access-Control-Allow-Headers)
15
+ cors_allow_credentials: true, # allow credentials with cors requests (Access-Control-Allow-Credentials)
16
+ cors_max_age: 1728000 # cors max age (Access-Control-Max-Age)
10
17
  }
11
18
 
12
19
  #attr_reader *DEFAULT_CONFIGURATION_OPTIONS.keys
@@ -0,0 +1,35 @@
1
+ module Excursion
2
+ module CORS
3
+ def self.included(base)
4
+ base.send :before_filter, :cors_headers if Excursion.configuration.enable_cors
5
+ end
6
+
7
+ def cors_match?(origin, host)
8
+ host.is_a?(Regexp) ? origin.match(host) : origin.downcase == host.downcase
9
+ end
10
+
11
+ def cors_whitelisted?(origin)
12
+ return Excursion::Pool.all_applications.values.map { |app| app.default_url_options[:host] }.any? { |cw| cors_match? origin, cw } if Excursion.configuration.cors_whitelist == :pool
13
+ Excursion.configuration.cors_whitelist.nil? || Excursion.configuration.cors_whitelist.any? { |cw| cors_match? origin, cw }
14
+ end
15
+
16
+ def cors_blacklisted?(origin)
17
+ !Excursion.configuration.cors_blacklist.nil? && !Excursion.configuration.cors_blacklist.any? { |cb| cors_match? origin, cb }
18
+ end
19
+
20
+ def cors_headers
21
+ if !request.headers['Origin'].nil? && cors_whitelisted?(request.headers['Origin']) && !cors_blacklisted?(request.headers['Origin'])
22
+ headers['Access-Control-Allow-Origin'] = request.headers['Origin']
23
+ headers['Access-Control-Allow-Methods'] = Excursion.configuration.cors_allow_methods.join(',')
24
+ headers['Access-Control-Allow-Headers'] = Excursion.configuration.cors_allow_headers.join(', ')
25
+ headers['Access-Control-Allow-Credentials'] = Excursion.configuration.cors_allow_credentials.to_s
26
+ headers['Access-Control-Max-Age'] = Excursion.configuration.cors_max_age.to_s
27
+ end
28
+ end
29
+
30
+ def cors_preflight
31
+ cors_headers
32
+ render :text => '', :content_type => 'text/plain'
33
+ end
34
+ end
35
+ end
@@ -16,10 +16,10 @@ module Excursion
16
16
 
17
17
  def self.application(name)
18
18
  check_local_cache
19
- return @@applications[name] if @@applications.has_key?(name) && !@@applications[name].nil?
19
+ return @@applications[name.to_s] if @@applications.has_key?(name.to_s) && !@@applications[name.to_s].nil?
20
20
 
21
21
  app = datastore.app(name)
22
- @@applications[name] = app unless app.nil?
22
+ @@applications[name.to_s] = app unless app.nil?
23
23
  end
24
24
 
25
25
  def self.register_application(app=nil, opts={}, &block)
@@ -61,7 +61,7 @@ module Excursion
61
61
  datastore.set(name, app_hash)
62
62
  datastore.set('_pool_updated', Time.now.to_i)
63
63
  end
64
- @@applications[name] = datastore.app(name)
64
+ @@applications[name.to_s] = datastore.app(name)
65
65
  end
66
66
 
67
67
  def self.remove_application(app)
@@ -107,5 +107,13 @@ module Excursion
107
107
  def self.check_local_cache
108
108
  (@@refreshed = Time.now.to_i) && (@@applications = {}) if pool_updated > pool_refreshed
109
109
  end
110
+
111
+ def self.set_secret_key_base
112
+ datastore.set('_secret_key_base', Digest::MD5.hexdigest(SecureRandom.base64(32)))
113
+ end
114
+
115
+ def self.secret_key_base
116
+ key = datastore.get('_secret_key_base') || set_secret_key_base
117
+ end
110
118
  end
111
119
  end
@@ -1,13 +1,14 @@
1
1
  module Excursion
2
2
  class Railtie < Rails::Railtie
3
3
  config.after_initialize do |app|
4
- if Excursion.configuration.register_app == true &&
5
- !Excursion.configuration.datastore.nil? &&
6
- !defined?(Rails::Generators::Base) && # Do not register on init when running a generator (is there a better way to detect this? Maybe $0 == 'rails' && ARGV.include?('generate') or 'g')
7
- File.basename($0) != "rake" # Do not register on init when running a rake task
4
+ # Do not register on init when running a generator (is there a better way to detect this? Maybe $0 == 'rails' && ARGV.include?('generate') or 'g')
5
+ # Do not register on init when running a rake task
6
+ if Excursion.configuration.register_app == true && !Excursion.configuration.datastore.nil? && !defined?(Rails::Generators::Base) && File.basename($0) != "rake"
8
7
  app.reload_routes!
9
8
  Excursion::Pool.register_application(app)
10
9
  end
10
+
11
+ ApplicationController.send :include, Excursion::CORS if Excursion.configuration.enable_cors
11
12
  end
12
13
 
13
14
  rake_tasks do
@@ -1,3 +1,3 @@
1
1
  module Excursion
2
- VERSION = '0.1.2'
2
+ VERSION = '0.1.3'
3
3
  end
data/lib/excursion.rb CHANGED
@@ -26,3 +26,4 @@ require 'excursion/pool'
26
26
  require 'excursion/helpers'
27
27
  require 'excursion/engine'
28
28
  require 'excursion/railtie'
29
+ require 'excursion/cors'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: excursion
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Rebec
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-07 00:00:00.000000000 Z
11
+ date: 2013-11-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -99,10 +99,12 @@ files:
99
99
  - lib/excursion/helpers.rb
100
100
  - lib/excursion/route_pool.rb
101
101
  - lib/excursion/version.rb
102
+ - lib/excursion/cors.rb
102
103
  - lib/generators/excursion/active_record_generator.rb
103
104
  - lib/generators/excursion/templates/migration.rb
104
105
  - lib/excursion.rb
105
106
  - app/assets/javascripts/excursion.js
107
+ - config/routes.rb
106
108
  - spec/excursion_spec.rb
107
109
  - spec/dummy/public/500.html
108
110
  - spec/dummy/public/index.html