restpack_web 0.2.21 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +6 -14
- data/.gitignore +1 -1
- data/Gemfile +2 -0
- data/LICENSE.txt +22 -0
- data/README.md +2 -29
- data/Rakefile +2 -39
- data/lib/restpack_web.rb +6 -1
- data/lib/restpack_web/configuration.rb +16 -0
- data/lib/restpack_web/context.rb +52 -101
- data/lib/restpack_web/rack/domain.rb +36 -0
- data/lib/restpack_web/rack/session.rb +7 -0
- data/lib/restpack_web/rack/user.rb +35 -0
- data/lib/restpack_web/rails/controller.rb +9 -13
- data/lib/restpack_web/sinatra/app.rb +9 -16
- data/lib/restpack_web/version.rb +2 -2
- data/restpack_web.gemspec +23 -24
- metadata +55 -94
- data/LICENSE +0 -22
- data/lib/restpack_web/app.rb +0 -55
- data/lib/restpack_web/test_support.rb +0 -26
- data/spec/fixtures/channels.json +0 -354
- data/spec/fixtures/configurations_root.json +0 -59
- data/spec/fixtures/domains_search.json +0 -40
- data/spec/fixtures/users.json +0 -14
- data/spec/lib/restpack_web_spec.rb +0 -39
- data/spec/lib/test_support_spec.rb +0 -23
- data/spec/spec_helper.rb +0 -8
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
OTg1ZWZlMGM5ZmQxMGRkZTQwYjk1Yzg3ZTEyNjA2MDY5NDc2Y2IzNWM0MWNh
|
10
|
-
MDNjMWMzNmRmYWMxMzMzYTEyMDg3YWVjOGRhYmIzMTcyMDFmZjI2YTcyMGIw
|
11
|
-
MTllMjNiOWY3ZDVjNDlmZDZlNThjZDg5MDMwZjBiYjY0YmRkNzY=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
OGY1OTI2MmZjMTM3ZTEzNWFmZjU5MDExMjE3MTQxMzJiYjMzOGZkMmM2NmQw
|
14
|
-
Y2JmNGM5ZDZjNjQ4NGJjZWU0NTNlOGJkNjFhMjhjN2ZhNjgwZDNmMmJlMDI3
|
15
|
-
MmQxMmMxNWIwYjQ2MmY1MDVkZWE2ZjNjYWM0NTRmY2EyNTVlNWY=
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5747a127d3d522bcf4968a47bf9ec9006b68acf0
|
4
|
+
data.tar.gz: 9e7e8ebf35d75e3fce8d99dd980820383f66bf47
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c9abd53df497790f5ed9904466a79bc2c930ab812ae6a43a5812a74461b65de24edadb8e3c710bccb4cfad3b17a62df1e23a9f9838200dce1e4ed2206e10b732
|
7
|
+
data.tar.gz: 7b3b5dbed34dc462c45158f3696a785fa6d55c1a2b450ce26f391583828cecd14ee1fe4984c66aff27d916ca00a3e69de35176abd228523c7346e90d945de860
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Gavin Joyce
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
CHANGED
@@ -1,30 +1,3 @@
|
|
1
|
-
|
2
|
-
Add `restpack-web` to Gemfile
|
3
|
-
```ruby
|
4
|
-
gem 'restpack-web', '~> 0.2.16', :git => 'git://github.com/RestPack/restpack-web.git'
|
5
|
-
```
|
6
|
-
|
7
|
-
Use `RestPack::Web::App` as a middleware in `application.rb`
|
8
|
-
```ruby
|
9
|
-
config.middleware.use RestPack::Web::App
|
10
|
-
```
|
11
|
-
|
12
|
-
Set necessary environment variables:
|
13
|
-
```ruby
|
14
|
-
ENV['RESTPACK_ACCESS_KEY'] = 'secret'
|
15
|
-
ENV['RESTPACK_CORE_SERVICE'] = 'restpack-core-service.restpack.org'
|
16
|
-
```
|
17
|
-
|
18
|
-
## Testing your app
|
19
|
-
You can stub all requests from restpack_web to the core service.
|
20
|
-
```ruby
|
21
|
-
require 'restpack_web/test_support'
|
22
|
-
RestPack::Web::TestSupport.stub_restpack_web
|
23
|
-
```
|
24
|
-
|
25
|
-
## Testing
|
26
|
-
`bundle exec rake test`
|
27
|
-
|
28
|
-
## Bump to a new version
|
29
|
-
`bundle exec bump patch && rake tag`
|
1
|
+
# restpack_web
|
30
2
|
|
3
|
+
Rack middleware for your RestPack web apps
|
data/Rakefile
CHANGED
@@ -1,39 +1,2 @@
|
|
1
|
-
require
|
2
|
-
|
3
|
-
require 'bump/tasks'
|
4
|
-
require_relative 'lib/restpack_web/version'
|
5
|
-
|
6
|
-
task :default => [:test]
|
7
|
-
|
8
|
-
Rake::TestTask.new do |t|
|
9
|
-
t.pattern = 'spec/**/*_spec.rb'
|
10
|
-
end
|
11
|
-
|
12
|
-
task :gem do
|
13
|
-
["gem:bump", "gem:tag", "gem:build", "gem:push"].each do |task|
|
14
|
-
Rake::Task[task].reenable
|
15
|
-
Rake::Task[task].invoke
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
namespace :gem do
|
20
|
-
task :build do
|
21
|
-
sh "gem build restpack_web.gemspec"
|
22
|
-
end
|
23
|
-
|
24
|
-
task :push do
|
25
|
-
require 'bump'
|
26
|
-
sh "gem push restpack_web-#{Bump::Bump.current}.gem"
|
27
|
-
end
|
28
|
-
|
29
|
-
task :tag do
|
30
|
-
require 'bump'
|
31
|
-
version = Bump::Bump.current
|
32
|
-
puts "tagging v#{version}"
|
33
|
-
`git push && git tag v#{version} && git push --tags`
|
34
|
-
end
|
35
|
-
|
36
|
-
task :bump do
|
37
|
-
Rake::Task["bump:patch"].invoke
|
38
|
-
end
|
39
|
-
end
|
1
|
+
require "restpack_gem"
|
2
|
+
RestPack::Gem::Tasks.load_tasks
|
data/lib/restpack_web.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
require 'restpack_web/version'
|
2
|
+
|
3
|
+
require 'restpack_web/configuration'
|
2
4
|
require 'restpack_web/context'
|
3
|
-
|
5
|
+
|
6
|
+
require 'restpack_web/rack/domain'
|
7
|
+
require 'restpack_web/rack/user'
|
8
|
+
require 'restpack_web/rack/session'
|
4
9
|
|
5
10
|
require 'restpack_web/rails/controller'
|
6
11
|
require 'restpack_web/sinatra/app'
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module RestPack::Web
|
2
|
+
class Configuration
|
3
|
+
attr_accessor :authentication_port
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@authentication_port = nil
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
mattr_accessor :config
|
11
|
+
@@config = Configuration.new
|
12
|
+
|
13
|
+
def self.setup
|
14
|
+
yield @@config
|
15
|
+
end
|
16
|
+
end
|
data/lib/restpack_web/context.rb
CHANGED
@@ -1,119 +1,70 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
@domain = restpack[:domain]
|
14
|
-
@application = restpack[:application]
|
15
|
-
@channel = restpack[:channel]
|
16
|
-
@configurations = restpack[:configurations]
|
17
|
-
@user = restpack[:user]
|
18
|
-
@user_id = @user[:id] if @user
|
19
|
-
end
|
1
|
+
module RestPack::Web
|
2
|
+
class Context
|
3
|
+
attr_accessor :domain, :application, :user, :account
|
4
|
+
|
5
|
+
def initialize(env)
|
6
|
+
restpack = env['restpack']
|
7
|
+
|
8
|
+
if restpack
|
9
|
+
@domain = restpack[:domain]
|
10
|
+
@application = restpack[:application]
|
11
|
+
@user = restpack[:user]
|
12
|
+
@account = restpack[:account]
|
20
13
|
end
|
14
|
+
end
|
21
15
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
def get_configuration(key)
|
27
|
-
@configurations.find { |c| c.key == key }
|
28
|
-
end
|
29
|
-
|
30
|
-
def services
|
31
|
-
get_configuration('services').value
|
32
|
-
end
|
33
|
-
|
34
|
-
def get_service(name)
|
35
|
-
services.find { |s| s[:name] == name }
|
36
|
-
end
|
37
|
-
|
38
|
-
def get_service_domain(name)
|
39
|
-
get_service(name)[:domain]
|
40
|
-
end
|
41
|
-
|
42
|
-
def home_domain
|
43
|
-
@application.home_domain || "www.#{root_domain}"
|
44
|
-
end
|
45
|
-
|
46
|
-
def auth_domain
|
47
|
-
@application.auth_domain || "auth.#{root_domain}"
|
48
|
-
end
|
49
|
-
|
50
|
-
def root_domain
|
51
|
-
PublicSuffix.parse(@domain.host).domain
|
52
|
-
end
|
53
|
-
|
54
|
-
def logout_url(next_url = nil) #TODO: GJ: whitelist the next_url
|
55
|
-
next_url ||= "http://#{home_domain}/"
|
56
|
-
"http://#{auth_domain}/auth/logout?next=#{next_url}"
|
57
|
-
end
|
58
|
-
|
59
|
-
def login_url(provider = :twitter, next_url = nil)
|
60
|
-
next_url ||= "http://#{home_domain}/"
|
61
|
-
"http://#{auth_domain}/auth/#{provider}?next=#{next_url}"
|
62
|
-
end
|
63
|
-
|
64
|
-
def debug_info #TODO: GJ: move to a mixin
|
65
|
-
user_debug_info = ""
|
66
|
-
if is_authenticated?
|
67
|
-
image_debug_info = ""
|
68
|
-
image_debug_info = " * **image** : #{@user[:image]} ![Image](#{@user[:image]}" unless @user[:image].nil?
|
69
|
-
|
70
|
-
user_debug_info = %{
|
71
|
-
* **id** : #{@user[:id]}
|
72
|
-
* **name** : #{@user[:name]}
|
73
|
-
* **nickname** : #{@user[:nickname]}
|
74
|
-
* **location** : #{@user[:location]}
|
75
|
-
* **description** : #{@user[:description]}
|
76
|
-
#{image_debug_info})
|
77
|
-
}
|
78
|
-
end
|
16
|
+
def authenticated?
|
17
|
+
!@user.nil?
|
18
|
+
end
|
79
19
|
|
80
|
-
|
81
|
-
|
20
|
+
def user_id
|
21
|
+
authenticated? ? @user[:id] : nil
|
22
|
+
end
|
82
23
|
|
83
|
-
|
24
|
+
def account_id
|
25
|
+
authenticated? ? @account[:id] : nil
|
26
|
+
end
|
84
27
|
|
85
|
-
|
86
|
-
|
28
|
+
def application_id
|
29
|
+
@application[:id]
|
30
|
+
end
|
87
31
|
|
88
|
-
|
32
|
+
def domain_id
|
33
|
+
@domain[:id]
|
34
|
+
end
|
89
35
|
|
90
|
-
|
91
|
-
|
92
|
-
|
36
|
+
def home_domain
|
37
|
+
"www.#{@domain[:identifier]}"
|
38
|
+
end
|
93
39
|
|
94
|
-
|
40
|
+
def auth_domain
|
41
|
+
"auth.#{@domain[:identifier]}"
|
42
|
+
end
|
95
43
|
|
96
|
-
|
97
|
-
|
98
|
-
|
44
|
+
def logout_url(next_url = nil)
|
45
|
+
next_url ||= "http://#{home_domain}/"
|
46
|
+
auth_url('/auth/logout', next_url)
|
47
|
+
end
|
99
48
|
|
100
|
-
|
49
|
+
def login_url(provider = :twitter, next_url = nil)
|
50
|
+
auth_url("/auth/#{provider}", next_url)
|
51
|
+
end
|
101
52
|
|
102
|
-
|
103
|
-
|
53
|
+
def debug_info
|
54
|
+
"todo"
|
55
|
+
end
|
104
56
|
|
105
|
-
|
57
|
+
private
|
106
58
|
|
107
|
-
|
108
|
-
|
59
|
+
def auth_url(path, next_url = nil)
|
60
|
+
#TODO: GJ: whitelist the next_url?
|
61
|
+
#TODO: GJ: URI encode next_url?
|
62
|
+
port = RestPack::Web.config.authentication_port
|
109
63
|
|
110
|
-
|
64
|
+
port_part = port ? ":#{port}" : ""
|
65
|
+
next_part = next_url ? "?next=#{next_url}" : ""
|
111
66
|
|
112
|
-
|
113
|
-
* **twitter oauth**: #{login_url(:twitter)}
|
114
|
-
* **google oauth**: #{login_url(:google_oauth2)}
|
115
|
-
}
|
116
|
-
end
|
67
|
+
"http://#{auth_domain}#{port_part}#{path}#{next_part}"
|
117
68
|
end
|
118
69
|
end
|
119
70
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module RestPack::Web::Rack
|
2
|
+
class Domain
|
3
|
+
def initialize(app)
|
4
|
+
@app = app
|
5
|
+
end
|
6
|
+
|
7
|
+
def call(env)
|
8
|
+
identifier = Rack::Request.new(env).host
|
9
|
+
|
10
|
+
response = Commands::Core::Domain::ByIdentifier.run({
|
11
|
+
identifier: identifier,
|
12
|
+
include: 'applications'
|
13
|
+
})
|
14
|
+
|
15
|
+
if response.status == :ok
|
16
|
+
domain = response.result[:domains][0]
|
17
|
+
application = response.result[:applications][0]
|
18
|
+
|
19
|
+
env['restpack'] ||= {}
|
20
|
+
env['restpack'][:domain] = domain
|
21
|
+
env['restpack'][:application] = application
|
22
|
+
env['restpack'][:application_id] = application[:id]
|
23
|
+
|
24
|
+
env['restpack.session.options'] ||= {}
|
25
|
+
env['restpack.session.options'][:key] = 'restpack.session'
|
26
|
+
env['restpack.session.options'][:secret] = domain[:session_secret]
|
27
|
+
env['restpack.session.options'][:domain] = domain[:identifier]
|
28
|
+
else
|
29
|
+
#TODO: GJ: better exceptions based on response status
|
30
|
+
raise "[#{identifier}] is not a RestPack domain"
|
31
|
+
end
|
32
|
+
|
33
|
+
@app.call(env)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'restpack_user_service'
|
2
|
+
require 'restpack_account_service'
|
3
|
+
|
4
|
+
module RestPack::Web::Rack
|
5
|
+
class User
|
6
|
+
def initialize(app)
|
7
|
+
@app = app
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
session = env["restpack.session"]
|
12
|
+
user_id = session[:user_id]
|
13
|
+
account_id = session[:account_id]
|
14
|
+
|
15
|
+
if user_id && account_id
|
16
|
+
response = Commands::Users::User::Get.run({
|
17
|
+
id: user_id,
|
18
|
+
application_id: env['restpack'][:application_id]
|
19
|
+
})
|
20
|
+
|
21
|
+
raise "Error getting user" unless response.success?
|
22
|
+
env['restpack'][:user] = response.result[:users][0]
|
23
|
+
|
24
|
+
response = Commands::Accounts::Account::Get.run({
|
25
|
+
id: account_id,
|
26
|
+
application_id: env['restpack'][:application_id]
|
27
|
+
})
|
28
|
+
raise "Error getting account" unless response.success?
|
29
|
+
env['restpack'][:account] = response.result[:accounts][0]
|
30
|
+
end
|
31
|
+
|
32
|
+
@app.call(env)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -1,15 +1,11 @@
|
|
1
|
-
module RestPack
|
2
|
-
module
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
def include_restpack
|
10
|
-
@restpack = RestPack::Web::Context.new(request.env)
|
11
|
-
end
|
12
|
-
end
|
1
|
+
module RestPack::Web::Rails
|
2
|
+
module Controller
|
3
|
+
def self.included(base)
|
4
|
+
base.send(:before_filter, :setup_restpack_context)
|
5
|
+
end
|
6
|
+
|
7
|
+
def setup_restpack_context
|
8
|
+
@restpack = RestPack::Web::Context.new(request.env)
|
13
9
|
end
|
14
10
|
end
|
15
|
-
end
|
11
|
+
end
|
@@ -1,20 +1,13 @@
|
|
1
|
-
|
1
|
+
module RestPack::Web::Sinatra
|
2
|
+
module App
|
3
|
+
def self.included(base)
|
4
|
+
base.use RestPack::Web::Rack::Domain
|
5
|
+
base.use RestPack::Web::Rack::Session
|
6
|
+
base.use RestPack::Web::Rack::User
|
2
7
|
|
3
|
-
|
4
|
-
|
5
|
-
module Sinatra
|
6
|
-
module App
|
7
|
-
def self.included(base)
|
8
|
-
base.use Rack::AutoSessionDomain
|
9
|
-
base.use RestPack::Web::App
|
10
|
-
base.enable :sessions
|
11
|
-
base.set :session_secret, 'c40b83f9048c497891f0f71e4b040a3f' #TODO: GJ: from restpack config
|
12
|
-
|
13
|
-
base.before do
|
14
|
-
@restpack = RestPack::Web::Context.new(env)
|
15
|
-
end
|
16
|
-
end
|
8
|
+
base.before do
|
9
|
+
@restpack = RestPack::Web::Context.new(env)
|
17
10
|
end
|
18
11
|
end
|
19
12
|
end
|
20
|
-
end
|
13
|
+
end
|