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,19 @@
1
+ module Doorkeeper
2
+ class Engine < Rails::Engine
3
+ initializer "doorkeeper.routes" do
4
+ Doorkeeper::Rails::Routes.warn_if_using_mount_method!
5
+ Doorkeeper::Rails::Routes.install!
6
+ end
7
+
8
+ initializer "couchbase.add_design_documents", :before => "couchbase.upgrade_design_documents" do
9
+ ::Couchbase::Model::Configuration.design_documents_paths = [File.join(File.dirname(__FILE__), "models"), "app/models"]
10
+ end
11
+
12
+ initializer "doorkeeper.helpers" do
13
+
14
+ ActiveSupport.on_load(:action_controller) do
15
+ include Doorkeeper::Helpers::Filter
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ module Doorkeeper
2
+ module Errors
3
+ class DoorkeeperError < StandardError
4
+ end
5
+
6
+ class InvalidAuthorizationStrategy < DoorkeeperError
7
+ end
8
+
9
+ class InvalidTokenStrategy < DoorkeeperError
10
+ end
11
+
12
+ class MissingRequestStrategy < DoorkeeperError
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,58 @@
1
+ module Doorkeeper
2
+ module Helpers
3
+ module Controller
4
+ def self.included(base)
5
+ base.send :private,
6
+ :authenticate_resource_owner!,
7
+ :authenticate_admin!,
8
+ :current_resource_owner,
9
+ :resource_owner_from_credentials,
10
+ :skip_authorization?
11
+ end
12
+
13
+ def authenticate_resource_owner!
14
+ current_resource_owner
15
+ end
16
+
17
+ def current_resource_owner
18
+ instance_eval &Doorkeeper.configuration.authenticate_resource_owner
19
+ end
20
+
21
+ def resource_owner_from_credentials
22
+ instance_eval &Doorkeeper.configuration.resource_owner_from_credentials
23
+ end
24
+
25
+ def authenticate_admin!
26
+ instance_eval &Doorkeeper.configuration.authenticate_admin
27
+ end
28
+
29
+ def server
30
+ @server ||= Server.new(self)
31
+ end
32
+
33
+ def get_error_response_from_exception(exception)
34
+ error_name = case exception
35
+ when Errors::InvalidTokenStrategy
36
+ :unsupported_grant_type
37
+ when Errors::InvalidAuthorizationStrategy
38
+ :unsupported_response_type
39
+ when Errors::MissingRequestStrategy
40
+ :invalid_request
41
+ end
42
+
43
+ OAuth::ErrorResponse.new :name => error_name, :state => params[:state]
44
+ end
45
+
46
+ def handle_token_exception(exception)
47
+ error = get_error_response_from_exception exception
48
+ self.headers.merge! error.headers
49
+ self.response_body = error.body.to_json
50
+ self.status = error.status
51
+ end
52
+
53
+ def skip_authorization?
54
+ !!instance_exec([@server.current_resource_owner, @pre_auth.client], &Doorkeeper.configuration.skip_authorization)
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,38 @@
1
+ module Doorkeeper
2
+ module Helpers
3
+ module Filter
4
+ module ClassMethods
5
+ def doorkeeper_for(*args)
6
+ doorkeeper_for = DoorkeeperForBuilder.create_doorkeeper_for(*args)
7
+
8
+ before_filter doorkeeper_for.filter_options do
9
+ return if doorkeeper_for.validate_token(doorkeeper_token)
10
+ # TODO: use ErrorRespose class for this
11
+ render_options = doorkeeper_unauthorized_render_options
12
+ if render_options.nil? || render_options.empty?
13
+ head :unauthorized
14
+ else
15
+ render_options[:status] = :unauthorized
16
+ render_options[:layout] = false if render_options[:layout].nil?
17
+ render render_options
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ def self.included(base)
24
+ base.extend ClassMethods
25
+ base.send :private, :doorkeeper_token, :doorkeeper_unauthorized_render_options
26
+ end
27
+
28
+ def doorkeeper_token
29
+ methods = Doorkeeper.configuration.access_token_methods
30
+ @token ||= OAuth::Token.authenticate request, *methods
31
+ end
32
+
33
+ def doorkeeper_unauthorized_render_options
34
+ nil
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,24 @@
1
+ module Doorkeeper
2
+ class AccessGrant
3
+ include Doorkeeper::OAuth::Helpers
4
+ include Doorkeeper::Models::Scopes
5
+
6
+ belongs_to :application, :class_name => "Doorkeeper::Application", :inverse_of => :access_grants
7
+
8
+ validates :resource_owner_id, :application_id, :token, :expires_in, :redirect_uri, :presence => true
9
+
10
+ before_create :generate_token
11
+
12
+ def self.authenticate(token)
13
+ where(:token => token).first
14
+ end
15
+
16
+ private
17
+
18
+ def generate_token
19
+ # This is wrong! Token should be the id of the AccessGrant class not independently added.... (same as AccessToken)
20
+ # There should be a way to make it raise an error using the ruby model
21
+ # self.add('token', UniqueToken.generate)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,95 @@
1
+ module Doorkeeper
2
+ class AccessToken < Couchbase::Model
3
+ include Doorkeeper::OAuth::Helpers
4
+ include Doorkeeper::Models::Scopes
5
+
6
+ attribute :resource_owner_id, :token, :expires_at
7
+ attribute :created_at, :default => lambda { Time.now.utc }
8
+ view :by_resource_owner_id, :by_token, :by_refresh_token, :by_application_id_and_resource_owner_id
9
+
10
+ belongs_to :application, :class_name => "Doorkeeper::Application", :inverse_of => :access_tokens
11
+ alias_attribute :token, :id
12
+ validates :application_id, :token, :presence => true
13
+
14
+ attr_accessor :use_refresh_token
15
+
16
+ before_create :generate_token
17
+ before_create :generate_refresh_token, :if => :use_refresh_token?
18
+
19
+
20
+
21
+ def expires_in
22
+ 30
23
+ end
24
+
25
+
26
+ def self.authenticate(token)
27
+ find(token)
28
+ end
29
+
30
+ def self.where_owner_id(id)
31
+ Application.find(*by_resource_owner_id({:key => id}))
32
+ end
33
+
34
+ def self.by_refresh_token(refresh_token)
35
+ by_refresh_token({:key => refresh_token})
36
+ end
37
+
38
+ def self.revoke_all_for(application_id, resource_owner)
39
+ AccessToken.find(*by_application_id_and_resource_owner_id({:key => [application_id, resource_owner]})).delete
40
+ end
41
+
42
+ def self.matching_token_for(application, resource_owner_or_id, scopes)
43
+ resource_owner_id = resource_owner_or_id.respond_to?(:to_key) ? resource_owner_or_id.id : resource_owner_or_id
44
+ token = last_authorized_token_for(application, resource_owner_id)
45
+ token if token
46
+ end
47
+
48
+ def token_type
49
+ "bearer"
50
+ end
51
+
52
+ def use_refresh_token?
53
+ self.use_refresh_token
54
+ end
55
+
56
+ def as_json(options={})
57
+ {
58
+ :resource_owner_id => self.resource_owner_id,
59
+ :scopes => self.scopes,
60
+ :expires_in_seconds => self.expires_at - Time.now,
61
+ :application => { :uid => self.application.id }
62
+ }
63
+ end
64
+
65
+ def self.last_authorized_token_for(application, resource_owner_id)
66
+ by_application_id_and_resource_owner_id({:key => [application.id, resource_owner_id]})
67
+ end
68
+ private_class_method :last_authorized_token_for
69
+
70
+
71
+
72
+
73
+ def self.delete_all_for(application_id, resource_owner)
74
+ where(:application_id => application_id,
75
+ :resource_owner_id => resource_owner.id).delete_all
76
+ end
77
+ private_class_method :delete_all_for
78
+
79
+
80
+
81
+ private
82
+
83
+ def generate_refresh_token
84
+ if use_refresh_token
85
+ self.refresh_token = UniqueToken.generate
86
+ end
87
+ end
88
+
89
+ def generate_token
90
+ self.id = UniqueToken.generate
91
+ end
92
+
93
+
94
+ end
95
+ end
@@ -0,0 +1,9 @@
1
+ module Doorkeeper
2
+ module Models
3
+ module Accessible
4
+ def accessible?
5
+ !expired? && !revoked?
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ module Doorkeeper
2
+ class AccessGrant < ActiveRecord::Base
3
+ self.table_name = :oauth_access_grants
4
+ end
5
+ end
@@ -0,0 +1,21 @@
1
+ module Doorkeeper
2
+ class AccessToken < ActiveRecord::Base
3
+ self.table_name = :oauth_access_tokens
4
+
5
+ def self.delete_all_for(application_id, resource_owner)
6
+ where(:application_id => application_id,
7
+ :resource_owner_id => resource_owner.id).delete_all
8
+ end
9
+ private_class_method :delete_all_for
10
+
11
+ def self.last_authorized_token_for(application, resource_owner_id)
12
+ where(:application_id => application.id,
13
+ :resource_owner_id => resource_owner_id,
14
+ :revoked_at => nil).
15
+ order('created_at desc').
16
+ limit(1).
17
+ first
18
+ end
19
+ private_class_method :last_authorized_token_for
20
+ end
21
+ end
@@ -0,0 +1,20 @@
1
+ module Doorkeeper
2
+ class Application < ActiveRecord::Base
3
+ self.table_name = :oauth_applications
4
+
5
+ has_many :authorized_tokens, :class_name => "AccessToken", :conditions => { :revoked_at => nil }
6
+ has_many :authorized_applications, :through => :authorized_tokens, :source => :application
7
+
8
+ def self.column_names_with_table
9
+ self.column_names.map { |c| "#{self.table_name}.#{c}" }
10
+ end
11
+
12
+ def self.authorized_for(resource_owner)
13
+ # SELECT "oauth_access_tokens".* FROM "oauth_access_tokens" WHERE "oauth_access_tokens"."application_id" = 5
14
+ # AND "oauth_access_tokens"."resource_owner_id" = 45 AND "oauth_access_tokens "."revoked_at" IS NULL ORDER BY created_at desc LIMIT 1
15
+ joins(:authorized_applications).
16
+ where(:oauth_access_tokens => { :resource_owner_id => resource_owner.id, :revoked_at => nil }).
17
+ group(column_names_with_table.join(','))
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,33 @@
1
+ module Doorkeeper
2
+ class Application
3
+ include Doorkeeper::OAuth::Helpers
4
+
5
+
6
+ validates :name, :secret, :redirect_uri, :presence => true
7
+ validates :redirect_uri, :redirect_uri => true
8
+
9
+ before_create :generate_uid, :generate_secret
10
+
11
+ def self.model_name
12
+ ActiveModel::Name.new(self, Doorkeeper, 'Application')
13
+ end
14
+
15
+ def self.authenticate(uid, secret)
16
+ self.where(:uid => uid, :secret => secret).first
17
+ end
18
+
19
+ def self.by_uid(uid)
20
+ find_by_id(uid)
21
+ end
22
+
23
+ private
24
+
25
+ def generate_uid
26
+ self.id = UniqueToken.generate
27
+ end
28
+
29
+ def generate_secret
30
+ self.secret = UniqueToken.generate
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,10 @@
1
+ module Doorkeeper
2
+ class AccessGrant < Couchbase::Model
3
+
4
+ attribute :resource_owner_id, :application_id, :token, :expires_in, :redirect_uri, :revoked_at
5
+
6
+ def self.authenticate(token)
7
+ by_token({:key => token})
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ module Doorkeeper
2
+ class AccessToken < Couchbase::Model
3
+
4
+
5
+
6
+ end
7
+ end
@@ -0,0 +1,35 @@
1
+ module Doorkeeper
2
+ class Application < Couchbase::Model
3
+ include Doorkeeper::OAuth::Helpers
4
+ attribute :name, :secret, :redirect_uri
5
+ attribute :created_at, :default => lambda { Time.now.utc }
6
+ alias_attribute :uid, :id
7
+
8
+ view :by_uid_and_secret, :by_uid, :show_all
9
+ def self.authorized_for(resource_owner)
10
+ AccessToken.where_owner_id(resource_owner.id)
11
+ end
12
+
13
+ def self.authenticate(uid, secret)
14
+ by_uid_and_secret({:key => [uid, secret]})
15
+ end
16
+
17
+ def self.by_uid(uid)
18
+ by_uid({:key => uid})
19
+ end
20
+
21
+ def self.find_all
22
+ show_all({:key => nil, :include_docs => true, :stale => false})
23
+ end
24
+
25
+ private
26
+
27
+ def generate_uid
28
+ self.id = UniqueToken.generate
29
+ end
30
+
31
+ def generate_secret
32
+ self.secret = UniqueToken.generate
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,5 @@
1
+ function(doc) {
2
+ if(doc.type == "doorkeeper_access_token") {
3
+ emit([doc.token]);
4
+ }
5
+ }
@@ -0,0 +1,5 @@
1
+ function(doc) {
2
+ if(doc.type == "doorkeeper_access_token" && doc.application_id && doc.revoked != true) {
3
+ emit(doc.resource_owner_id, doc.application_id);
4
+ }
5
+ }
@@ -0,0 +1,5 @@
1
+ function(doc) {
2
+ if(doc.type == "doorkeeper_access_token" && doc.application_id && doc.resource_owner_id && doc.revoked != true) {
3
+ emit([doc.application_id, doc.resource_owner_id, doc.created_at]);
4
+ }
5
+ }
@@ -0,0 +1,5 @@
1
+ function(doc) {
2
+ if(doc.type == "doorkeeper_access_token") {
3
+ emit([doc.refresh_token]);
4
+ }
5
+ }
@@ -0,0 +1,5 @@
1
+ function(doc) {
2
+ if(doc.resource_owner_id) {
3
+ emit([doc.resource_owner_id], null);
4
+ }
5
+ }
@@ -0,0 +1,5 @@
1
+ function(doc) {
2
+ if(doc.type == "access_token") {
3
+ emit([doc.token]);
4
+ }
5
+ }