oxd-ruby 0.1.3 → 0.1.7

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,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1f62bcf7aa49a59738e352feef3b8cd7a8484e4d
4
- data.tar.gz: 74257ef46a5a9037421e961f13445236d3a97ea4
3
+ metadata.gz: becb5e6cf7b08da462269a04cb94f5df77c9a903
4
+ data.tar.gz: e39d828b7f16eaf9a0a70e1eb70828065bc1c603
5
5
  SHA512:
6
- metadata.gz: 0b078e347c16be84fe679783bf5b9fdb3c9bd309086a31dfb1d48f851213c03294e622af81a9902e312868340b405cf0b0e0956b38077260c1016140c6230ef9
7
- data.tar.gz: dad53ad2f1da2bd6a431cfaf627871d039174bb96526a953a17be467b5603ba3b4f11141e00966c9dbbbcf8f2a9ac67f18538782812a85b620437c373f292b84
6
+ metadata.gz: 785054ee62b5971ac043b85987086f115c5d23052556182649b78ff34e335f307a6bd36c265b99c3c997079ef9458f049585c1a69bfbe3b6e1db0d947c7a0df6
7
+ data.tar.gz: 9d21df5d8571a358ef2bc5f56c22b1c384fb4adde6cbca19cf1c045880fa942b7ec0b2b7a1a6734da17136da7b80abc89c00f654dc3b3149bdd6b7a068563d75
data/.gitignore CHANGED
@@ -6,4 +6,4 @@
6
6
  /doc/
7
7
  /pkg/
8
8
  /spec/reports/
9
- /tmp/
9
+ /tmp/
@@ -0,0 +1,37 @@
1
+ # Change Log
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ ## [0.1.7] - 2017-03-10
5
+ ### Added
6
+ - `state` parameter in `get_tokens_by_code` command
7
+
8
+ ### Changes
9
+ - changed `get_logout_uri` command to use `id_token` generated by `get_tokens_by_code` command for `id_token_hint` parameter
10
+
11
+ ### Removed
12
+ - `access_token` parameter from `get_logout_uri` command
13
+
14
+ ### Bug Fix
15
+ - "String can't be coerced into Integer" while using `get_logout_uri` command
16
+
17
+ ## [0.1.6] - 2016-08-25
18
+ ### Added
19
+ - `client_secret_expires_at` parameter in `update_registration_site` command
20
+ - `prompt : login` parameter in `get_authorization_url` command
21
+ - `client_id` and `client_secret` parameter in `register_site` command
22
+
23
+ ### Removed
24
+ - `config.redirect_uris` parameter from configuration
25
+ - `redirect_uris` parameter from `register_site` and `update_registr_site` commands
26
+ - `state` and `scopes` parameters from `get_tokens_by_code` command
27
+
28
+ ## [0.1.5] - 2016-07-20
29
+ ### Added
30
+ - support for https protocol
31
+
32
+ ## [0.1.4] - 2016-06-25
33
+ ### Added
34
+ - support for oxd-server 2.4.4
35
+ - support for UMA
36
+ - `config.op_host` parameter in configuration
37
+ - added scopes "uma_protection","uma_authorization"
data/README.md CHANGED
@@ -1,47 +1,57 @@
1
1
  # Oxd Ruby
2
2
  [![Gem Version](https://badge.fury.io/rb/oxd-ruby.png)](https://badge.fury.io/rb/oxd-ruby)
3
3
 
4
- Ruby Client Library for the [Gluu oxD Server RP - v2.4.3](https://www.gluu.org/docs-oxd/).
4
+ Ruby Client Library for the [Gluu oxD Server RP - v2.4.4 to v3.0.1](https://www.gluu.org/docs-oxd/).
5
5
 
6
6
  **oxdruby** is a thin wrapper around the communication protocol of oxD server. This can be used to access the OpenID connect & UMA Authorization end points of the Gluu Server via the oxD RP. This library provides the function calls required by a website to access user information from a OpenID Connect Provider (OP) by using the OxD as the Relying Party (RP).
7
7
 
8
8
  ## Using the Library in your website
9
9
 
10
- > You are now on the `v2.4.3` branch. If you want to use `oxd-ruby` for production use, switch to the branch of the matching version as the `oxd-server` you are installing.
10
+ > You are now on the `master` branch. If you want to use `oxd-ruby` for production use, switch to the branch of the matching version as the `oxd-server` you are installing.
11
11
 
12
12
  [oxD RP](https://www.gluu.org/docs-oxd/) has complete information about the Code Authorization flow and the various details about oxD RP configuration. This document provides only documentation about the oxd-ruby library.
13
13
 
14
14
  ### Prerequisites
15
15
 
16
16
  * Install `gluu-oxd-server`
17
+
17
18
  Oxd-server needs to be running on your machine to connect with OP.
18
19
 
20
+ * Enable SSL on your website otherwise this library will not work.
21
+
19
22
  ### Installation
20
23
 
21
24
  To install gem, add this line to your application's Gemfile:
22
25
 
23
26
  ```ruby
24
- gem 'oxd-ruby', '~> 0.1.3'
27
+ gem 'oxd-ruby', '~> 0.1.7'
25
28
  ```
26
29
 
27
30
  Run bundle command to install it:
31
+
28
32
  ```bash
29
33
  $ bundle install
30
34
  ```
31
35
 
32
36
  ### Configuring
33
- After you installed oxd-ruby, you need to run the generator command:
37
+ After you installed oxd-ruby, you need to run the generator command to generate the configuration file:
38
+
34
39
  ```bash
35
40
  $ rails generate oxd:config
36
41
  ```
37
42
 
38
- The generator will install `oxd_config.rb` initializer file in `config/initializers` directory which conatins ALL of Oxd-Ruby's global configuration options.
39
- You must set values for `config.oxd_host_ip`, `config.oxd_host_port`, `config.authorization_redirect_uri` in config file.
40
- Change these settings according to your website otherwise your website will not be able to communicate properly with the Oxd Server.
43
+ The generator will install `oxd_config.rb` initializer file in `config/initializers` directory which conatins all the global configuration options for oxd-ruby plguin.
44
+ The following configurations must be set in config file before the plugin can be used.
45
+
46
+ 1. config.oxd_host_ip
47
+ 2. config.oxd_host_port
48
+ 3. config.op_host
49
+ 4. config.authorization_redirect_uri
50
+
41
51
 
42
52
  ## Usage
43
53
 
44
- Add these lines to your application_controller.rb file:
54
+ Add following snippet to your `application_controller.rb` file:
45
55
 
46
56
  ```ruby
47
57
  require 'oxd-ruby'
@@ -50,23 +60,25 @@ before_filter :set_oxd_commands_instance
50
60
  protected
51
61
  def set_oxd_commands_instance
52
62
  @oxd_command = Oxd::ClientOxdCommands.new
63
+ @uma_command = Oxd::UMACommands.new
53
64
  end
54
65
  ```
55
66
 
56
67
  The `ClientOxdCommands` class of the library provides all the methods required for the website to communicate with the oxD RP through sockets.
68
+ The `UMACommands` class provides commands for UMA Resource Server(UMA RS) and UMA Requesting Party(UMA RP) protocol.
57
69
 
58
70
  ### Website Registration
59
71
 
60
- The website can be registered with the OP using the `@oxd_command.register_site` call.
72
+ The website can be registered with the OpenId Provider using the `@oxd_command.register_site` call.
61
73
 
62
74
  ### Get Authorization URL
63
75
 
64
- The first step is to generate an authorization url which the user can visit to authorize your application to use the information from the OP.
76
+ The first step is to generate an authorization url which the user can visit to authorize your application to use the information from the OpenId Provider.
65
77
 
66
78
  ```ruby
67
79
  authorization_url = @oxd_command.get_authorization_url
68
80
  ```
69
- Using the above url the website can redirect the user for authentication at the OP.
81
+ Using the above url the website can redirect the user for authentication at the OpenId Provider.
70
82
 
71
83
  ### Get access token
72
84
 
@@ -75,14 +87,13 @@ The website needs to parse the information from the callback url and pass it on
75
87
  ```ruby
76
88
  code = params[:code]
77
89
  state = params[:state]
78
- scopes = params[:scope].split("+")
79
- access_token = @oxd_command.get_tokens_by_code( code, scopes, state )
90
+ access_token = @oxd_command.get_tokens_by_code( code,state )
80
91
  ```
81
- The values for code, scopes and state are parsed from the callback url query parameters.
92
+ The values for code are parsed from the callback url query parameters.
82
93
 
83
94
  ### Get user claims
84
95
 
85
- Claims (user information fields) made availble by the OP can be fetched using the access token obtained above.
96
+ Claims (user information fields) made availble by the OpenId Provider can be fetched using the access token obtained above.
86
97
 
87
98
  ```ruby
88
99
  user = @oxd_command.get_user_info(access_token)
@@ -90,25 +101,65 @@ user = @oxd_command.get_user_info(access_token)
90
101
 
91
102
  ### Using the claims
92
103
 
93
- Once the user data is obtained, the various claims supported by the OP can be used as required.
104
+ Once the user data is obtained, the various claims supported by the OpenId Provider can be used as required.
94
105
 
95
106
  ```ruby
96
107
  <% user.each do |field,value| %>
97
108
  <%= "#{field} : #{value}" %>
98
109
  <% end %>
99
110
  ```
100
- The availability of various claims are completely dependent on the OP.
111
+ The availability of various claims are completely dependent on the OpenId Provider.
101
112
 
102
113
  ### Logging out
103
114
 
104
115
  Once the required work is done the user can be logged out of the system.
105
116
 
106
117
  ```ruby
107
- logout_uri = @oxd_command.get_logout_uri(access_token, state, session_state)
118
+ logout_uri = @oxd_command.get_logout_uri(state, session_state)
108
119
  ```
109
120
  You can then redirect the user to obtained url to perform logout.
110
121
 
111
- ### Logs
122
+ ## Using UMA commands
123
+
124
+ ### UMA Protect resources
125
+
126
+ To protect resources with UMA Resource server, you need to add resources to library using `uma_add_resource(path, *conditions)` method. Then you can call following method to register resources for protection with UMA RS.
127
+
128
+ ```ruby
129
+ @uma_command.uma_add_resource(path, *conditions)
130
+ @uma_command.uma_rs_protect
131
+ ```
132
+
133
+ ### UMA Check access for a particular resource
134
+ To check wether you have access to a particular resource on UMA Resource Sevrer or not, use following method:
135
+
136
+ ```ruby
137
+ @uma_command.uma_rs_check_access(path, http_method)
138
+ ```
139
+ You must first get RPT before calling this method.
140
+
141
+ ### Get Requesting Party Token(RPT)
142
+ To gain access to protected resources at the UMA resource server, you must first obtain RPT.
143
+
144
+ ```ruby
145
+ @uma_command.uma_rp_get_rpt(force_new)
146
+ ```
147
+
148
+ ### Authorize RPT
149
+ You must first call `uma_rp_get_rpt` and `uma_rs_check_access` methods before authorizing RPT. If you have already obtained the RPT, use `uma_rp_authorize_rpt` method provided by oxd-ruby library to authorize it.
150
+
151
+ ```ruby
152
+ @uma_command.uma_rp_authorize_rpt
153
+ ```
154
+
155
+ ### Get Gluu Access Token(GAT)
156
+ To obtain GAT(Gluu Access Token) call following method with scopes as parameter.
157
+
158
+ ```ruby
159
+ @uma_command.uma_rp_get_gat(scopes)
160
+ ```
161
+
162
+ ## Logs
112
163
  You can find `oxd-ruby.log` file in `rails_app_root/log` folder. It contains all the logs about oxd-server connections, commands/data sent to server, recieved response and all the errors and exceptions raised.
113
164
 
114
165
  ## Demo Site
@@ -33,7 +33,7 @@ gem "twitter-bootstrap-rails"
33
33
  # Use Capistrano for deployment
34
34
  # gem 'capistrano-rails', group: :development
35
35
 
36
- gem 'oxd-ruby', '~> 0.1.3'
36
+ gem 'oxd-ruby', '~> 0.1.7'
37
37
 
38
38
  group :development, :test do
39
39
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
@@ -9,6 +9,7 @@ class ApplicationController < ActionController::Base
9
9
  before_filter :set_oxd_commands_instance
10
10
  protected
11
11
  def set_oxd_commands_instance
12
- @oxd_command = Oxd::ClientOxdCommands.new
12
+ @oxd_command = Oxd::ClientOxdCommands.new
13
+ @uma_command = Oxd::UMACommands.new
13
14
  end
14
15
  end
@@ -14,10 +14,9 @@ class HomeController < ApplicationController
14
14
 
15
15
  def login
16
16
  if(@oxd_command.getOxdId.present?)
17
- if (params[:code].present? && params[:state].present?)
18
- scopes = params[:scope].split("+")
17
+ if (params[:code].present?)
19
18
  # pass the parameters obtained from callback url to get access_token
20
- @access_token = @oxd_command.get_tokens_by_code( params[:code], scopes, params[:state])
19
+ @access_token = @oxd_command.get_tokens_by_code( params[:code], params[:state])
21
20
  end
22
21
  session.delete('oxd_access_token') if(session[:oxd_access_token].present?)
23
22
  session[:oxd_access_token] = @access_token
@@ -31,7 +30,7 @@ class HomeController < ApplicationController
31
30
  def logout
32
31
  # get logout url and redirect user that URL to logout from OP
33
32
  if(session[:oxd_access_token])
34
- @logout_url = @oxd_command.get_logout_uri(session[:oxd_access_token], session[:state], session[:session_state])
33
+ @logout_url = @oxd_command.get_logout_uri(session[:state], session[:session_state])
35
34
  redirect_to @logout_url
36
35
  end
37
36
  end
@@ -0,0 +1,40 @@
1
+ class UmaController < ApplicationController
2
+ skip_before_filter :verify_authenticity_token
3
+ require 'json'
4
+
5
+ def index
6
+ end
7
+
8
+ def protect_resources
9
+ condition1_for_path1 = {:httpMethods => ["GET"], :scopes => ["http://photoz.example.com/dev/actions/view"]}
10
+ condition2_for_path1 = {:httpMethods => ["PUT", "POST"], :scopes => ["http://photoz.example.com/dev/actions/all","http://photoz.example.com/dev/actions/add"], :ticketScopes => ["http://photoz.example.com/dev/actions/add"]}
11
+
12
+ condition1_for_path2 = {:httpMethods => ["GET"], :scopes => ["http://photoz.example.com/dev/actions/view"]}
13
+
14
+ @uma_command.uma_add_resource("/photo", condition1_for_path1, condition2_for_path1) # Add Resource#1
15
+ @uma_command.uma_add_resource("/document", condition1_for_path2) # Add Resource#2
16
+ response = @uma_command.uma_rs_protect # Register above resources with UMA RS
17
+ render :template => "uma/index", :locals => { :protect_resources_response => response }
18
+ end
19
+
20
+ def get_rpt
21
+ rpt = @uma_command.uma_rp_get_rpt('false') # Get RPT
22
+ render :template => "uma/index", :locals => { :rpt => rpt }
23
+ end
24
+
25
+ def check_access
26
+ response = @uma_command.uma_rs_check_access('/photo', 'GET') # Pass the resource path and http method to check access
27
+ render :template => "uma/index", :locals => { :check_access_response => response }
28
+ end
29
+
30
+ def authorize_rpt
31
+ response = @uma_command.uma_rp_authorize_rpt # Authorize RPT
32
+ render :template => "uma/index", :locals => { :authorize_rpt_response => response }
33
+ end
34
+
35
+ def get_gat
36
+ scopes = ["http://photoz.example.com/dev/actions/add","http://photoz.example.com/dev/actions/view","http://photoz.example.com/dev/actions/edit"]
37
+ gat = @uma_command.uma_rp_get_gat(scopes) # Pass scopes array to get GAT
38
+ render :template => "uma/index", :locals => { :gat => gat }
39
+ end
40
+ end
@@ -13,22 +13,22 @@
13
13
  <h3>oxd_config.rb</h3>
14
14
  <pre class="prettyprint">
15
15
  Oxd.configure do |config|
16
- config.oxd_host_ip = '127.0.0.1'
17
- config.oxd_host_port = 8099
18
- config.authorization_redirect_uri = "https://domain.example.com/login"
19
- config.logout_redirect_uri = "https://domain.example.com/logout"
20
- config.post_logout_redirect_uri = "https://domain.example.com/"
21
- config.scope = [ "openid", "profile" ]
22
- config.application_type = "web"
23
- config.redirect_uris = ["https://domain.example.com/login"]
24
- config.client_jwks_uri = ""
25
- config.client_token_endpoint_auth_method = ""
26
- config.client_request_uris = []
27
- config.contacts = ["example-email@gmail.com"]
28
- config.grant_types = []
29
- config.response_types = ["code"]
30
- config.acr_values = [ "basic" ]
31
- config.client_logout_uris = ['https://domain.example.com/logout']
16
+ config.oxd_host_ip = '127.0.0.1'
17
+ config.oxd_host_port = 8099
18
+ config.op_host = "https://ce-dev2.gluu.org"
19
+ config.authorization_redirect_uri = "https://oxd-rails.com/login"
20
+ config.logout_redirect_uri = "https://oxd-rails.com/logout"
21
+ config.post_logout_redirect_uri = "https://oxd-rails.com/"
22
+ config.scope = [ "openid", "profile" ]
23
+ config.application_type = "web"
24
+ config.client_jwks_uri = ""
25
+ config.client_token_endpoint_auth_method = ""
26
+ config.client_request_uris = []
27
+ config.contacts = ["example-email@gmail.com"]
28
+ config.grant_types = []
29
+ config.response_types = ["code"]
30
+ config.acr_values = ["basic"]
31
+ config.client_logout_uris = ['https://oxd-rails.com/logout']
32
32
  end
33
33
  </pre>
34
34
  </div>
@@ -63,9 +63,8 @@ end
63
63
  <pre class="prettyprint">
64
64
  def login
65
65
  if(@oxd_command.getOxdId.present?)
66
- if (params[:code].present? && params[:state].present?)
67
- scopes = params[:scope].split("+")
68
- @access_token = @oxd_command.get_tokens_by_code( params[:code], scopes, params[:state])
66
+ if (params[:code].present?)
67
+ @access_token = @oxd_command.get_tokens_by_code( params[:code],params[:state])
69
68
  end
70
69
  session.delete('oxd_access_token') if(session[:oxd_access_token].present?)
71
70
  session[:oxd_access_token] = @access_token
@@ -107,7 +106,13 @@ end
107
106
  </pre>
108
107
  </div>
109
108
  </div>
110
-
109
+ <div class="row">
110
+ <div class="col-md-6">
111
+ <h3>UMA Demo</h3>
112
+ <p>UMA defines how resource owners can control protected-resource access by clients operated by arbitrary requesting parties.Once the website has been registered and authorized with OP you can register protection document with UMA.</p>
113
+ <p><strong> Live demo. </strong><a class="btn btn-primary" href="<%= uma_index_path %>" target="_blank">Go to UMA demo page</a></p>
114
+ </div>
115
+ </div>
111
116
  <div class="row">
112
117
  <div class="col-md-6">
113
118
  <h3>Logging Out</h3>
@@ -118,7 +123,7 @@ end
118
123
  <pre class="prettyprint">
119
124
  def logout
120
125
  if(session[:oxd_access_token])
121
- @logout_url = @oxd_command.get_logout_uri(session[:oxd_access_token], session[:state], session[:session_state])
126
+ @logout_url = @oxd_command.get_logout_uri(session[:state], session[:session_state])
122
127
  redirect_to @logout_url
123
128
  end
124
129
  end
@@ -0,0 +1,121 @@
1
+ <div class="jumbotron">
2
+ <h2>UMA RS and UMA RP Demo page for OxD Ruby Library</h2>
3
+ </div>
4
+
5
+ <div class="row">
6
+ <div class="col-md-6">
7
+ <h3>UMA RS Protect resources</h3>
8
+ <p>To protect resources with UMA RS, you need to add resources to library using <code>uma_add_resource(path, *conditions)</code> method. Then you can call <code>uma_rs_protect</code> method to register resources for protection with UMA RS.</p>
9
+ <p><strong> Live demo. </strong><a class="btn btn-primary" href="<%= protect_resources_uma_index_path %>">Protect Resources</a></p>
10
+ <% if defined?(protect_resources_response) %>
11
+ <div class="alert alert-success">
12
+ <%= "Response Oxd ID: #{protect_resources_response}" %>
13
+ </div>
14
+ <% end %>
15
+ </div>
16
+ <div class="col-md-6">
17
+ <pre class="prettyprint">
18
+ def protect_resources
19
+ condition1 = {:httpMethods => ["GET"], :scopes => ["http://photoz.example.com/dev/actions/view"]}
20
+ condition2 = {:httpMethods => ["PUT", "POST"],
21
+ :scopes => ["http://photoz.example.com/dev/actions/all","http://photoz.example.com/dev/actions/add"],
22
+ :ticketScopes => ["http://photoz.example.com/dev/actions/add"]
23
+ }
24
+ @uma_command.uma_add_resource("/photo", condition1, condition2)
25
+ @uma_command.uma_rs_protect
26
+ end
27
+ </pre>
28
+ </div>
29
+ </div>
30
+ <hr>
31
+ <div class="row">
32
+ <div class="col-md-6">
33
+ <h3>UMA RP - Get RPT</h3>
34
+ <p>To gain access to protected resources at the UMA resource server, you must first obtain RPT (Requesting Party Token) using <code>uma_rp_get_rpt(force_new)</code> call.</p>
35
+ <p><strong> Live demo. </strong><a class="btn btn-primary" href="<%= get_rpt_uma_index_path %>">Get RPT</a></p>
36
+ <% if defined?(rpt) %>
37
+ <div class="alert alert-success">
38
+ <%= "Response RPT is: #{rpt}" %>
39
+ </div>
40
+ <% end %>
41
+ </div>
42
+ <div class="col-md-6">
43
+ <pre class="prettyprint">
44
+ def get_rpt
45
+ rpt = @uma_command.uma_rp_get_rpt(false)
46
+ render :template => "uma/index", :locals => { :rpt => rpt }
47
+ end
48
+ </pre>
49
+ </div>
50
+ </div>
51
+ <hr>
52
+ <div class="row">
53
+ <div class="col-md-6">
54
+ <h3>UMA RS Check Access</h3>
55
+ <p>To check wether you have access to a particular resource on UMA Resource Sevrer or not, make call to <code>uma_rs_check_access(path, http_method)</code> method.</p>
56
+ <p><strong> Live demo. </strong><a class="btn btn-primary" href="<%= check_access_uma_index_path %>">Check access</a></p>
57
+ <% if defined?(check_access_response) %>
58
+ <% if check_access_response['access'] == 'denied' %>
59
+ <div class="alert alert-warning">
60
+ <%= "Response : access #{check_access_response['access']}" %><br>
61
+ <%= "Response ticket : #{check_access_response['ticket']}" if check_access_response['ticket'].present? %>
62
+ </div>
63
+ <% else %>
64
+ <div class="alert alert-success">
65
+ <%= "Response : #{check_access_response}" %>
66
+ </div>
67
+ <% end %>
68
+ <% end %>
69
+ </div>
70
+ <div class="col-md-6">
71
+ <pre class="prettyprint">
72
+ def check_access
73
+ response = @uma_command.uma_rs_check_access('/photo', 'GET')
74
+ render :template => "uma/index", :locals => { :check_access_response => response }
75
+ end
76
+ </pre>
77
+ </div>
78
+ </div>
79
+ <hr>
80
+ <div class="row">
81
+ <div class="col-md-6">
82
+ <h3>UMA RP - Authorize RPT</h3>
83
+ <p>You must first get RPT (refer to 'Get RPT' section) before authorizing. If you have already obtained the RPT, use <code>uma_rp_authorize_rpt</code> method provided by oxd-ruby library to authorize RPT.</p>
84
+ <p><strong> Live demo. </strong><a class="btn btn-primary" href="<%= authorize_rpt_uma_index_path %>">Authorize RPT</a></p>
85
+ <% if defined?(authorize_rpt_response) %>
86
+ <div class="alert alert-success">
87
+ <%= "Response Oxd ID: #{authorize_rpt_response}" %>
88
+ </div>
89
+ <% end %>
90
+ </div>
91
+ <div class="col-md-6">
92
+ <pre class="prettyprint">
93
+ def authorize_rpt
94
+ response = @uma_command.uma_rp_authorize_rpt
95
+ render :template => "uma/index", :locals => { :authorize_rpt_response => response }
96
+ end
97
+ </pre>
98
+ </div>
99
+ </div>
100
+ <hr>
101
+ <div class="row">
102
+ <div class="col-md-6">
103
+ <h3>UMA RP - Get GAT</h3>
104
+ <p>To obtain GAT(Gluu Access Token) call to <code>uma_rp_get_gat(scopes)</code> method with scopes as parameter.</p>
105
+ <p><strong> Live demo. </strong><a class="btn btn-primary" href="<%= get_gat_uma_index_path %>">Get GAT</a></p>
106
+ <% if defined?(gat) %>
107
+ <div class="alert alert-success">
108
+ <%= "Response GAT is: #{gat}" %>
109
+ </div>
110
+ <% end %>
111
+ </div>
112
+ <div class="col-md-6">
113
+ <pre class="prettyprint">
114
+ def get_gat
115
+ scopes = ["http://photoz.example.com/dev/actions/add","http://photoz.example.com/dev/actions/view","http://photoz.example.com/dev/actions/edit"]
116
+ gat = @uma_command.uma_rp_get_gat(scopes)
117
+ render :template => "uma/index", :locals => { :gat => gat }
118
+ end
119
+ </pre>
120
+ </div>
121
+ </div>
@@ -2,12 +2,12 @@
2
2
  Oxd.configure do |config|
3
3
  config.oxd_host_ip = '127.0.0.1'
4
4
  config.oxd_host_port = 8099
5
+ config.op_host = "https://ce-dev2.gluu.org"
5
6
  config.authorization_redirect_uri = "https://oxd-rails.com/login"
6
7
  config.logout_redirect_uri = "https://oxd-rails.com/logout"
7
- config.post_logout_redirect_uri = "https://oxd-rails.com/logout"
8
- config.scope = [ "openid", "profile" ]
8
+ config.post_logout_redirect_uri = "https://oxd-rails.com/"
9
+ config.scope = [ "openid", "profile","uma_protection","uma_authorization" ]
9
10
  config.application_type = "web"
10
- config.redirect_uris = ["https://oxd-rails.com/login" ]
11
11
  config.client_jwks_uri = ""
12
12
  config.client_token_endpoint_auth_method = ""
13
13
  config.client_request_uris = []
@@ -5,6 +5,16 @@ Rails.application.routes.draw do
5
5
  get '/login' => 'home#login'
6
6
  get '/logout' => 'home#logout'
7
7
 
8
+ resources :uma do
9
+ collection do
10
+ get 'protect_resources'
11
+ get 'get_rpt'
12
+ get 'check_access'
13
+ get 'authorize_rpt'
14
+ get 'get_gat'
15
+ end
16
+ end
17
+
8
18
  # The priority is based upon order of creation: first created -> highest priority.
9
19
  # See how all your routes lay out with "rake routes".
10
20
 
@@ -2,12 +2,12 @@
2
2
  Oxd.configure do |config|
3
3
  config.oxd_host_ip = '127.0.0.1'
4
4
  config.oxd_host_port = 8099
5
+ config.op_host = "https://your.openid.provider.com"
5
6
  config.authorization_redirect_uri = "https://domain.example.com/callback"
6
7
  config.logout_redirect_uri = "https://domain.example.com/callback2"
7
8
  config.post_logout_redirect_uri = "https://domain.example.com/logout"
8
- config.scope = [ "openid", "profile" ]
9
+ config.scope = ["openid","profile","uma_protection","uma_authorization"]
9
10
  config.application_type = "web"
10
- config.redirect_uris = ["https://domain.example.com/callback" ]
11
11
  config.client_jwks_uri = ""
12
12
  config.client_token_endpoint_auth_method = ""
13
13
  config.client_request_uris = []
@@ -2,10 +2,11 @@
2
2
  require 'oxd/config'
3
3
  require 'oxd/oxd_connector'
4
4
  require 'oxd/client_oxd_commands'
5
+ require 'oxd/uma_commands'
5
6
 
6
7
  # @author Inderpal Singh
7
8
  # Oxd Module namespace
8
- # oxd_version 2.4.3
9
+ # oxd_version 2.4.4
9
10
  module Oxd
10
11
 
11
12
  end
@@ -1,5 +1,5 @@
1
1
  # @author Inderpal Singh
2
- # @note supports oxd-version 2.4.3
2
+ # @note supports oxd-version 2.4.4
3
3
  module Oxd
4
4
 
5
5
  require 'json'
@@ -21,12 +21,11 @@ module Oxd
21
21
  return @configuration.oxd_id
22
22
  else
23
23
  @command = 'register_site'
24
- @configuration.scope = [ "openid", "profile","email"]
25
24
  @params = {
25
+ "op_host" => @configuration.op_host,
26
26
  "authorization_redirect_uri" => @configuration.authorization_redirect_uri,
27
27
  "post_logout_redirect_uri" => @configuration.post_logout_redirect_uri,
28
- "application_type" => @configuration.application_type,
29
- "redirect_uris" => @configuration.redirect_uris,
28
+ "application_type" => @configuration.application_type,
30
29
  "acr_values" => @configuration.acr_values,
31
30
  "scope" => @configuration.scope,
32
31
  "client_jwks_uri" => @configuration.client_jwks_uri,
@@ -35,7 +34,9 @@ module Oxd
35
34
  "contacts" => @configuration.contacts,
36
35
  "grant_types" => @configuration.grant_types,
37
36
  "response_types"=> @configuration.response_types,
38
- "client_logout_uris"=> @configuration.client_logout_uris
37
+ "client_logout_uris"=> @configuration.client_logout_uris,
38
+ "client_secret"=> @configuration.client_secret,
39
+ "client_id"=> @configuration.client_id
39
40
  }
40
41
  request
41
42
  @configuration.oxd_id = getResponseData['oxd_id']
@@ -54,6 +55,7 @@ module Oxd
54
55
  @command = 'get_authorization_url'
55
56
  @params = {
56
57
  "oxd_id" => @configuration.oxd_id,
58
+ "prompt" => @configuration.prompt,
57
59
  "acr_values" => acr_values || @configuration.acr_values
58
60
  }
59
61
  request
@@ -61,22 +63,21 @@ module Oxd
61
63
  end
62
64
 
63
65
  # @param code [String] code obtained from the authorization url callback
64
- # @param scopes [Array] scopes authorized by the OP, obtained from the authorization url callback
65
- # @param state [String] state key obtained from the authorization url callback
66
- # @return [String] access_token
66
+ # @param state [String] state obtained from the authorization url callback
67
+ # @return [Hash] {:access_token, :id_token}
67
68
  # method to retrieve access token. It is called after the user authorizes by visiting the authorization url.
68
- def get_tokens_by_code( code, scopes, state = nil)
69
- if (code.empty? || scopes.empty? || (!scopes.kind_of? Array))
70
- logger(:log_msg => "Empty/Wrong value in place of code or scope.")
69
+ def get_tokens_by_code( code,state )
70
+ if (code.empty?)
71
+ logger(:log_msg => "Empty/Wrong value in place of code.")
71
72
  end
72
73
  @command = 'get_tokens_by_code'
73
74
  @params = {
74
75
  "oxd_id" => @configuration.oxd_id,
75
76
  "code" => code,
76
- "scopes" => scopes,
77
77
  "state" => state
78
78
  }
79
79
  request
80
+ @configuration.id_token = getResponseData['id_token']
80
81
  getResponseData['access_token']
81
82
  end
82
83
 
@@ -95,23 +96,23 @@ module Oxd
95
96
  request
96
97
  getResponseData['claims']
97
98
  end
98
-
99
- # @param access_token [String] REQUIRED, oxd server will use last used access token
99
+
100
100
  # @param state [String] OPTIONAL, website state obtained from the authorization url callback
101
101
  # @param session_state [String] OPTIONAL, session state obtained from the authorization url callback
102
102
  # @return [String] uri
103
103
  # method to retrieve logout url from OP. User must be redirected to this url to perform logout
104
- def get_logout_uri(access_token, state = nil, session_state = nil)
104
+ def get_logout_uri( state = nil, session_state = nil)
105
105
  @command = 'get_logout_uri'
106
106
  @params = {
107
107
  "oxd_id" => @configuration.oxd_id,
108
- "id_token_hint" => access_token,
108
+ "id_token_hint" => @configuration.id_token,
109
109
  "post_logout_redirect_uri" => @configuration.post_logout_redirect_uri,
110
110
  "state" => state,
111
111
  "session_state" => session_state
112
112
  }
113
113
  request
114
114
  getResponseData['uri']
115
+ #@configuration.oxd_id = "" #unset oxd_id after logout
115
116
  end
116
117
 
117
118
  # @return [Boolean] status - if site registration was updated successfully or not
@@ -124,7 +125,6 @@ module Oxd
124
125
  "oxd_id" => @configuration.oxd_id,
125
126
  "post_logout_redirect_uri" => @configuration.post_logout_redirect_uri,
126
127
  "application_type" => @configuration.application_type,
127
- "redirect_uris" => @configuration.redirect_uris,
128
128
  "acr_values" => @configuration.acr_values,
129
129
  "scope" => @configuration.scope,
130
130
  "client_jwks_uri" => @configuration.client_jwks_uri,
@@ -133,6 +133,7 @@ module Oxd
133
133
  "contacts" => @configuration.contacts,
134
134
  "grant_types" => @configuration.grant_types,
135
135
  "response_types"=> @configuration.response_types,
136
+ "client_secret_expires_at" => 3080736637943,
136
137
  "client_logout_uris"=> @configuration.client_logout_uris
137
138
  }
138
139
  request
@@ -1,7 +1,7 @@
1
1
  require 'active_support/configurable'
2
2
 
3
3
  # @author Inderpal Singh
4
- # @note supports oxd-version 2.4.3
4
+ # @note supports oxd-version 2.4.4
5
5
  module Oxd
6
6
 
7
7
  # Configures global settings for Oxd
@@ -27,9 +27,12 @@ module Oxd
27
27
  include ActiveSupport::Configurable
28
28
  config_accessor :oxd_host_ip
29
29
  config_accessor :oxd_host_port
30
+ config_accessor :op_host
31
+ config_accessor :client_id
32
+ config_accessor :client_secret
30
33
  config_accessor :application_type
34
+ config_accessor :prompt
31
35
  config_accessor :authorization_redirect_uri
32
- config_accessor :redirect_uris
33
36
  config_accessor :post_logout_redirect_uri
34
37
  config_accessor :client_logout_uris
35
38
  config_accessor :logout_redirect_uri
@@ -39,9 +42,12 @@ module Oxd
39
42
  config_accessor :client_token_endpoint_auth_method
40
43
  config_accessor :client_request_uris
41
44
  config_accessor :scope
45
+ config_accessor :id_token
42
46
  config_accessor :contacts
43
47
  config_accessor :response_types
44
48
  config_accessor :oxd_id
49
+ config_accessor :rpt
50
+ config_accessor :ticket
45
51
 
46
52
  # define param_name writer
47
53
  def param_name
@@ -60,7 +66,6 @@ module Oxd
60
66
  #[client]
61
67
  # application_type: the app_type is generally 'web' although 'native' can be used for native app
62
68
  # authorization_redirect_uri: [REQUIRED] this is the primary redirect URL of the website or app
63
- # redirect_uris: [OPTIONAL, LIST] other redirect uris that the website can use - given as comma seperated values.
64
69
  # => the first one is always your primary uri set in authorization_redirect_uri
65
70
  # post_logout_redirect_uri: [OPTIONAL] website's public uri to call upon logout
66
71
  # client_logout_uris: [REQUIRED, LIST] logout uris of the client
@@ -75,20 +80,22 @@ module Oxd
75
80
  configure do |config|
76
81
  config.oxd_host_ip = '127.0.0.1'
77
82
  config.oxd_host_port = 8099
78
- config.application_type = "web"
83
+ config.op_host = "https://gluu.example.com"
84
+ config.application_type = "web"
85
+ config.prompt = "login"
79
86
  config.authorization_redirect_uri = "https://gluu.example.com/callback"
80
- config.redirect_uris = ["https://gluu.example.com/callback","https://gluu.example.com/callback2"]
81
87
  config.post_logout_redirect_uri = "https://gluu.example.com/logout"
82
88
  config.client_logout_uris = ["https://gluu.example.com/callback"]
83
89
  config.logout_redirect_uri = 'https://gluu.example.com/logout'
84
90
  config.grant_types = []
85
- config.acr_values = [ "basic" ]
91
+ config.acr_values = ["basic"]
86
92
  config.client_jwks_uri = ""
87
93
  config.client_token_endpoint_auth_method = ""
88
94
  config.client_request_uris = []
89
- config.scope = [ "openid", "profile" ]
95
+ config.scope = ["openid", "profile","uma_protection","uma_authorization"]
90
96
  config.contacts = ["example-email@gmail.com"]
91
97
  config.response_types = ["code"]
92
98
  config.oxd_id = ""
99
+ config.id_token = ""
93
100
  end
94
101
  end
@@ -2,7 +2,7 @@ require 'socket'
2
2
  require 'ipaddr'
3
3
 
4
4
  # @author Inderpal Singh
5
- # @note supports oxd-version 2.4.3
5
+ # @note supports oxd-version 2.4.4
6
6
  module Oxd
7
7
 
8
8
  # A class which takes care of the socket communication with oxD Server.
@@ -16,7 +16,7 @@ module Oxd
16
16
  @data = Hash.new
17
17
  @params = Hash.new
18
18
  @response_data = Hash.new
19
- @configuration = Oxd.config
19
+ @configuration = Oxd.config
20
20
  logger(:log_msg => "Problem with json data : authorization_redirect_uri can't be blank") if @configuration.authorization_redirect_uri.empty?
21
21
  logger(:log_msg => "#{@configuration.oxd_host_ip} is not a valid IP address") if (IPAddr.new(@configuration.oxd_host_ip) rescue nil).nil?
22
22
  logger(:log_msg => "#{@configuration.oxd_host_port} is not a valid port for socket. Port must be integer and between from 0 to 65535") if (!@configuration.oxd_host_port.is_a?(Integer) || (@configuration.oxd_host_port < 0 && @configuration.oxd_host_port > 65535))
@@ -24,7 +24,7 @@ module Oxd
24
24
 
25
25
  # Checks the validity of command that is to be passed to oxd-server
26
26
  def validate_command
27
- command_types = ['get_authorization_url','update_site_registration', 'get_tokens_by_code','get_user_info', 'register_site', 'get_logout_uri','get_authorization_code']
27
+ command_types = ['get_authorization_url','update_site_registration', 'get_tokens_by_code','get_user_info', 'register_site', 'get_logout_uri','get_authorization_code','uma_rs_protect','uma_rs_check_access','uma_rp_get_rpt','uma_rp_authorize_rpt','uma_rp_get_gat']
28
28
  if (!command_types.include?(@command))
29
29
  logger(:log_msg => "Command: #{@command} does not exist! Exiting process.")
30
30
  end
@@ -61,6 +61,8 @@ module Oxd
61
61
  # method to send commands to the oxD server and to recieve the response via {#oxd_socket_request}
62
62
  # @return [JSON] @response_object : response from the oxd server in JSON form
63
63
  def request
64
+ uri = URI.parse(@configuration.authorization_redirect_uri)
65
+ logger(:log_msg => "Please enable SSL on your website or check URIs in Oxd configuration.") if (uri.scheme != 'https')
64
66
  validate_command
65
67
  jsondata = getData.to_json
66
68
  if(!is_json? (jsondata))
@@ -72,7 +74,7 @@ module Oxd
72
74
  else
73
75
  length = length <= 999 ? sprintf('0%d', length) : length
74
76
  end
75
- @response_json = oxd_socket_request((length + jsondata).encode("UTF-8"))
77
+ @response_json = oxd_socket_request((length.to_s + jsondata).encode("UTF-8"))
76
78
  @response_json.sub!(@response_json[0..3], "")
77
79
 
78
80
  if (@response_json)
@@ -88,6 +90,11 @@ module Oxd
88
90
  return @response_object
89
91
  end
90
92
 
93
+ # @return [Mixed] @response_object set by request method
94
+ def getResponseObject
95
+ return @response_object
96
+ end
97
+
91
98
  # extracts 'data' parameter from @response_object
92
99
  # @return [Mixed] @response_data
93
100
  def getResponseData
@@ -0,0 +1,113 @@
1
+ # @author Inderpal Singh
2
+ # @note supports oxd-version 2.4.4
3
+ module Oxd
4
+
5
+ require 'json'
6
+
7
+ # This class carries out the commands for UMA Resource Server and UMA Requesting Party
8
+ class UMACommands < OxdConnector
9
+
10
+ # class constructor
11
+ def initialize
12
+ @resources = Array.new
13
+ super
14
+ end
15
+
16
+ # @param path [STRING] REQUIRED
17
+ # @param conditions [HASH] REQUIRED (variable number of conditions can be passed)
18
+ # @return [ARRAY] resources
19
+ # @example
20
+ # condition1 = {:httpMethods => ["GET"], :scopes => ["http://photoz.example.com/dev/actions/view"]}
21
+ # condition2 = {:httpMethods => ["PUT", "POST"], :scopes => ["http://photoz.example.com/dev/actions/all","http://photoz.example.com/dev/actions/add"],:ticketScopes => ["http://photoz.example.com/dev/actions/add"]}
22
+ # uma_add_resource("/photo", condition1, condition2)
23
+ # combines multiple resources into @resources array to pass to uma_rs_protect method
24
+ def uma_add_resource(path, *conditions)
25
+ @resources.push({:path => path, :conditions => conditions})
26
+ end
27
+
28
+ # @return [STRING] oxd_id
29
+ # @raise RuntimeError if @resources is nil
30
+ # method to protect resources with UMA resource server
31
+ def uma_rs_protect
32
+ logger(:log_msg => "Please set resources with uma_add_resource(path, *conditions) method first.") if(@resources.nil?)
33
+ @command = 'uma_rs_protect'
34
+ @params = {
35
+ "oxd_id" => @configuration.oxd_id,
36
+ "resources" => @resources
37
+ }
38
+ request
39
+ getResponseData['oxd_id']
40
+ end
41
+
42
+ # @param force_new [BOOLEAN] REQUIRED
43
+ # @return [STRING] RPT
44
+ # @raise RuntimeError if force_new param is not boolean
45
+ # method for obtaining RPT to gain access to protected resources at the UMA resource server
46
+ def uma_rp_get_rpt(force_new)
47
+ logger(:log_msg => "Wrong value for force_new param. #{force_new.kind_of?(TrueClass)}") if(force_new.kind_of?(TrueClass) || force_new.kind_of?(FalseClass))
48
+ @command = 'uma_rp_get_rpt'
49
+ @params = {
50
+ "oxd_id" => @configuration.oxd_id,
51
+ "force_new" => force_new
52
+ }
53
+ request
54
+ @configuration.rpt = getResponseData['rpt']
55
+ end
56
+
57
+ # @param path [STRING] REQUIRED
58
+ # @param http_method [Array] REQUIRED, must be one from 'GET', 'POST', 'PUT', 'DELETE'
59
+ # @return [Hash] response data (access, ticket)
60
+ # method to check if we have permission to access particular resource or not
61
+ def uma_rs_check_access(path, http_method)
62
+ if (path.empty? || http_method.empty? || (!['GET', 'POST', 'PUT', 'DELETE'].include? http_method))
63
+ logger(:log_msg => "Empty/Wrong value in place of path or http_method.")
64
+ end
65
+ @command = 'uma_rs_check_access'
66
+ @params = {
67
+ "oxd_id" => @configuration.oxd_id,
68
+ "rpt" => @configuration.rpt,
69
+ "path" => path,
70
+ "http_method" => http_method
71
+ }
72
+ request
73
+ if getResponseData['access'] == 'denied' && !getResponseData['ticket'].empty?
74
+ @configuration.ticket = getResponseData['ticket']
75
+ elsif getResponseData['access'] == 'granted'
76
+ @configuration.ticket = ""
77
+ end
78
+ getResponseData
79
+ end
80
+
81
+ # @return [String] oxd_id
82
+ # @note This method should always be called after uma_rp_get_rpt and uma_rs_check_access methods
83
+ # Method to authorize generated RPT using oxd_id and ticket.
84
+ def uma_rp_authorize_rpt
85
+ @command = 'uma_rp_authorize_rpt'
86
+ @params = {
87
+ "oxd_id" => @configuration.oxd_id,
88
+ "rpt" => @configuration.rpt,
89
+ "ticket" => @configuration.ticket
90
+ }
91
+ request
92
+ getResponseData['oxd_id']
93
+ end
94
+
95
+ # @param scopes [Array] REQUIRED
96
+ # @return [String] rpt
97
+ # @example
98
+ # scopes = ["http://photoz.example.com/dev/actions/add","http://photoz.example.com/dev/actions/view"]
99
+ # uma_rp_get_gat(scopes)
100
+ # method to obtain GAT (Gluu Access Token)
101
+ def uma_rp_get_gat(scopes)
102
+ logger(:log_msg => "Invalid value for scopes argument.") if(!scopes.kind_of? Array)
103
+ @command = 'uma_rp_get_gat'
104
+ @params = {
105
+ "oxd_id" => @configuration.oxd_id,
106
+ "scopes" => scopes
107
+ }
108
+ request
109
+ logger(:log_msg => "Invalid GAT recieved : #{getResponseData['rpt']}") if(!getResponseData['rpt'].match(/gat_/)[0])
110
+ getResponseData['rpt']
111
+ end
112
+ end
113
+ end
@@ -1,4 +1,4 @@
1
1
  # Gem version
2
2
  module Oxd
3
- VERSION = "0.1.3"
3
+ VERSION = "0.1.7"
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oxd-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - inderpal6785
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-06-24 00:00:00.000000000 Z
11
+ date: 2017-03-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -76,6 +76,7 @@ files:
76
76
  - ".gitignore"
77
77
  - ".rspec"
78
78
  - ".travis.yml"
79
+ - CHANGELOG.md
79
80
  - CODE_OF_CONDUCT.md
80
81
  - Gemfile
81
82
  - LICENSE.txt
@@ -83,7 +84,6 @@ files:
83
84
  - Rakefile
84
85
  - demosite/.gitignore
85
86
  - demosite/Gemfile
86
- - demosite/Gemfile.lock
87
87
  - demosite/README.md
88
88
  - demosite/Rakefile
89
89
  - demosite/app/assets/images/.keep
@@ -94,12 +94,14 @@ files:
94
94
  - demosite/app/controllers/application_controller.rb
95
95
  - demosite/app/controllers/concerns/.keep
96
96
  - demosite/app/controllers/home_controller.rb
97
+ - demosite/app/controllers/uma_controller.rb
97
98
  - demosite/app/helpers/application_helper.rb
98
99
  - demosite/app/mailers/.keep
99
100
  - demosite/app/models/.keep
100
101
  - demosite/app/models/concerns/.keep
101
102
  - demosite/app/views/home/index.html.erb
102
103
  - demosite/app/views/layouts/application.html.erb
104
+ - demosite/app/views/uma/index.html.erb
103
105
  - demosite/bin/bundle
104
106
  - demosite/bin/rails
105
107
  - demosite/bin/rake
@@ -150,6 +152,7 @@ files:
150
152
  - lib/oxd/client_oxd_commands.rb
151
153
  - lib/oxd/config.rb
152
154
  - lib/oxd/oxd_connector.rb
155
+ - lib/oxd/uma_commands.rb
153
156
  - lib/oxd/version.rb
154
157
  - oxd-ruby.gemspec
155
158
  homepage: https://github.com/GluuFederation/oxd-ruby
@@ -1,190 +0,0 @@
1
- PATH
2
- remote: /var/www/oxd-ruby
3
- specs:
4
- oxd-ruby (0.1.3)
5
-
6
- GEM
7
- remote: https://rubygems.org/
8
- specs:
9
- actionmailer (4.2.6)
10
- actionpack (= 4.2.6)
11
- actionview (= 4.2.6)
12
- activejob (= 4.2.6)
13
- mail (~> 2.5, >= 2.5.4)
14
- rails-dom-testing (~> 1.0, >= 1.0.5)
15
- actionpack (4.2.6)
16
- actionview (= 4.2.6)
17
- activesupport (= 4.2.6)
18
- rack (~> 1.6)
19
- rack-test (~> 0.6.2)
20
- rails-dom-testing (~> 1.0, >= 1.0.5)
21
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
22
- actionview (4.2.6)
23
- activesupport (= 4.2.6)
24
- builder (~> 3.1)
25
- erubis (~> 2.7.0)
26
- rails-dom-testing (~> 1.0, >= 1.0.5)
27
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
28
- activejob (4.2.6)
29
- activesupport (= 4.2.6)
30
- globalid (>= 0.3.0)
31
- activemodel (4.2.6)
32
- activesupport (= 4.2.6)
33
- builder (~> 3.1)
34
- activerecord (4.2.6)
35
- activemodel (= 4.2.6)
36
- activesupport (= 4.2.6)
37
- arel (~> 6.0)
38
- activesupport (4.2.6)
39
- i18n (~> 0.7)
40
- json (~> 1.7, >= 1.7.7)
41
- minitest (~> 5.1)
42
- thread_safe (~> 0.3, >= 0.3.4)
43
- tzinfo (~> 1.1)
44
- arel (6.0.3)
45
- binding_of_caller (0.7.2)
46
- debug_inspector (>= 0.0.1)
47
- builder (3.2.2)
48
- byebug (9.0.5)
49
- coffee-rails (4.1.1)
50
- coffee-script (>= 2.2.0)
51
- railties (>= 4.0.0, < 5.1.x)
52
- coffee-script (2.4.1)
53
- coffee-script-source
54
- execjs
55
- coffee-script-source (1.10.0)
56
- commonjs (0.2.7)
57
- concurrent-ruby (1.0.2)
58
- daemons (1.2.3)
59
- debug_inspector (0.0.2)
60
- erubis (2.7.0)
61
- eventmachine (1.0.8)
62
- execjs (2.7.0)
63
- globalid (0.3.6)
64
- activesupport (>= 4.1.0)
65
- i18n (0.7.0)
66
- jbuilder (2.5.0)
67
- activesupport (>= 3.0.0, < 5.1)
68
- multi_json (~> 1.2)
69
- jquery-rails (4.1.1)
70
- rails-dom-testing (>= 1, < 3)
71
- railties (>= 4.2.0)
72
- thor (>= 0.14, < 2.0)
73
- json (1.8.3)
74
- less (2.6.0)
75
- commonjs (~> 0.2.7)
76
- less-rails (2.7.1)
77
- actionpack (>= 4.0)
78
- less (~> 2.6.0)
79
- sprockets (> 2, < 4)
80
- tilt
81
- loofah (2.0.3)
82
- nokogiri (>= 1.5.9)
83
- mail (2.6.4)
84
- mime-types (>= 1.16, < 4)
85
- mime-types (3.1)
86
- mime-types-data (~> 3.2015)
87
- mime-types-data (3.2016.0521)
88
- mini_portile2 (2.1.0)
89
- minitest (5.9.0)
90
- multi_json (1.12.1)
91
- nokogiri (1.6.8)
92
- mini_portile2 (~> 2.1.0)
93
- pkg-config (~> 1.1.7)
94
- passenger (5.0.28)
95
- rack
96
- rake (>= 0.8.1)
97
- pkg-config (1.1.7)
98
- rack (1.6.4)
99
- rack-test (0.6.3)
100
- rack (>= 1.0)
101
- rails (4.2.6)
102
- actionmailer (= 4.2.6)
103
- actionpack (= 4.2.6)
104
- actionview (= 4.2.6)
105
- activejob (= 4.2.6)
106
- activemodel (= 4.2.6)
107
- activerecord (= 4.2.6)
108
- activesupport (= 4.2.6)
109
- bundler (>= 1.3.0, < 2.0)
110
- railties (= 4.2.6)
111
- sprockets-rails
112
- rails-deprecated_sanitizer (1.0.3)
113
- activesupport (>= 4.2.0.alpha)
114
- rails-dom-testing (1.0.7)
115
- activesupport (>= 4.2.0.beta, < 5.0)
116
- nokogiri (~> 1.6.0)
117
- rails-deprecated_sanitizer (>= 1.0.1)
118
- rails-html-sanitizer (1.0.3)
119
- loofah (~> 2.0)
120
- railties (4.2.6)
121
- actionpack (= 4.2.6)
122
- activesupport (= 4.2.6)
123
- rake (>= 0.8.7)
124
- thor (>= 0.18.1, < 2.0)
125
- rake (11.2.0)
126
- rdoc (4.2.2)
127
- json (~> 1.4)
128
- sass (3.4.22)
129
- sass-rails (5.0.4)
130
- railties (>= 4.0.0, < 5.0)
131
- sass (~> 3.1)
132
- sprockets (>= 2.8, < 4.0)
133
- sprockets-rails (>= 2.0, < 4.0)
134
- tilt (>= 1.1, < 3)
135
- sdoc (0.4.1)
136
- json (~> 1.7, >= 1.7.7)
137
- rdoc (~> 4.0)
138
- spring (1.7.1)
139
- sprockets (3.6.0)
140
- concurrent-ruby (~> 1.0)
141
- rack (> 1, < 3)
142
- sprockets-rails (3.0.4)
143
- actionpack (>= 4.0)
144
- activesupport (>= 4.0)
145
- sprockets (>= 3.0.0)
146
- sqlite3 (1.3.11)
147
- thin (1.7.0)
148
- daemons (~> 1.0, >= 1.0.9)
149
- eventmachine (~> 1.0, >= 1.0.4)
150
- rack (>= 1, < 3)
151
- thor (0.19.1)
152
- thread_safe (0.3.5)
153
- tilt (2.0.5)
154
- turbolinks (2.5.3)
155
- coffee-rails
156
- twitter-bootstrap-rails (3.2.2)
157
- actionpack (>= 3.1)
158
- execjs (>= 2.2.2, >= 2.2)
159
- less-rails (>= 2.5.0)
160
- railties (>= 3.1)
161
- tzinfo (1.2.2)
162
- thread_safe (~> 0.1)
163
- uglifier (3.0.0)
164
- execjs (>= 0.3.0, < 3)
165
- web-console (2.3.0)
166
- activemodel (>= 4.0)
167
- binding_of_caller (>= 0.7.2)
168
- railties (>= 4.0)
169
- sprockets-rails (>= 2.0, < 4.0)
170
-
171
- PLATFORMS
172
- ruby
173
-
174
- DEPENDENCIES
175
- byebug
176
- coffee-rails (~> 4.1.0)
177
- jbuilder (~> 2.0)
178
- jquery-rails
179
- oxd-ruby!
180
- passenger
181
- rails (= 4.2.6)
182
- sass-rails (~> 5.0)
183
- sdoc (~> 0.4.0)
184
- spring
185
- sqlite3
186
- thin
187
- turbolinks
188
- twitter-bootstrap-rails
189
- uglifier (>= 1.3.0)
190
- web-console (~> 2.0)