skypager 2.1.0 → 2.1.2

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: 7a0178617de54fe4335a9e4e649008090ca6e757
4
- data.tar.gz: c22ee17fcb1b22837fe4a2bf05667f4d48fa9c01
3
+ metadata.gz: 2b58af966708284b603f3b068b4ab53a189a26f0
4
+ data.tar.gz: d6b27bfb6058d82621d9049ef13e8cbef4d307d4
5
5
  SHA512:
6
- metadata.gz: e9fea307a876c552064fa0f4c3c79b48ac5f5869cdc64a7c7472fa78beacad8520baae07c2f68e76814b2f7840d6cd246b4211435809345dedcdf4c5735bdb70
7
- data.tar.gz: 65377e519d6595076664adcc301a70e83f96ebc8b9c444822e83b839af4303bc7abfbaa84d9ddcd35d6372b0d43818df361d5541136f51a5a5a7a4ab6747b0af
6
+ metadata.gz: 2a0045b02510e64763469763600d4c5cc2b74abd714c60657a3cd40a9870caf282d01c47e1f62705126673492c4e23ba5424b87bc5c2a56df12a8a80ad0f787d
7
+ data.tar.gz: 420e672d05b052513ce0bed3afd1e7a40eef7ac3247fc4abc696cadfcb2e7d4cc9670a988d08cad3810fb1f30f6c194f4821b69476464c429d2ba0facd533f8a
@@ -12,9 +12,14 @@ require 'active_support/core_ext/string'
12
12
 
13
13
  module Skypager
14
14
  def self.router(app, options={})
15
+ require 'skypager/router'
15
16
  @router ||= Skypager::Router.new(app, options)
16
17
  end
17
18
 
19
+ def self.protector(options={})
20
+ Skypager::Protector.new(options)
21
+ end
22
+
18
23
  def self.proxy(options={})
19
24
  if options.is_a?(String)
20
25
  options = {bucket: options}
@@ -0,0 +1,87 @@
1
+ # This app should check for the presence of certain
2
+ # cookies, and optionally validate their values.
3
+ #
4
+ # It should either show a login page, or the requested path
5
+ module Skypager
6
+ class Protector
7
+ attr_accessor :validator, :options
8
+
9
+ # Skypager::Protector.new(options) do |request|
10
+ # # validate request here
11
+ # end
12
+ #
13
+ # Valid options are:
14
+ # - build_dir: defaults to ./build
15
+ # - login_path: defaults to /login/index.html
16
+ # - not_found_path: defaults to /not-found.html
17
+ def initialize(options={}, &validator)
18
+ @options = options
19
+ @validator = validator
20
+ end
21
+
22
+ def call(env)
23
+ request = Rack::Request.new(env)
24
+
25
+ if !validate(request)
26
+ serve_login_path
27
+ end
28
+
29
+ path = normalize_path(request.path)
30
+ file = build_path.join(path)
31
+
32
+ binding.pry
33
+
34
+ if file.exist?
35
+ serve_file(file)
36
+ else
37
+ serve_not_found_path
38
+ end
39
+ end
40
+
41
+ def serve_file(file)
42
+ mime_type = Rack::Mime.mime_type(Pathname(file).extname).to_s
43
+ content = Pathname(file).read.to_s
44
+ content_length = content.size.to_s
45
+
46
+ [200, {"Content-Type" => mime_type,"Content-Length" => content_length}, [content]]
47
+ end
48
+
49
+ def build_path
50
+ build_dir = options.fetch(:build_dir) { Pathname(Dir.pwd).join('build') }
51
+ Pathname(build_dir)
52
+ end
53
+
54
+ def serve_not_found_path
55
+ not_found_path = options.fetch(:not_found_path, "/not-found.html")
56
+ [404, {"Content-Type" => "text/html"}, [not_found_path.read]]
57
+ end
58
+
59
+ def serve_login_path
60
+ login_path = options.fetch(:login_path, "/login.html")
61
+ [302, {"Content-Type" => "text/html", "Location" => login_path}, ["302 You've been redirected"]]
62
+ end
63
+
64
+ def normalize_path(path)
65
+ if !path.to_s.match(/\.\w+/)
66
+ path = path.gsub(/\/$/,'') + path_extension
67
+ end
68
+
69
+ path.to_s.gsub(/^\//,'')
70
+ end
71
+
72
+ def path_extension
73
+ options.fetch(:path_extension ) do
74
+ options[:directory_indexes] ? "/index.html" : ".html"
75
+ end
76
+ end
77
+ def validate(request)
78
+ return true if validator.nil? || !validator.respond_to?(:call)
79
+
80
+ validator.call({
81
+ cookies: request.cookies,
82
+ params: request.params,
83
+ env: request.env
84
+ })
85
+ end
86
+ end
87
+ end
@@ -1,8 +1,5 @@
1
1
  # Based on the s3_proxy gem
2
-
3
- require 'aws-sdk-core'
4
- require 'stringio'
5
-
2
+ require 'rack/proxy'
6
3
  module Skypager
7
4
  class Proxy
8
5
 
@@ -14,8 +11,6 @@ module Skypager
14
11
  def initialize(options={})
15
12
  @options = options
16
13
  @bucket = options[:bucket]
17
- @access_key_id = options.fetch(:access_key_id) { Skypager.config.aws_access_key_id }
18
- @secret_access_key = options.fetch(:secret_access_key) { Skypager.config.aws_secret_access_key }
19
14
  end
20
15
 
21
16
  def call(env)
@@ -31,7 +26,7 @@ module Skypager
31
26
  end
32
27
 
33
28
  def s3
34
- @s3 ||= Aws::S3.new(access_key_id: access_key_id, secret_access_key: secret_access_key, region: "us-east-1")
29
+ Datapimp::Sync.amazon.storage
35
30
  end
36
31
 
37
32
  def request_proxy
@@ -41,12 +36,12 @@ module Skypager
41
36
 
42
37
  def s3_call(env)
43
38
  return Errors.method_not_allowed unless %w(GET HEAD).include?(env['REQUEST_METHOD'])
44
- return Errors.not_found if env['PATH_INFO'].empty?
39
+ return Errors.not_found('path_info') if env['PATH_INFO'].empty?
45
40
 
46
41
  rack_request = Rack::Request.new(env)
47
42
  key = "#{rack_request.path}".without_leading_slash
48
43
 
49
- return Errors.not_found unless bucket && key
44
+ return Errors.not_found('no-bucket-no-key') unless bucket && key
50
45
 
51
46
  path = key.without_leading_slash
52
47
  last = path.split("/").last
@@ -55,14 +50,18 @@ module Skypager
55
50
 
56
51
  req[:key] = "index.html" if req[:key].to_s.length == 0
57
52
 
58
- req[:if_match] = env['HTTP_IF_MATCH'] if env['HTTP_IF_MATCH']
59
- req[:if_none_match] = env['HTTP_IF_NONE_MATCH'] if env['HTTP_IF_NONE_MATCH']
60
- req[:if_modified_since] = env['HTTP_IF_MODIFIED_SINCE'] if env['HTTP_IF_MODIFIED_SINCE']
61
- req[:if_unmodified_since] = env['HTTP_IF_UNMODIFIED_SINCE'] if env['HTTP_UNMODIFIED_SINCE']
53
+ req['If-Match'] = env['HTTP_IF_MATCH'] if env['HTTP_IF_MATCH']
54
+ req['If-None-Match'] = env['HTTP_IF_NONE_MATCH'] if env['HTTP_IF_NONE_MATCH']
55
+ req['If-Modified-Since'] = env['HTTP_IF_MODIFIED_SINCE'] if env['HTTP_IF_MODIFIED_SINCE']
56
+ req['If-Unmodified-Since'] = env['HTTP_IF_UNMODIFIED_SINCE'] if env['HTTP_UNMODIFIED_SINCE']
62
57
 
63
- head = s3.head_object(req)
58
+ begin
59
+ head = s3.head_object(bucket, key, req)
60
+ rescue => e
61
+ return Errors.not_found('could not head ' + bucket.to_s + ' ' + key.to_s + ' ' + e.message)
62
+ end
64
63
 
65
- return Errors.not_found unless head
64
+ return Errors.not_found('no-head') unless head
66
65
 
67
66
  case env['REQUEST_METHOD']
68
67
  when 'HEAD'
@@ -75,13 +74,13 @@ module Skypager
75
74
  end
76
75
  end
77
76
 
78
- rescue Aws::S3::Errors::NoSuchKey, Aws::S3::Errors::NotFound
79
- return Errors.not_found
77
+ rescue Excon::Errors::NotFound
78
+ return Errors.not_found('rescue')
80
79
 
81
- rescue Aws::S3::Errors::NotModified
80
+ rescue Excon::Errors::NotModified
82
81
  return Errors.not_modified
83
82
 
84
- rescue Aws::S3::Errors::PreconditionFailed
83
+ rescue Excon::Errors::PreconditionFailed
85
84
  return Errors.precondition_failed
86
85
 
87
86
  rescue NameError => e
@@ -101,10 +100,10 @@ module Skypager
101
100
  io.write "HTTP/1.1 200 OK\r\n"
102
101
  io.write "Status: 200\r\n"
103
102
  io.write "Connection: close\r\n"
104
- io.write "Content-Type: #{head.content_type}\r\n"
105
- io.write "Content-Length: #{head.content_length}\r\n"
106
- io.write "ETag: #{head.etag}\r\n"
107
- io.write "Last-Modified: #{head.last_modified}\r\n"
103
+ io.write "Content-Type: #{head.headers['Content-Type']}\r\n"
104
+ io.write "Content-Length: #{head.headers['Content-Length']}\r\n"
105
+ io.write "ETag: #{head.headers['ETag']}\r\n"
106
+ io.write "Last-Modified: #{head.headers['Last-Modified']}\r\n"
108
107
  io.write "\r\n"
109
108
  io.flush
110
109
 
@@ -119,7 +118,7 @@ module Skypager
119
118
  case env['REQUEST_METHOD']
120
119
  when 'GET'
121
120
  fiber = Fiber.new do
122
- s3.get_object(request) do |chunk|
121
+ s3.get_object(request[:bucket], request[:key], request) do |chunk|
123
122
  Fiber.yield(chunk)
124
123
  end
125
124
  Fiber.yield(nil)
@@ -135,10 +134,10 @@ module Skypager
135
134
  end
136
135
 
137
136
  headers = {
138
- 'Content-Type' => head.content_type.to_s,
139
- 'Content-Length' => head.content_length.to_s,
140
- 'Last-Modified' => head.last_modified.to_s,
141
- 'ETag' => head.etag.to_s,
137
+ 'Content-Type' => head.headers['Content-Type'].to_s,
138
+ 'Content-Length' => head.headers['Content-Length'].to_s,
139
+ 'Last-Modified' => head.headers['Last-Modified'].to_s,
140
+ 'ETag' => head.headers['ETag'].to_s,
142
141
  }
143
142
 
144
143
  [200, headers, body]
@@ -150,8 +149,8 @@ module Skypager
150
149
  [405, {'Content-Type' => 'text/plain'}, ["method not allowed"]]
151
150
  end
152
151
 
153
- def not_found
154
- [404, {'Content-Type' => 'text/plain'}, ["not found"]]
152
+ def not_found(reason="not found man")
153
+ [404, {'Content-Type' => 'text/plain'}, [reason.to_s]]
155
154
  end
156
155
 
157
156
  def forbidden
@@ -1,3 +1,3 @@
1
1
  module Skypager
2
- VERSION = "2.1.0"
2
+ VERSION = "2.1.2"
3
3
  end
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
25
25
  spec.add_dependency 'activesupport', '>= 3.0.0'
26
26
  spec.add_dependency 'uri_template'
27
27
  spec.add_dependency 'rack-proxy'
28
+ spec.add_dependency 'datapimp', '>= 1.1.1'
28
29
 
29
30
  spec.add_development_dependency "bundler", "~> 1.3"
30
31
  spec.add_development_dependency "rake", '~> 0'
@@ -0,0 +1,6 @@
1
+ require "spec_helper"
2
+
3
+ describe "The Protector Interface" do
4
+ it "shows a login page if you don't have the cookies" do
5
+ end
6
+ end
File without changes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: skypager
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Soeder
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-18 00:00:00.000000000 Z
11
+ date: 2015-06-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: datapimp
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 1.1.1
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: 1.1.1
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: bundler
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -215,12 +229,15 @@ files:
215
229
  - lib/skypager/cli/config.rb
216
230
  - lib/skypager/configuration.rb
217
231
  - lib/skypager/core_ext.rb
232
+ - lib/skypager/protector.rb
218
233
  - lib/skypager/proxy.rb
219
234
  - lib/skypager/router.rb
220
235
  - lib/skypager/site.rb
221
236
  - lib/skypager/tar.rb
222
237
  - lib/skypager/version.rb
223
238
  - skypager.gemspec
239
+ - spec/interface/protector_spec.rb
240
+ - spec/spec_helper.rb
224
241
  homepage: http://skypager.io
225
242
  licenses:
226
243
  - MIT
@@ -246,5 +263,7 @@ signing_key:
246
263
  specification_version: 4
247
264
  summary: Skypager lets people collaborate on advanced, dynamic sites using simple
248
265
  familiar tools
249
- test_files: []
266
+ test_files:
267
+ - spec/interface/protector_spec.rb
268
+ - spec/spec_helper.rb
250
269
  has_rdoc: