couchkeeper 0.6.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.
Files changed (240) hide show
  1. data/.gitignore +14 -0
  2. data/.rspec +1 -0
  3. data/.travis.yml +28 -0
  4. data/CHANGELOG.md +198 -0
  5. data/Gemfile +32 -0
  6. data/MIT-LICENSE +20 -0
  7. data/README.md +290 -0
  8. data/Rakefile +18 -0
  9. data/app/assets/javascripts/doorkeeper/application.js +2 -0
  10. data/app/assets/stylesheets/doorkeeper/application.css +18 -0
  11. data/app/assets/stylesheets/doorkeeper/form.css +13 -0
  12. data/app/controllers/doorkeeper/application_controller.rb +7 -0
  13. data/app/controllers/doorkeeper/applications_controller.rb +60 -0
  14. data/app/controllers/doorkeeper/authorizations_controller.rb +57 -0
  15. data/app/controllers/doorkeeper/authorized_applications_controller.rb +12 -0
  16. data/app/controllers/doorkeeper/token_info_controller.rb +12 -0
  17. data/app/controllers/doorkeeper/tokens_controller.rb +20 -0
  18. data/app/helpers/doorkeeper/form_errors_helper.rb +9 -0
  19. data/app/validators/redirect_uri_validator.rb +23 -0
  20. data/app/views/doorkeeper/applications/_form.html.erb +34 -0
  21. data/app/views/doorkeeper/applications/edit.html.erb +13 -0
  22. data/app/views/doorkeeper/applications/index.html.erb +29 -0
  23. data/app/views/doorkeeper/applications/new.html.erb +13 -0
  24. data/app/views/doorkeeper/applications/show.html.erb +26 -0
  25. data/app/views/doorkeeper/authorizations/error.html.erb +6 -0
  26. data/app/views/doorkeeper/authorizations/new.html.erb +37 -0
  27. data/app/views/doorkeeper/authorizations/show.html.erb +4 -0
  28. data/app/views/doorkeeper/authorized_applications/index.html.erb +25 -0
  29. data/app/views/layouts/doorkeeper/application.html.erb +33 -0
  30. data/config/locales/en.yml +68 -0
  31. data/doorkeeper.gemspec +28 -0
  32. data/lib/doorkeeper.rb +64 -0
  33. data/lib/doorkeeper/config.rb +194 -0
  34. data/lib/doorkeeper/doorkeeper_for.rb +76 -0
  35. data/lib/doorkeeper/engine.rb +19 -0
  36. data/lib/doorkeeper/errors.rb +15 -0
  37. data/lib/doorkeeper/helpers/controller.rb +58 -0
  38. data/lib/doorkeeper/helpers/filter.rb +38 -0
  39. data/lib/doorkeeper/models/access_grant.rb +24 -0
  40. data/lib/doorkeeper/models/access_token.rb +95 -0
  41. data/lib/doorkeeper/models/accessible.rb +9 -0
  42. data/lib/doorkeeper/models/active_record/access_grant.rb +5 -0
  43. data/lib/doorkeeper/models/active_record/access_token.rb +21 -0
  44. data/lib/doorkeeper/models/active_record/application.rb +20 -0
  45. data/lib/doorkeeper/models/application.rb +33 -0
  46. data/lib/doorkeeper/models/couchbase/access_grant.rb +10 -0
  47. data/lib/doorkeeper/models/couchbase/access_token.rb +7 -0
  48. data/lib/doorkeeper/models/couchbase/application.rb +35 -0
  49. data/lib/doorkeeper/models/doorkeeper_access_grant/by_token/map.js +5 -0
  50. data/lib/doorkeeper/models/doorkeeper_access_token/by_application_id/map.js +5 -0
  51. data/lib/doorkeeper/models/doorkeeper_access_token/by_application_id_and_resource_owner_id/map.js +5 -0
  52. data/lib/doorkeeper/models/doorkeeper_access_token/by_refresh_token/map.js +5 -0
  53. data/lib/doorkeeper/models/doorkeeper_access_token/by_resource_owner_id/map.js +5 -0
  54. data/lib/doorkeeper/models/doorkeeper_access_token/by_token/map.js +5 -0
  55. data/lib/doorkeeper/models/doorkeeper_application/by_uid/map.js +5 -0
  56. data/lib/doorkeeper/models/doorkeeper_application/by_uid_and_secret/map.js +5 -0
  57. data/lib/doorkeeper/models/doorkeeper_application/show_all/map.js +6 -0
  58. data/lib/doorkeeper/models/expirable.rb +21 -0
  59. data/lib/doorkeeper/models/mongo_mapper/access_grant.rb +28 -0
  60. data/lib/doorkeeper/models/mongo_mapper/access_token.rb +51 -0
  61. data/lib/doorkeeper/models/mongo_mapper/application.rb +30 -0
  62. data/lib/doorkeeper/models/mongo_mapper/revocable.rb +15 -0
  63. data/lib/doorkeeper/models/mongoid/revocable.rb +15 -0
  64. data/lib/doorkeeper/models/mongoid/scopes.rb +15 -0
  65. data/lib/doorkeeper/models/mongoid2/access_grant.rb +22 -0
  66. data/lib/doorkeeper/models/mongoid2/access_token.rb +41 -0
  67. data/lib/doorkeeper/models/mongoid2/application.rb +22 -0
  68. data/lib/doorkeeper/models/mongoid3/access_grant.rb +22 -0
  69. data/lib/doorkeeper/models/mongoid3/access_token.rb +41 -0
  70. data/lib/doorkeeper/models/mongoid3/application.rb +22 -0
  71. data/lib/doorkeeper/models/ownership.rb +16 -0
  72. data/lib/doorkeeper/models/scopes.rb +17 -0
  73. data/lib/doorkeeper/oauth/authorization.rb +10 -0
  74. data/lib/doorkeeper/oauth/authorization/code.rb +32 -0
  75. data/lib/doorkeeper/oauth/authorization/token.rb +28 -0
  76. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +29 -0
  77. data/lib/doorkeeper/oauth/authorization_code_request.rb +82 -0
  78. data/lib/doorkeeper/oauth/client.rb +29 -0
  79. data/lib/doorkeeper/oauth/client/credentials.rb +21 -0
  80. data/lib/doorkeeper/oauth/client/methods.rb +18 -0
  81. data/lib/doorkeeper/oauth/client_credentials/creator.rb +29 -0
  82. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +35 -0
  83. data/lib/doorkeeper/oauth/client_credentials/validation.rb +33 -0
  84. data/lib/doorkeeper/oauth/client_credentials_request.rb +47 -0
  85. data/lib/doorkeeper/oauth/code_request.rb +28 -0
  86. data/lib/doorkeeper/oauth/code_response.rb +37 -0
  87. data/lib/doorkeeper/oauth/error.rb +9 -0
  88. data/lib/doorkeeper/oauth/error_response.rb +44 -0
  89. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +18 -0
  90. data/lib/doorkeeper/oauth/helpers/unique_token.rb +13 -0
  91. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +32 -0
  92. data/lib/doorkeeper/oauth/password_access_token_request.rb +84 -0
  93. data/lib/doorkeeper/oauth/pre_authorization.rb +62 -0
  94. data/lib/doorkeeper/oauth/refresh_token_request.rb +58 -0
  95. data/lib/doorkeeper/oauth/scopes.rb +60 -0
  96. data/lib/doorkeeper/oauth/token.rb +36 -0
  97. data/lib/doorkeeper/oauth/token_request.rb +28 -0
  98. data/lib/doorkeeper/oauth/token_response.rb +29 -0
  99. data/lib/doorkeeper/rails/routes.rb +90 -0
  100. data/lib/doorkeeper/rails/routes/mapper.rb +28 -0
  101. data/lib/doorkeeper/rails/routes/mapping.rb +39 -0
  102. data/lib/doorkeeper/request.rb +33 -0
  103. data/lib/doorkeeper/request/authorization_code.rb +23 -0
  104. data/lib/doorkeeper/request/client_credentials.rb +23 -0
  105. data/lib/doorkeeper/request/code.rb +24 -0
  106. data/lib/doorkeeper/request/password.rb +23 -0
  107. data/lib/doorkeeper/request/refresh_token.rb +23 -0
  108. data/lib/doorkeeper/request/token.rb +24 -0
  109. data/lib/doorkeeper/server.rb +54 -0
  110. data/lib/doorkeeper/validations.rb +30 -0
  111. data/lib/doorkeeper/version.rb +3 -0
  112. data/lib/generators/doorkeeper/application_owner_generator.rb +15 -0
  113. data/lib/generators/doorkeeper/install_generator.rb +12 -0
  114. data/lib/generators/doorkeeper/migration_generator.rb +15 -0
  115. data/lib/generators/doorkeeper/mongo_mapper/indexes_generator.rb +12 -0
  116. data/lib/generators/doorkeeper/templates/README +44 -0
  117. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb +7 -0
  118. data/lib/generators/doorkeeper/templates/indexes.rb +3 -0
  119. data/lib/generators/doorkeeper/templates/initializer.rb +67 -0
  120. data/lib/generators/doorkeeper/templates/migration.rb +42 -0
  121. data/lib/generators/doorkeeper/views_generator.rb +15 -0
  122. data/script/rails +6 -0
  123. data/script/run_all +14 -0
  124. data/spec/controllers/applications_controller_spec.rb +18 -0
  125. data/spec/controllers/authorizations_controller_spec.rb +154 -0
  126. data/spec/controllers/protected_resources_controller_spec.rb +304 -0
  127. data/spec/controllers/token_info_controller_spec.rb +54 -0
  128. data/spec/controllers/tokens_controller_spec.rb +36 -0
  129. data/spec/dummy/Rakefile +7 -0
  130. data/spec/dummy/app/assets/javascripts/application.js +9 -0
  131. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  132. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  133. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +7 -0
  134. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +12 -0
  135. data/spec/dummy/app/controllers/home_controller.rb +17 -0
  136. data/spec/dummy/app/controllers/metal_controller.rb +11 -0
  137. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +11 -0
  138. data/spec/dummy/app/helpers/application_helper.rb +5 -0
  139. data/spec/dummy/app/models/user.rb +27 -0
  140. data/spec/dummy/app/views/home/index.html.erb +0 -0
  141. data/spec/dummy/app/views/layouts/application.html.erb +16 -0
  142. data/spec/dummy/config.ru +4 -0
  143. data/spec/dummy/config/application.rb +54 -0
  144. data/spec/dummy/config/boot.rb +6 -0
  145. data/spec/dummy/config/database.yml +15 -0
  146. data/spec/dummy/config/environment.rb +5 -0
  147. data/spec/dummy/config/environments/development.rb +30 -0
  148. data/spec/dummy/config/environments/production.rb +60 -0
  149. data/spec/dummy/config/environments/test.rb +39 -0
  150. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  151. data/spec/dummy/config/initializers/doorkeeper.rb +56 -0
  152. data/spec/dummy/config/initializers/secret_token.rb +9 -0
  153. data/spec/dummy/config/initializers/session_store.rb +8 -0
  154. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  155. data/spec/dummy/config/locales/doorkeeper.en.yml +5 -0
  156. data/spec/dummy/config/mongo.yml +11 -0
  157. data/spec/dummy/config/mongoid2.yml +9 -0
  158. data/spec/dummy/config/mongoid3.yml +18 -0
  159. data/spec/dummy/config/routes.rb +38 -0
  160. data/spec/dummy/db/migrate/20111122132257_create_users.rb +9 -0
  161. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +5 -0
  162. data/spec/dummy/db/migrate/20120524202412_create_doorkeeper_tables.rb +44 -0
  163. data/spec/dummy/db/schema.rb +64 -0
  164. data/spec/dummy/public/404.html +26 -0
  165. data/spec/dummy/public/422.html +26 -0
  166. data/spec/dummy/public/500.html +26 -0
  167. data/spec/dummy/public/favicon.ico +0 -0
  168. data/spec/dummy/script/rails +6 -0
  169. data/spec/factories/access_grant.rb +9 -0
  170. data/spec/factories/access_token.rb +7 -0
  171. data/spec/factories/application.rb +6 -0
  172. data/spec/generators/application_owner_generator_spec.rb +23 -0
  173. data/spec/generators/install_generator_spec.rb +31 -0
  174. data/spec/generators/migration_generator_spec.rb +20 -0
  175. data/spec/generators/templates/routes.rb +3 -0
  176. data/spec/generators/views_generator_spec.rb +27 -0
  177. data/spec/lib/config_spec.rb +170 -0
  178. data/spec/lib/models/expirable_spec.rb +51 -0
  179. data/spec/lib/models/revocable_spec.rb +31 -0
  180. data/spec/lib/models/scopes_spec.rb +32 -0
  181. data/spec/lib/oauth/authorization/uri_builder_spec.rb +37 -0
  182. data/spec/lib/oauth/authorization_code_request_spec.rb +80 -0
  183. data/spec/lib/oauth/client/credentials_spec.rb +47 -0
  184. data/spec/lib/oauth/client/methods_spec.rb +54 -0
  185. data/spec/lib/oauth/client_credentials/creator_spec.rb +47 -0
  186. data/spec/lib/oauth/client_credentials/issuer_spec.rb +57 -0
  187. data/spec/lib/oauth/client_credentials/validation_spec.rb +29 -0
  188. data/spec/lib/oauth/client_credentials_integration_spec.rb +27 -0
  189. data/spec/lib/oauth/client_credentials_request_spec.rb +64 -0
  190. data/spec/lib/oauth/client_spec.rb +39 -0
  191. data/spec/lib/oauth/code_request_spec.rb +44 -0
  192. data/spec/lib/oauth/error_response_spec.rb +40 -0
  193. data/spec/lib/oauth/error_spec.rb +19 -0
  194. data/spec/lib/oauth/helpers/scope_checker_spec.rb +74 -0
  195. data/spec/lib/oauth/helpers/unique_token_spec.rb +20 -0
  196. data/spec/lib/oauth/helpers/uri_checker_spec.rb +64 -0
  197. data/spec/lib/oauth/password_access_token_request_spec.rb +65 -0
  198. data/spec/lib/oauth/pre_authorization_spec.rb +80 -0
  199. data/spec/lib/oauth/refresh_token_request_spec.rb +56 -0
  200. data/spec/lib/oauth/scopes_spec.rb +115 -0
  201. data/spec/lib/oauth/token_request_spec.rb +46 -0
  202. data/spec/lib/oauth/token_response_spec.rb +52 -0
  203. data/spec/lib/oauth/token_spec.rb +83 -0
  204. data/spec/lib/server_spec.rb +24 -0
  205. data/spec/models/doorkeeper/access_grant_spec.rb +36 -0
  206. data/spec/models/doorkeeper/access_token_spec.rb +153 -0
  207. data/spec/models/doorkeeper/application_spec.rb +162 -0
  208. data/spec/requests/applications/applications_request_spec.rb +92 -0
  209. data/spec/requests/applications/authorized_applications_spec.rb +30 -0
  210. data/spec/requests/endpoints/authorization_spec.rb +47 -0
  211. data/spec/requests/endpoints/token_spec.rb +46 -0
  212. data/spec/requests/flows/authorization_code_errors_spec.rb +66 -0
  213. data/spec/requests/flows/authorization_code_spec.rb +135 -0
  214. data/spec/requests/flows/client_credentials_spec.rb +58 -0
  215. data/spec/requests/flows/implicit_grant_errors_spec.rb +31 -0
  216. data/spec/requests/flows/implicit_grant_spec.rb +19 -0
  217. data/spec/requests/flows/password_spec.rb +78 -0
  218. data/spec/requests/flows/refresh_token_spec.rb +71 -0
  219. data/spec/requests/flows/skip_authorization_spec.rb +40 -0
  220. data/spec/requests/protected_resources/metal_spec.rb +14 -0
  221. data/spec/requests/protected_resources/private_api_spec.rb +50 -0
  222. data/spec/routing/custom_controller_routes_spec.rb +44 -0
  223. data/spec/routing/default_routes_spec.rb +32 -0
  224. data/spec/spec_helper.rb +2 -0
  225. data/spec/spec_helper_integration.rb +40 -0
  226. data/spec/support/dependencies/factory_girl.rb +2 -0
  227. data/spec/support/helpers/access_token_request_helper.rb +11 -0
  228. data/spec/support/helpers/authorization_request_helper.rb +32 -0
  229. data/spec/support/helpers/config_helper.rb +9 -0
  230. data/spec/support/helpers/model_helper.rb +45 -0
  231. data/spec/support/helpers/request_spec_helper.rb +72 -0
  232. data/spec/support/helpers/url_helper.rb +51 -0
  233. data/spec/support/orm/active_record.rb +11 -0
  234. data/spec/support/orm/mongo_mapper.rb +26 -0
  235. data/spec/support/orm/mongoid.rb +31 -0
  236. data/spec/support/shared/controllers_shared_context.rb +60 -0
  237. data/spec/support/shared/models_shared_examples.rb +60 -0
  238. data/spec/validators/redirect_uri_validator_spec.rb +47 -0
  239. data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +356 -0
  240. metadata +430 -0
@@ -0,0 +1,18 @@
1
+ module Doorkeeper
2
+ module OAuth
3
+ module Helpers
4
+ module ScopeChecker
5
+ def self.matches?(current_scopes, scopes)
6
+ return false if current_scopes.nil? || scopes.nil?
7
+ current_scopes == scopes
8
+ end
9
+
10
+ def self.valid?(scope, server_scopes)
11
+ scope.present? &&
12
+ scope !~ /[\n|\r|\t]/ &&
13
+ server_scopes.has_scopes?(Doorkeeper::OAuth::Scopes.from_string(scope))
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ module Doorkeeper
2
+ module OAuth
3
+ module Helpers
4
+ module UniqueToken
5
+ def self.generate(options = {})
6
+ generator_method = options.delete(:generator) || SecureRandom.method(:hex)
7
+ token_size = options.delete(:size) || 32
8
+ generator_method.call(token_size)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,32 @@
1
+ module Doorkeeper
2
+ module OAuth
3
+ module Helpers
4
+ module URIChecker
5
+ def self.valid?(url)
6
+ uri = as_uri(url)
7
+ uri.fragment.nil? && !uri.host.nil? && !uri.scheme.nil?
8
+ rescue URI::InvalidURIError
9
+ false
10
+ end
11
+
12
+ def self.matches?(url, client_url)
13
+ url, client_url = as_uri(url), as_uri(client_url)
14
+ url.query = nil
15
+ url == client_url
16
+ end
17
+
18
+ def self.valid_for_authorization?(url, client_url)
19
+ valid?(url) && matches?(url, client_url)
20
+ end
21
+
22
+ def self.as_uri(url)
23
+ URI.parse(url)
24
+ end
25
+
26
+ def self.test_uri?(url)
27
+ url == Doorkeeper.configuration.test_redirect_uri
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,84 @@
1
+ module Doorkeeper::OAuth
2
+ class PasswordAccessTokenRequest
3
+ include Doorkeeper::Validations
4
+ include Doorkeeper::OAuth::Helpers
5
+
6
+ validate :client, :error => :invalid_client
7
+ validate :resource_owner, :error => :invalid_resource_owner
8
+ validate :scopes, :error => :invalid_scope
9
+
10
+ attr_accessor :server, :resource_owner, :client
11
+
12
+ def initialize(server, client, resource_owner, parameters = {})
13
+ @server = server
14
+ @resource_owner = resource_owner
15
+ @client = client
16
+ @original_scopes = parameters[:scope]
17
+ end
18
+
19
+ def authorize
20
+ validate
21
+ @response = if valid?
22
+ find_or_create_access_token
23
+ TokenResponse.new access_token
24
+ else
25
+ ErrorResponse.from_request self
26
+ end
27
+ end
28
+
29
+ def valid?
30
+ self.error.nil?
31
+ end
32
+
33
+ def access_token
34
+ return unless client.present? && resource_owner.present?
35
+ @access_token ||= Doorkeeper::AccessToken.matching_token_for client, resource_owner.id, scopes
36
+ end
37
+
38
+ def scopes
39
+ @scopes ||= if @original_scopes.present?
40
+ Doorkeeper::OAuth::Scopes.from_string(@original_scopes)
41
+ else
42
+ server.default_scopes
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ def find_or_create_access_token
49
+ if access_token
50
+ access_token.expired? ? revoke_and_create_access_token : access_token
51
+ else
52
+ create_access_token
53
+ end
54
+ end
55
+
56
+ def revoke_and_create_access_token
57
+ access_token.revoke
58
+ create_access_token
59
+ end
60
+
61
+ def create_access_token
62
+ @access_token = Doorkeeper::AccessToken.create!({
63
+ :application_id => client.id,
64
+ :resource_owner_id => resource_owner.id,
65
+ :scopes => scopes.to_s,
66
+ :expires_in => server.access_token_expires_in,
67
+ :use_refresh_token => server.refresh_token_enabled?
68
+ })
69
+ end
70
+
71
+ def validate_client
72
+ !!client
73
+ end
74
+
75
+ def validate_scopes
76
+ return true unless @original_scopes.present?
77
+ ScopeChecker.valid?(@original_scopes, @server.scopes)
78
+ end
79
+
80
+ def validate_resource_owner
81
+ !!resource_owner
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,62 @@
1
+ module Doorkeeper
2
+ module OAuth
3
+ class PreAuthorization
4
+ include Doorkeeper::Validations
5
+
6
+ validate :response_type, :error => :unsupported_response_type
7
+ validate :client, :error => :invalid_client
8
+ validate :scopes, :error => :invalid_scope
9
+ validate :redirect_uri, :error => :invalid_redirect_uri
10
+
11
+ attr_accessor :server, :client, :response_type, :redirect_uri, :state
12
+ attr_writer :scope
13
+
14
+ def initialize(server, client, attrs = {})
15
+ @server = server
16
+ @client = client
17
+ @response_type = attrs[:response_type]
18
+ @redirect_uri = attrs[:redirect_uri]
19
+ @scope = attrs[:scope]
20
+ @state = attrs[:state]
21
+ end
22
+
23
+ def authorizable?
24
+ return true
25
+ end
26
+
27
+ def scopes
28
+ Scopes.from_string scope
29
+ end
30
+
31
+ def scope
32
+ @scope.presence || server.default_scopes.to_s
33
+ end
34
+
35
+ def error_response
36
+ Doorkeeper::OAuth::ErrorResponse.from_request(self)
37
+ end
38
+
39
+ private
40
+
41
+ def validate_response_type
42
+ %w[code token].include? response_type
43
+ end
44
+
45
+ def validate_client
46
+ client.present?
47
+ end
48
+
49
+ def validate_scopes
50
+ return true unless scope.present?
51
+ Helpers::ScopeChecker.valid? scope, server.scopes
52
+ end
53
+
54
+ # TODO: test uri should be matched against the client's one
55
+ def validate_redirect_uri
56
+ return false unless redirect_uri.present?
57
+ Helpers::URIChecker.test_uri?(redirect_uri) ||
58
+ Helpers::URIChecker.valid_for_authorization?(redirect_uri, client.redirect_uri)
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,58 @@
1
+ module Doorkeeper
2
+ module OAuth
3
+ class RefreshTokenRequest
4
+ include Doorkeeper::Validations
5
+
6
+ validate :token, :error => :invalid_request
7
+ validate :client, :error => :invalid_client
8
+
9
+ attr_accessor :server, :refresh_token, :client, :access_token
10
+
11
+ # TODO: refresh token can receive scope as parameters
12
+ def initialize(server, refresh_token, client)
13
+ @server = server
14
+ @refresh_token = refresh_token
15
+ @client = client
16
+ end
17
+
18
+ def authorize
19
+ validate
20
+ @response = if valid?
21
+ revoke_and_create_access_token
22
+ OAuth::TokenResponse.new access_token
23
+ else
24
+ OAuth::ErrorResponse.from_request(self)
25
+ end
26
+ end
27
+
28
+ def valid?
29
+ self.error.nil?
30
+ end
31
+
32
+ private
33
+
34
+ def revoke_and_create_access_token
35
+ refresh_token.revoke
36
+ create_access_token
37
+ end
38
+
39
+ def create_access_token
40
+ @access_token = Doorkeeper::AccessToken.create!({
41
+ :application_id => refresh_token.application_id,
42
+ :resource_owner_id => refresh_token.resource_owner_id,
43
+ :scopes => refresh_token.scopes_string,
44
+ :expires_in => server.access_token_expires_in,
45
+ :use_refresh_token => true
46
+ })
47
+ end
48
+
49
+ def validate_token
50
+ refresh_token.present? && !refresh_token.revoked?
51
+ end
52
+
53
+ def validate_client
54
+ client.present? && refresh_token.application_id == client.id
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,60 @@
1
+ module Doorkeeper
2
+ module OAuth
3
+ class Scopes
4
+ include Enumerable
5
+ include Comparable
6
+
7
+ def self.from_string(string)
8
+ string ||= ""
9
+ new.tap do |scope|
10
+ scope.add *string.split
11
+ end
12
+ end
13
+
14
+ def self.from_array(array)
15
+ new.tap do |scope|
16
+ scope.add *array
17
+ end
18
+ end
19
+
20
+ delegate :each, :to => :@scopes
21
+
22
+ def initialize
23
+ @scopes = []
24
+ end
25
+
26
+ def exists?(scope)
27
+ @scopes.include? scope.to_sym
28
+ end
29
+
30
+ def add(*scopes)
31
+ @scopes.push *scopes.map(&:to_sym)
32
+ @scopes.uniq!
33
+ end
34
+
35
+ def all
36
+ @scopes
37
+ end
38
+
39
+ def to_s
40
+ @scopes.join(" ")
41
+ end
42
+
43
+ def has_scopes?(scopes)
44
+ scopes.all? { |s| exists?(s) }
45
+ end
46
+
47
+ def +(other)
48
+ if other.is_a? Scopes
49
+ self.class.from_array(self.all + other.all)
50
+ else
51
+ super(other)
52
+ end
53
+ end
54
+
55
+ def <=>(other)
56
+ self.map(&:to_s).sort <=> other.map(&:to_s).sort
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,36 @@
1
+ module Doorkeeper
2
+ module OAuth
3
+ class Token
4
+ module Methods
5
+ def from_access_token_param(request)
6
+ request.parameters[:access_token]
7
+ end
8
+
9
+ def from_bearer_param(request)
10
+ request.parameters[:bearer_token]
11
+ end
12
+
13
+ def from_bearer_authorization(request)
14
+ pattern = /^Bearer /
15
+ header = request.authorization
16
+ header.gsub pattern, '' if header && header.match(pattern)
17
+ end
18
+ end
19
+
20
+ extend Methods
21
+
22
+ def self.from_request(request, *methods)
23
+ methods.inject(nil) do |credentials, method|
24
+ method = self.method(method) if method.is_a?(Symbol)
25
+ credentials = method.call(request)
26
+ break credentials unless credentials.blank?
27
+ end
28
+ end
29
+
30
+ def self.authenticate(request, *methods)
31
+ token = from_request request, *methods
32
+ Doorkeeper::AccessToken.authenticate(token) if token
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,28 @@
1
+ module Doorkeeper
2
+ module OAuth
3
+ class TokenRequest
4
+ attr_accessor :pre_auth, :resource_owner, :client
5
+
6
+ def initialize(pre_auth, resource_owner)
7
+ @pre_auth = pre_auth
8
+ @client = pre_auth.client
9
+ @resource_owner = resource_owner
10
+ end
11
+
12
+ def authorize
13
+ @response = if pre_auth.authorizable?
14
+ auth = Authorization::Token.new(pre_auth, resource_owner)
15
+ auth.issue_token
16
+ CodeResponse.new pre_auth, auth, :response_on_fragment => true
17
+ else
18
+ ErrorResponse.from_request pre_auth, :redirect_uri => pre_auth.redirect_uri, :response_on_fragment => true
19
+ end
20
+ end
21
+
22
+ def deny
23
+ pre_auth.error = :access_denied
24
+ ErrorResponse.from_request(pre_auth, :redirect_uri => pre_auth.redirect_uri, :response_on_fragment => true)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,29 @@
1
+ module Doorkeeper
2
+ module OAuth
3
+ class TokenResponse
4
+ attr_accessor :token
5
+
6
+ def initialize(token)
7
+ @token = token
8
+ end
9
+
10
+ def body
11
+ {
12
+ 'access_token' => token.token,
13
+ 'token_type' => token.token_type,
14
+ 'expires_in' => token.expires_in,
15
+ 'refresh_token' => token.refresh_token,
16
+ 'scope' => token.scopes_string
17
+ }
18
+ end
19
+
20
+ def status
21
+ :ok
22
+ end
23
+
24
+ def headers
25
+ { 'Cache-Control' => 'no-store', 'Pragma' => 'no-cache', 'Content-Type' => 'application/json; charset=utf-8' }
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,90 @@
1
+ require 'doorkeeper/rails/routes/mapping'
2
+ require 'doorkeeper/rails/routes/mapper'
3
+
4
+ module Doorkeeper
5
+ module Rails
6
+ class Routes
7
+ module Helper
8
+ # TODO: options hash is not being used
9
+ def use_doorkeeper(options = {}, &block)
10
+ Doorkeeper::Rails::Routes.new(self, &block).generate_routes!(options)
11
+ end
12
+ end
13
+
14
+ def self.install!
15
+ ActionDispatch::Routing::Mapper.send :include, Doorkeeper::Rails::Routes::Helper
16
+ end
17
+
18
+ def self.warn_if_using_mount_method!
19
+ paths = ::Rails.application.config.paths["config/routes"] ||
20
+ ::Rails.application.config.paths["config/routes.rb"]
21
+
22
+ paths.each do |path|
23
+ if File.read(::Rails.root.join(path)) =~ %r[mount Doorkeeper::Engine]
24
+ warn "\n[DOORKEEPER] `mount Doorkeeper::Engine` is not being used anymore. Please replace it with `use_doorkeeper` in your #{path} file\n"
25
+ end
26
+ end
27
+ end
28
+
29
+ attr_accessor :routes
30
+
31
+ def initialize(routes, &options)
32
+ @routes, @options = routes, options
33
+ end
34
+
35
+ def generate_routes!(options)
36
+ @mapping = Mapper.new.map(&@options)
37
+ routes.scope 'oauth', :as => 'oauth' do
38
+ map_route(:authorizations, :authorization_routes)
39
+ map_route(:tokens, :token_routes)
40
+ map_route(:applications, :application_routes)
41
+ map_route(:authorized_applications, :authorized_applications_routes)
42
+ map_route(:token_info, :token_info_routes)
43
+ end
44
+ end
45
+
46
+ private
47
+ def map_route(name, method)
48
+ unless @mapping.skipped?(name)
49
+ send method, @mapping[name]
50
+ end
51
+ end
52
+
53
+ def authorization_routes(mapping)
54
+ routes.resource(
55
+ :authorization, :path => 'authorize',
56
+ :only => [:create, :update, :destroy],
57
+ :as => mapping[:as],
58
+ :controller => mapping[:controllers]
59
+ ) do
60
+ routes.get '/:code', :action => :show, :on => :member
61
+ routes.get '/', :action => :new, :on => :member
62
+ end
63
+ end
64
+
65
+ def token_routes(mapping)
66
+ routes.resource(
67
+ :token, :path => 'token',
68
+ :only => [:create], :as => mapping[:as],
69
+ :controller => mapping[:controllers]
70
+ )
71
+ end
72
+
73
+ def token_info_routes(mapping)
74
+ routes.resource(
75
+ :token_info, :path => 'token/info',
76
+ :only => [:show], :as => mapping[:as],
77
+ :controller => mapping[:controllers]
78
+ )
79
+ end
80
+
81
+ def application_routes(mapping)
82
+ routes.resources :applications, :controller => mapping[:controllers]
83
+ end
84
+
85
+ def authorized_applications_routes(mapping)
86
+ routes.resources :authorized_applications, :only => [:index, :destroy], :controller => mapping[:controllers]
87
+ end
88
+ end
89
+ end
90
+ end