sorcery 0.8.0 → 0.9.0

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 (353) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +56 -0
  3. data/.travis.yml +130 -1
  4. data/CHANGELOG.md +270 -0
  5. data/Gemfile +18 -23
  6. data/README.md +371 -0
  7. data/Rakefile +3 -78
  8. data/gemfiles/active_record-rails40.gemfile +7 -0
  9. data/gemfiles/active_record-rails41.gemfile +7 -0
  10. data/gemfiles/mongo_mapper-rails40.gemfile +9 -0
  11. data/gemfiles/mongo_mapper-rails41.gemfile +9 -0
  12. data/gemfiles/mongoid-rails40.gemfile +9 -0
  13. data/gemfiles/mongoid-rails41.gemfile +9 -0
  14. data/gemfiles/mongoid3-rails32.gemfile +9 -0
  15. data/lib/generators/sorcery/USAGE +1 -1
  16. data/lib/generators/sorcery/helpers.rb +40 -0
  17. data/lib/generators/sorcery/install_generator.rb +39 -21
  18. data/lib/generators/sorcery/templates/initializer.rb +56 -11
  19. data/lib/generators/sorcery/templates/migration/activity_logging.rb +3 -10
  20. data/lib/generators/sorcery/templates/migration/brute_force_protection.rb +3 -7
  21. data/lib/generators/sorcery/templates/migration/core.rb +5 -8
  22. data/lib/generators/sorcery/templates/migration/external.rb +3 -5
  23. data/lib/generators/sorcery/templates/migration/remember_me.rb +2 -9
  24. data/lib/generators/sorcery/templates/migration/reset_password.rb +2 -10
  25. data/lib/generators/sorcery/templates/migration/user_activation.rb +2 -10
  26. data/lib/sorcery/adapters/active_record_adapter.rb +120 -0
  27. data/lib/sorcery/adapters/base_adapter.rb +30 -0
  28. data/lib/sorcery/adapters/data_mapper_adapter.rb +176 -0
  29. data/lib/sorcery/adapters/mongo_mapper_adapter.rb +110 -0
  30. data/lib/sorcery/adapters/mongoid_adapter.rb +97 -0
  31. data/lib/sorcery/controller/config.rb +65 -0
  32. data/lib/sorcery/controller/submodules/activity_logging.rb +27 -21
  33. data/lib/sorcery/controller/submodules/brute_force_protection.rb +6 -6
  34. data/lib/sorcery/controller/submodules/external.rb +107 -75
  35. data/lib/sorcery/controller/submodules/remember_me.rb +5 -5
  36. data/lib/sorcery/controller/submodules/session_timeout.rb +11 -7
  37. data/lib/sorcery/controller.rb +29 -78
  38. data/lib/sorcery/model/config.rb +96 -0
  39. data/lib/sorcery/model/submodules/activity_logging.rb +32 -12
  40. data/lib/sorcery/model/submodules/brute_force_protection.rb +36 -36
  41. data/lib/sorcery/model/submodules/external.rb +53 -9
  42. data/lib/sorcery/model/submodules/remember_me.rb +15 -19
  43. data/lib/sorcery/model/submodules/reset_password.rb +36 -33
  44. data/lib/sorcery/model/submodules/user_activation.rb +51 -48
  45. data/lib/sorcery/model/temporary_token.rb +4 -4
  46. data/lib/sorcery/model.rb +81 -175
  47. data/lib/sorcery/protocols/oauth.rb +42 -0
  48. data/lib/sorcery/protocols/oauth2.rb +47 -0
  49. data/lib/sorcery/providers/base.rb +38 -0
  50. data/lib/sorcery/providers/facebook.rb +63 -0
  51. data/lib/sorcery/providers/github.rb +51 -0
  52. data/lib/sorcery/providers/google.rb +51 -0
  53. data/lib/sorcery/providers/heroku.rb +57 -0
  54. data/lib/sorcery/providers/jira.rb +77 -0
  55. data/lib/sorcery/providers/linkedin.rb +66 -0
  56. data/lib/sorcery/providers/liveid.rb +53 -0
  57. data/lib/sorcery/providers/salesforce.rb +50 -0
  58. data/lib/sorcery/providers/twitter.rb +59 -0
  59. data/lib/sorcery/providers/vk.rb +63 -0
  60. data/lib/sorcery/providers/xing.rb +64 -0
  61. data/lib/sorcery/railties/tasks.rake +1 -7
  62. data/lib/sorcery/test_helpers/internal/rails.rb +17 -6
  63. data/lib/sorcery/test_helpers/internal.rb +27 -6
  64. data/lib/sorcery/test_helpers/rails/controller.rb +21 -0
  65. data/lib/sorcery/test_helpers/rails/integration.rb +26 -0
  66. data/lib/sorcery/version.rb +3 -0
  67. data/lib/sorcery.rb +83 -57
  68. data/sorcery.gemspec +24 -363
  69. data/spec/active_record/user_activation_spec.rb +18 -0
  70. data/spec/active_record/user_activity_logging_spec.rb +17 -0
  71. data/spec/{rails3/spec → active_record}/user_brute_force_protection_spec.rb +6 -5
  72. data/spec/{rails3/spec → active_record}/user_oauth_spec.rb +6 -5
  73. data/spec/{rails3/spec → active_record}/user_remember_me_spec.rb +5 -4
  74. data/spec/{rails3/spec → active_record}/user_reset_password_spec.rb +7 -7
  75. data/spec/active_record/user_spec.rb +37 -0
  76. data/spec/controllers/controller_activity_logging_spec.rb +124 -0
  77. data/spec/controllers/controller_brute_force_protection_spec.rb +43 -0
  78. data/spec/controllers/controller_http_basic_auth_spec.rb +68 -0
  79. data/spec/controllers/controller_oauth2_spec.rb +414 -0
  80. data/spec/controllers/controller_oauth_spec.rb +240 -0
  81. data/spec/controllers/controller_remember_me_spec.rb +117 -0
  82. data/spec/controllers/controller_session_timeout_spec.rb +80 -0
  83. data/spec/controllers/controller_spec.rb +218 -0
  84. data/spec/data_mapper/user_activation_spec.rb +10 -0
  85. data/spec/data_mapper/user_activity_logging_spec.rb +14 -0
  86. data/spec/data_mapper/user_brute_force_protection_spec.rb +9 -0
  87. data/spec/data_mapper/user_oauth_spec.rb +9 -0
  88. data/spec/data_mapper/user_remember_me_spec.rb +8 -0
  89. data/spec/data_mapper/user_reset_password_spec.rb +8 -0
  90. data/spec/data_mapper/user_spec.rb +27 -0
  91. data/spec/mongo_mapper/user_activation_spec.rb +9 -0
  92. data/spec/mongo_mapper/user_activity_logging_spec.rb +8 -0
  93. data/spec/mongo_mapper/user_brute_force_protection_spec.rb +8 -0
  94. data/spec/mongo_mapper/user_oauth_spec.rb +8 -0
  95. data/spec/mongo_mapper/user_remember_me_spec.rb +8 -0
  96. data/spec/mongo_mapper/user_reset_password_spec.rb +8 -0
  97. data/spec/mongo_mapper/user_spec.rb +37 -0
  98. data/spec/mongoid/user_activation_spec.rb +9 -0
  99. data/spec/mongoid/user_activity_logging_spec.rb +8 -0
  100. data/spec/mongoid/user_brute_force_protection_spec.rb +8 -0
  101. data/spec/mongoid/user_oauth_spec.rb +8 -0
  102. data/spec/mongoid/user_remember_me_spec.rb +8 -0
  103. data/spec/mongoid/user_reset_password_spec.rb +8 -0
  104. data/spec/mongoid/user_spec.rb +51 -0
  105. data/spec/orm/active_record.rb +21 -0
  106. data/spec/orm/data_mapper.rb +48 -0
  107. data/spec/orm/mongo_mapper.rb +10 -0
  108. data/spec/orm/mongoid.rb +22 -0
  109. data/spec/{rails3/app/models → rails_app/app/active_record}/user.rb +1 -2
  110. data/spec/rails_app/app/active_record/user_provider.rb +3 -0
  111. data/spec/rails_app/app/controllers/sorcery_controller.rb +285 -0
  112. data/spec/rails_app/app/data_mapper/authentication.rb +8 -0
  113. data/spec/rails_app/app/data_mapper/user.rb +7 -0
  114. data/spec/{rails3_mongo_mapper/app/models → rails_app/app/mongo_mapper}/user.rb +2 -0
  115. data/spec/{rails3_mongoid/app/models → rails_app/app/mongoid}/user.rb +2 -0
  116. data/spec/rails_app/app/views/sorcery_mailer/send_unlock_token_email.text.erb +1 -0
  117. data/spec/{rails3_mongo_mapper → rails_app}/config/application.rb +13 -8
  118. data/spec/rails_app/config/boot.rb +4 -0
  119. data/spec/rails_app/config/database.yml +22 -0
  120. data/spec/{rails3_mongo_mapper → rails_app}/config/environments/test.rb +2 -0
  121. data/spec/{rails3_mongoid → rails_app}/config/initializers/session_store.rb +4 -0
  122. data/spec/rails_app/config/routes.rb +51 -0
  123. data/spec/{rails3_mongo_mapper → rails_app}/config.ru +1 -1
  124. data/spec/{rails3 → rails_app}/db/migrate/activation/20101224223622_add_activation_to_users.rb +3 -3
  125. data/spec/{rails3 → rails_app}/db/migrate/activity_logging/20101224223624_add_activity_logging_to_users.rb +2 -0
  126. data/spec/{rails3 → rails_app}/db/migrate/core/20101224223620_create_users.rb +2 -2
  127. data/spec/rails_app/db/migrate/external/20101224223628_create_authentications_and_user_providers.rb +22 -0
  128. data/spec/rails_app/log/development.log +1791 -0
  129. data/spec/shared_examples/user_activation_shared_examples.rb +137 -98
  130. data/spec/shared_examples/user_activity_logging_shared_examples.rb +86 -13
  131. data/spec/shared_examples/user_brute_force_protection_shared_examples.rb +140 -21
  132. data/spec/shared_examples/user_oauth_shared_examples.rb +21 -16
  133. data/spec/shared_examples/user_remember_me_shared_examples.rb +36 -24
  134. data/spec/shared_examples/user_reset_password_shared_examples.rb +163 -130
  135. data/spec/shared_examples/user_shared_examples.rb +355 -193
  136. data/spec/sorcery_crypto_providers_spec.rb +74 -72
  137. data/spec/spec_helper.rb +32 -4
  138. metadata +258 -425
  139. data/Gemfile.lock +0 -192
  140. data/README.rdoc +0 -261
  141. data/VERSION +0 -1
  142. data/lib/sorcery/controller/submodules/external/protocols/oauth1.rb +0 -35
  143. data/lib/sorcery/controller/submodules/external/protocols/oauth2.rb +0 -45
  144. data/lib/sorcery/controller/submodules/external/providers/facebook.rb +0 -97
  145. data/lib/sorcery/controller/submodules/external/providers/github.rb +0 -91
  146. data/lib/sorcery/controller/submodules/external/providers/google.rb +0 -90
  147. data/lib/sorcery/controller/submodules/external/providers/linkedin.rb +0 -101
  148. data/lib/sorcery/controller/submodules/external/providers/liveid.rb +0 -91
  149. data/lib/sorcery/controller/submodules/external/providers/twitter.rb +0 -92
  150. data/lib/sorcery/controller/submodules/external/providers/vkontakte.rb +0 -94
  151. data/lib/sorcery/model/adapters/active_record.rb +0 -49
  152. data/lib/sorcery/model/adapters/mongo_mapper.rb +0 -56
  153. data/lib/sorcery/model/adapters/mongoid.rb +0 -88
  154. data/lib/sorcery/test_helpers/rails.rb +0 -16
  155. data/lib/sorcery/test_helpers.rb +0 -5
  156. data/spec/Gemfile +0 -12
  157. data/spec/Gemfile.lock +0 -129
  158. data/spec/README.md +0 -31
  159. data/spec/Rakefile +0 -12
  160. data/spec/rails3/.gitignore +0 -4
  161. data/spec/rails3/.rspec +0 -1
  162. data/spec/rails3/Gemfile +0 -15
  163. data/spec/rails3/Gemfile.lock +0 -162
  164. data/spec/rails3/README +0 -256
  165. data/spec/rails3/Rakefile +0 -11
  166. data/spec/rails3/app/controllers/application_controller.rb +0 -208
  167. data/spec/rails3/app/views/sorcery_mailer/send_unlock_token_email.text.erb +0 -1
  168. data/spec/rails3/config/application.rb +0 -46
  169. data/spec/rails3/config/boot.rb +0 -13
  170. data/spec/rails3/config/database.yml +0 -27
  171. data/spec/rails3/config/environments/development.rb +0 -26
  172. data/spec/rails3/config/environments/in_memory.rb +0 -35
  173. data/spec/rails3/config/environments/production.rb +0 -49
  174. data/spec/rails3/config/environments/test.rb +0 -35
  175. data/spec/rails3/config/initializers/session_store.rb +0 -8
  176. data/spec/rails3/config/routes.rb +0 -59
  177. data/spec/rails3/config.ru +0 -4
  178. data/spec/rails3/db/migrate/external/20101224223628_create_authentications.rb +0 -14
  179. data/spec/rails3/lib/tasks/.gitkeep +0 -0
  180. data/spec/rails3/public/404.html +0 -26
  181. data/spec/rails3/public/422.html +0 -26
  182. data/spec/rails3/public/500.html +0 -26
  183. data/spec/rails3/public/favicon.ico +0 -0
  184. data/spec/rails3/public/images/rails.png +0 -0
  185. data/spec/rails3/public/javascripts/application.js +0 -2
  186. data/spec/rails3/public/javascripts/controls.js +0 -965
  187. data/spec/rails3/public/javascripts/dragdrop.js +0 -974
  188. data/spec/rails3/public/javascripts/effects.js +0 -1123
  189. data/spec/rails3/public/javascripts/prototype.js +0 -6001
  190. data/spec/rails3/public/javascripts/rails.js +0 -175
  191. data/spec/rails3/public/robots.txt +0 -5
  192. data/spec/rails3/public/stylesheets/.gitkeep +0 -0
  193. data/spec/rails3/script/rails +0 -6
  194. data/spec/rails3/spec/controller_activity_logging_spec.rb +0 -115
  195. data/spec/rails3/spec/controller_brute_force_protection_spec.rb +0 -88
  196. data/spec/rails3/spec/controller_http_basic_auth_spec.rb +0 -50
  197. data/spec/rails3/spec/controller_oauth2_spec.rb +0 -380
  198. data/spec/rails3/spec/controller_oauth_spec.rb +0 -206
  199. data/spec/rails3/spec/controller_remember_me_spec.rb +0 -96
  200. data/spec/rails3/spec/controller_session_timeout_spec.rb +0 -55
  201. data/spec/rails3/spec/controller_spec.rb +0 -177
  202. data/spec/rails3/spec/integration_spec.rb +0 -23
  203. data/spec/rails3/spec/spec.opts +0 -2
  204. data/spec/rails3/spec/spec_helper.orig.rb +0 -27
  205. data/spec/rails3/spec/spec_helper.rb +0 -71
  206. data/spec/rails3/spec/user_activation_spec.rb +0 -16
  207. data/spec/rails3/spec/user_activity_logging_spec.rb +0 -8
  208. data/spec/rails3/spec/user_spec.rb +0 -36
  209. data/spec/rails3/vendor/plugins/.gitkeep +0 -0
  210. data/spec/rails3_mongo_mapper/.gitignore +0 -4
  211. data/spec/rails3_mongo_mapper/.rspec +0 -1
  212. data/spec/rails3_mongo_mapper/Gemfile +0 -16
  213. data/spec/rails3_mongo_mapper/Gemfile.lock +0 -156
  214. data/spec/rails3_mongo_mapper/Rakefile +0 -11
  215. data/spec/rails3_mongo_mapper/app/controllers/application_controller.rb +0 -122
  216. data/spec/rails3_mongo_mapper/app/helpers/application_helper.rb +0 -2
  217. data/spec/rails3_mongo_mapper/app/mailers/sorcery_mailer.rb +0 -25
  218. data/spec/rails3_mongo_mapper/app/views/layouts/application.html.erb +0 -14
  219. data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/activation_email.html.erb +0 -17
  220. data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/activation_email.text.erb +0 -9
  221. data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/activation_success_email.text.erb +0 -9
  222. data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/reset_password_email.html.erb +0 -16
  223. data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/reset_password_email.text.erb +0 -8
  224. data/spec/rails3_mongo_mapper/config/boot.rb +0 -13
  225. data/spec/rails3_mongo_mapper/config/environment.rb +0 -5
  226. data/spec/rails3_mongo_mapper/config/environments/development.rb +0 -30
  227. data/spec/rails3_mongo_mapper/config/environments/in_memory.rb +0 -0
  228. data/spec/rails3_mongo_mapper/config/environments/production.rb +0 -49
  229. data/spec/rails3_mongo_mapper/config/initializers/backtrace_silencers.rb +0 -7
  230. data/spec/rails3_mongo_mapper/config/initializers/inflections.rb +0 -10
  231. data/spec/rails3_mongo_mapper/config/initializers/mime_types.rb +0 -5
  232. data/spec/rails3_mongo_mapper/config/initializers/mongo.rb +0 -2
  233. data/spec/rails3_mongo_mapper/config/initializers/secret_token.rb +0 -7
  234. data/spec/rails3_mongo_mapper/config/initializers/session_store.rb +0 -8
  235. data/spec/rails3_mongo_mapper/config/locales/en.yml +0 -5
  236. data/spec/rails3_mongo_mapper/config/routes.rb +0 -59
  237. data/spec/rails3_mongo_mapper/db/schema.rb +0 -23
  238. data/spec/rails3_mongo_mapper/db/seeds.rb +0 -7
  239. data/spec/rails3_mongo_mapper/lib/tasks/.gitkeep +0 -0
  240. data/spec/rails3_mongo_mapper/public/404.html +0 -26
  241. data/spec/rails3_mongo_mapper/public/422.html +0 -26
  242. data/spec/rails3_mongo_mapper/public/500.html +0 -26
  243. data/spec/rails3_mongo_mapper/public/favicon.ico +0 -0
  244. data/spec/rails3_mongo_mapper/public/images/rails.png +0 -0
  245. data/spec/rails3_mongo_mapper/public/javascripts/application.js +0 -2
  246. data/spec/rails3_mongo_mapper/public/javascripts/controls.js +0 -965
  247. data/spec/rails3_mongo_mapper/public/javascripts/dragdrop.js +0 -974
  248. data/spec/rails3_mongo_mapper/public/javascripts/effects.js +0 -1123
  249. data/spec/rails3_mongo_mapper/public/javascripts/prototype.js +0 -6001
  250. data/spec/rails3_mongo_mapper/public/javascripts/rails.js +0 -175
  251. data/spec/rails3_mongo_mapper/public/robots.txt +0 -5
  252. data/spec/rails3_mongo_mapper/public/stylesheets/.gitkeep +0 -0
  253. data/spec/rails3_mongo_mapper/script/rails +0 -6
  254. data/spec/rails3_mongo_mapper/spec/controller_spec.rb +0 -170
  255. data/spec/rails3_mongo_mapper/spec/spec.opts +0 -2
  256. data/spec/rails3_mongo_mapper/spec/spec_helper.orig.rb +0 -27
  257. data/spec/rails3_mongo_mapper/spec/spec_helper.rb +0 -55
  258. data/spec/rails3_mongo_mapper/spec/user_activation_spec.rb +0 -9
  259. data/spec/rails3_mongo_mapper/spec/user_activity_logging_spec.rb +0 -8
  260. data/spec/rails3_mongo_mapper/spec/user_brute_force_protection_spec.rb +0 -8
  261. data/spec/rails3_mongo_mapper/spec/user_oauth_spec.rb +0 -8
  262. data/spec/rails3_mongo_mapper/spec/user_remember_me_spec.rb +0 -8
  263. data/spec/rails3_mongo_mapper/spec/user_reset_password_spec.rb +0 -8
  264. data/spec/rails3_mongo_mapper/spec/user_spec.rb +0 -37
  265. data/spec/rails3_mongo_mapper/vendor/plugins/.gitkeep +0 -0
  266. data/spec/rails3_mongoid/.gitignore +0 -4
  267. data/spec/rails3_mongoid/.rspec +0 -1
  268. data/spec/rails3_mongoid/Gemfile +0 -15
  269. data/spec/rails3_mongoid/Gemfile.lock +0 -146
  270. data/spec/rails3_mongoid/Rakefile +0 -11
  271. data/spec/rails3_mongoid/app/controllers/application_controller.rb +0 -127
  272. data/spec/rails3_mongoid/app/helpers/application_helper.rb +0 -2
  273. data/spec/rails3_mongoid/app/mailers/sorcery_mailer.rb +0 -25
  274. data/spec/rails3_mongoid/app/views/layouts/application.html.erb +0 -14
  275. data/spec/rails3_mongoid/app/views/sorcery_mailer/activation_email.html.erb +0 -17
  276. data/spec/rails3_mongoid/app/views/sorcery_mailer/activation_email.text.erb +0 -9
  277. data/spec/rails3_mongoid/app/views/sorcery_mailer/activation_success_email.html.erb +0 -17
  278. data/spec/rails3_mongoid/app/views/sorcery_mailer/activation_success_email.text.erb +0 -9
  279. data/spec/rails3_mongoid/app/views/sorcery_mailer/reset_password_email.html.erb +0 -16
  280. data/spec/rails3_mongoid/app/views/sorcery_mailer/reset_password_email.text.erb +0 -8
  281. data/spec/rails3_mongoid/config/application.rb +0 -51
  282. data/spec/rails3_mongoid/config/boot.rb +0 -13
  283. data/spec/rails3_mongoid/config/environment.rb +0 -5
  284. data/spec/rails3_mongoid/config/environments/development.rb +0 -26
  285. data/spec/rails3_mongoid/config/environments/in_memory.rb +0 -0
  286. data/spec/rails3_mongoid/config/environments/production.rb +0 -49
  287. data/spec/rails3_mongoid/config/environments/test.rb +0 -35
  288. data/spec/rails3_mongoid/config/initializers/backtrace_silencers.rb +0 -7
  289. data/spec/rails3_mongoid/config/initializers/inflections.rb +0 -10
  290. data/spec/rails3_mongoid/config/initializers/mime_types.rb +0 -5
  291. data/spec/rails3_mongoid/config/initializers/secret_token.rb +0 -7
  292. data/spec/rails3_mongoid/config/locales/en.yml +0 -5
  293. data/spec/rails3_mongoid/config/mongoid.yml +0 -7
  294. data/spec/rails3_mongoid/config/routes.rb +0 -59
  295. data/spec/rails3_mongoid/config.ru +0 -4
  296. data/spec/rails3_mongoid/db/schema.rb +0 -23
  297. data/spec/rails3_mongoid/db/seeds.rb +0 -7
  298. data/spec/rails3_mongoid/lib/tasks/.gitkeep +0 -0
  299. data/spec/rails3_mongoid/public/404.html +0 -26
  300. data/spec/rails3_mongoid/public/422.html +0 -26
  301. data/spec/rails3_mongoid/public/500.html +0 -26
  302. data/spec/rails3_mongoid/public/favicon.ico +0 -0
  303. data/spec/rails3_mongoid/public/images/rails.png +0 -0
  304. data/spec/rails3_mongoid/public/javascripts/application.js +0 -2
  305. data/spec/rails3_mongoid/public/javascripts/controls.js +0 -965
  306. data/spec/rails3_mongoid/public/javascripts/dragdrop.js +0 -974
  307. data/spec/rails3_mongoid/public/javascripts/effects.js +0 -1123
  308. data/spec/rails3_mongoid/public/javascripts/prototype.js +0 -6001
  309. data/spec/rails3_mongoid/public/javascripts/rails.js +0 -175
  310. data/spec/rails3_mongoid/public/robots.txt +0 -5
  311. data/spec/rails3_mongoid/public/stylesheets/.gitkeep +0 -0
  312. data/spec/rails3_mongoid/script/rails +0 -6
  313. data/spec/rails3_mongoid/spec/controller_activity_logging_spec.rb +0 -105
  314. data/spec/rails3_mongoid/spec/controller_spec.rb +0 -181
  315. data/spec/rails3_mongoid/spec/spec.opts +0 -2
  316. data/spec/rails3_mongoid/spec/spec_helper.orig.rb +0 -27
  317. data/spec/rails3_mongoid/spec/spec_helper.rb +0 -55
  318. data/spec/rails3_mongoid/spec/user_activation_spec.rb +0 -9
  319. data/spec/rails3_mongoid/spec/user_activity_logging_spec.rb +0 -8
  320. data/spec/rails3_mongoid/spec/user_brute_force_protection_spec.rb +0 -8
  321. data/spec/rails3_mongoid/spec/user_oauth_spec.rb +0 -8
  322. data/spec/rails3_mongoid/spec/user_remember_me_spec.rb +0 -8
  323. data/spec/rails3_mongoid/spec/user_reset_password_spec.rb +0 -8
  324. data/spec/rails3_mongoid/spec/user_spec.rb +0 -38
  325. data/spec/rails3_mongoid/vendor/plugins/.gitkeep +0 -0
  326. data/spec/shared_examples/controller_oauth2_shared_examples.rb +0 -56
  327. data/spec/shared_examples/controller_oauth_shared_examples.rb +0 -55
  328. /data/lib/sorcery/{controller/submodules/external/protocols → protocols}/certs/ca-bundle.crt +0 -0
  329. /data/spec/{rails3/app/models → rails_app/app/active_record}/authentication.rb +0 -0
  330. /data/spec/{rails3 → rails_app}/app/helpers/application_helper.rb +0 -0
  331. /data/spec/{rails3 → rails_app}/app/mailers/sorcery_mailer.rb +0 -0
  332. /data/spec/{rails3_mongo_mapper/app/models → rails_app/app/mongo_mapper}/authentication.rb +0 -0
  333. /data/spec/{rails3_mongoid/app/models → rails_app/app/mongoid}/authentication.rb +0 -0
  334. /data/spec/{rails3 → rails_app}/app/views/application/index.html.erb +0 -0
  335. /data/spec/{rails3 → rails_app}/app/views/layouts/application.html.erb +0 -0
  336. /data/spec/{rails3 → rails_app}/app/views/sorcery_mailer/activation_email.html.erb +0 -0
  337. /data/spec/{rails3 → rails_app}/app/views/sorcery_mailer/activation_email.text.erb +0 -0
  338. /data/spec/{rails3/app/views/sorcery_mailer/activation_success_email.html.erb → rails_app/app/views/sorcery_mailer/activation_needed_email.html.erb} +0 -0
  339. /data/spec/{rails3_mongo_mapper → rails_app}/app/views/sorcery_mailer/activation_success_email.html.erb +0 -0
  340. /data/spec/{rails3 → rails_app}/app/views/sorcery_mailer/activation_success_email.text.erb +0 -0
  341. /data/spec/{rails3 → rails_app}/app/views/sorcery_mailer/reset_password_email.html.erb +0 -0
  342. /data/spec/{rails3 → rails_app}/app/views/sorcery_mailer/reset_password_email.text.erb +0 -0
  343. /data/spec/{rails3 → rails_app}/config/environment.rb +0 -0
  344. /data/spec/{rails3 → rails_app}/config/initializers/backtrace_silencers.rb +0 -0
  345. /data/spec/{rails3 → rails_app}/config/initializers/inflections.rb +0 -0
  346. /data/spec/{rails3 → rails_app}/config/initializers/mime_types.rb +0 -0
  347. /data/spec/{rails3 → rails_app}/config/initializers/secret_token.rb +0 -0
  348. /data/spec/{rails3 → rails_app}/config/locales/en.yml +0 -0
  349. /data/spec/{rails3 → rails_app}/db/migrate/brute_force_protection/20101224223626_add_brute_force_protection_to_users.rb +0 -0
  350. /data/spec/{rails3 → rails_app}/db/migrate/remember_me/20101224223623_add_remember_me_token_to_users.rb +0 -0
  351. /data/spec/{rails3 → rails_app}/db/migrate/reset_password/20101224223622_add_reset_password_to_users.rb +0 -0
  352. /data/spec/{rails3 → rails_app}/db/schema.rb +0 -0
  353. /data/spec/{rails3 → rails_app}/db/seeds.rb +0 -0
@@ -0,0 +1,176 @@
1
+ module Sorcery
2
+ module Adapters
3
+ class DataMapperAdapter < BaseAdapter
4
+ module Wrapper
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ sorcery_adapter.verify_submodules_compatibility!
9
+ end
10
+
11
+ def sorcery_adapter
12
+ @sorcery_adapter ||= Sorcery::Adapters::DataMapperAdapter.new(self)
13
+ end
14
+
15
+ module ClassMethods
16
+ def sorcery_adapter
17
+ Sorcery::Adapters::DataMapperAdapter.from(self)
18
+ end
19
+ end
20
+ end
21
+
22
+ def increment(attr)
23
+ @model[attr] ||= 0
24
+ @model[attr] += 1
25
+ @model
26
+ end
27
+
28
+ def update_attributes(attrs)
29
+ attrs.each do |name, value|
30
+ value = value.utc if value.is_a?(ActiveSupport::TimeWithZone)
31
+ @model.send(:"#{name}=", value)
32
+ end
33
+ @model.class.get(@model.id).update(attrs)
34
+ end
35
+
36
+ def update_attribute(name, value)
37
+ update_attributes(name => value)
38
+ end
39
+
40
+ def save(options = {})
41
+ if options.key?(:validate) && !options[:validate]
42
+ @model.save!
43
+ else
44
+ @model.save
45
+ end
46
+ end
47
+
48
+ class << self
49
+ def define_field(name, type, options={})
50
+ @klass.property name, type, options.slice(:length, :default)
51
+
52
+ # Workaround local timezone retrieval problem NOTE dm-core issue #193
53
+ if type == Time
54
+ @klass.send(:alias_method, "orig_#{name}", name)
55
+ @klass.send :define_method, name do
56
+ t = send("orig_#{name}")
57
+ t && Time.new(t.year, t.month, t.day, t.hour, t.min, t.sec, 0)
58
+ end
59
+ end
60
+ end
61
+
62
+ def define_callback(time, event, method_name, options={})
63
+ event = :valid? if event == :validation
64
+ condition = options[:if]
65
+
66
+ user_klass = @klass
67
+
68
+ block = Proc.new do |record|
69
+ if condition.nil?
70
+ send(method_name)
71
+ elsif condition.respond_to?(:call)
72
+ send(method_name) if condition.call(self)
73
+ elsif condition.is_a? Symbol
74
+ send(method_name) if send(condition)
75
+ end
76
+ end
77
+
78
+ @klass.send(time, event, &block)
79
+ end
80
+
81
+ def find(id)
82
+ @klass.get(id)
83
+ end
84
+
85
+ def delete_all
86
+ @klass.destroy
87
+ end
88
+
89
+ # NOTE
90
+ # DM Adapter dependent
91
+ # DM creates MySQL tables case insensitive by default
92
+ # http://datamapper.lighthouseapp.com/projects/20609-datamapper/tickets/1105
93
+ def find_by_credentials(credentials)
94
+ credential = credentials[0].dup
95
+ credential.downcase! if @klass.sorcery_config.downcase_username_before_authenticating
96
+ @klass.sorcery_config.username_attribute_names.each do |name|
97
+ @user = @klass.first(name => credential)
98
+ break if @user
99
+ end
100
+ !!@user ? @klass.get(@user.id) : nil
101
+ end
102
+
103
+ def find_by_oauth_credentials(provider, uid)
104
+ @user_config = ::Sorcery::Controller::Config.user_class.to_s.constantize.sorcery_config
105
+ user = @klass.first(@user_config.provider_attribute_name => provider, @user_config.provider_uid_attribute_name => uid)
106
+ !!user ? @klass.get(user.id) : nil
107
+ end
108
+
109
+ def find_by_token(token_attr_name, token)
110
+ @klass.first(token_attr_name => token)
111
+ end
112
+
113
+ def find_by_id(id)
114
+ @klass.get(id)
115
+ rescue ::DataMapper::ObjectNotFoundError
116
+ nil
117
+ end
118
+
119
+ def find_by_activation_token(token)
120
+ user = @klass.first(@klass.sorcery_config.activation_token_attribute_name => token)
121
+ !!user ? @klass.get(user.id) : nil
122
+ end
123
+
124
+ def find_by_remember_me_token(token)
125
+ user = @klass.first(@klass.sorcery_config.remember_me_token_attribute_name => token)
126
+ !!user ? @klass.get(user.id) : nil
127
+ end
128
+
129
+ def find_by_username(username)
130
+ user = nil
131
+ @klass.sorcery_config.username_attribute_names.each do |name|
132
+ user = @klass.first(name => username)
133
+ break if user
134
+ end
135
+ !!user ? @klass.get(user.id) : nil
136
+ end
137
+
138
+ def transaction(&blk)
139
+ @klass.tap(&blk)
140
+ end
141
+
142
+ def find_by_sorcery_token(token_attr_name, token)
143
+ user = @klass.first(token_attr_name => token)
144
+ !!user ? @klass.get(user.id) : nil
145
+ end
146
+
147
+ def find_by_email(email)
148
+ user = @klass.first(@klass.sorcery_config.email_attribute_name => email)
149
+ !!user ? @klass.get(user.id) : nil
150
+ end
151
+
152
+ # NOTE
153
+ # DM Adapter dependent
154
+ def get_current_users
155
+ unless @klass.repository.adapter.is_a?(::DataMapper::Adapters::MysqlAdapter)
156
+ raise 'Unsupported DataMapper Adapter'
157
+ end
158
+ config = @klass.sorcery_config
159
+ ret = @klass.all(config.last_logout_at_attribute_name => nil) |
160
+ @klass.all(config.last_activity_at_attribute_name.gt => config.last_logout_at_attribute_name)
161
+ ret = ret.all(config.last_activity_at_attribute_name.not => nil)
162
+ ret = ret.all(config.last_activity_at_attribute_name.gt => config.activity_timeout.seconds.ago.utc)
163
+ ret
164
+ end
165
+
166
+ def verify_submodules_compatibility!
167
+ active_submodules = [::Sorcery::Controller::Config.submodules].flatten
168
+
169
+ if active_submodules.include?(:activity_logging) && !repository.adapter.is_a?(::DataMapper::Adapters::MysqlAdapter)
170
+ raise "DataMapper adapter compatibility error, please check documentation"
171
+ end
172
+ end
173
+ end
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,110 @@
1
+ module Sorcery
2
+ module Adapters
3
+ class MongoMapperAdapter < BaseAdapter
4
+ module Wrapper
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ extend Sorcery::Model
9
+ end
10
+
11
+ def sorcery_adapter
12
+ @sorcery_adapter ||= Sorcery::Adapters::MongoMapperAdapter.new(self)
13
+ end
14
+
15
+ module ClassMethods
16
+ def sorcery_adapter
17
+ Sorcery::Adapters::MongoMapperAdapter.from(self)
18
+ end
19
+ end
20
+ end
21
+
22
+ def increment(attr)
23
+ @model[attr] ||= 0
24
+ @model[attr] += 1
25
+ @model.class.increment(@model.id, attr => 1)
26
+ end
27
+
28
+ def save(options = {})
29
+ if options.delete(:raise_on_failure) && options[:validate] != false
30
+ @model.save! options
31
+ else
32
+ @model.save options
33
+ end
34
+ end
35
+
36
+ def update_attributes(attrs)
37
+ @model.update_attributes(attrs)
38
+ end
39
+
40
+ class << self
41
+ def define_field(name, type, options={})
42
+ @klass.key name, type, options.slice(:default)
43
+ end
44
+
45
+ def define_callback(time, event, method_name, options={})
46
+ @klass.send "#{time}_#{event}", method_name, options.slice(:if)
47
+ end
48
+
49
+ def credential_regex(credential)
50
+ return { :$regex => /^#{Regexp.escape(credential)}$/i } if (@klass.sorcery_config.downcase_username_before_authenticating)
51
+ return credential
52
+ end
53
+
54
+ def find_by_credentials(credentials)
55
+ user = nil
56
+ @klass.sorcery_config.username_attribute_names.each do |attribute|
57
+ user = @klass.where(attribute => credential_regex(credentials[0])).first
58
+ break if user
59
+ end
60
+ user
61
+ end
62
+
63
+ def find_by_oauth_credentials(provider, uid)
64
+ @user_config ||= ::Sorcery::Controller::Config.user_class.to_s.constantize.sorcery_config
65
+ @klass.where(@user_config.provider_attribute_name => provider, @user_config.provider_uid_attribute_name => uid).first
66
+ end
67
+
68
+ def find_by_id(id)
69
+ @klass.find(id)
70
+ end
71
+
72
+ def find_by_username(username)
73
+ if @klass.sorcery_config.downcase_username_before_authenticating
74
+ username = username.downcase
75
+ end
76
+
77
+ @klass.sorcery_config.username_attribute_names.each do |attribute|
78
+ result = @klass.where(attribute => username).first
79
+ return result if result
80
+ end
81
+ end
82
+
83
+ def find_by_activation_token(token)
84
+ @klass.where(@klass.sorcery_config.activation_token_attribute_name => token).first
85
+ end
86
+
87
+ def find_by_email(email)
88
+ @klass.where(@klass.sorcery_config.email_attribute_name => email).first
89
+ end
90
+
91
+ def find_by_token(token_attr_name, token)
92
+ @klass.where(token_attr_name => token).first
93
+ end
94
+
95
+ def transaction(&blk)
96
+ @klass.tap(&blk)
97
+ end
98
+
99
+ def find_by_sorcery_token(token_attr_name, token)
100
+ @klass.where(token_attr_name => token).first
101
+ end
102
+
103
+ def get_current_users
104
+ raise "this method is unavailable for MongoMapper"
105
+ end
106
+
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,97 @@
1
+ module Sorcery
2
+ module Adapters
3
+ class MongoidAdapter < BaseAdapter
4
+ def increment(attr)
5
+ mongoid_4? ? @model.inc(attr => 1) : @model.inc(attr, 1)
6
+ end
7
+
8
+ def update_attributes(attrs)
9
+ attrs.each do |name, value|
10
+ attrs[name] = value.utc if value.is_a?(ActiveSupport::TimeWithZone)
11
+ @model.send(:"#{name}=", value)
12
+ end
13
+ @model.class.where(:_id => @model.id).update_all(attrs)
14
+ end
15
+
16
+ def update_attribute(name, value)
17
+ update_attributes(name => value)
18
+ end
19
+
20
+ def save(options = {})
21
+ mthd = options.delete(:raise_on_failure) ? :save! : :save
22
+ @model.send(mthd, options)
23
+ end
24
+
25
+ def mongoid_4?
26
+ Gem::Version.new(::Mongoid::VERSION) >= Gem::Version.new("4.0.0.alpha")
27
+ end
28
+
29
+ class << self
30
+
31
+ def define_field(name, type, options={})
32
+ @klass.field name, options.slice(:default).merge(type: type)
33
+ end
34
+
35
+ def define_callback(time, event, method_name, options={})
36
+ @klass.send "#{time}_#{event}", method_name, options.slice(:if)
37
+ end
38
+
39
+ def credential_regex(credential)
40
+ return { :$regex => /^#{Regexp.escape(credential)}$/i } if (@klass.sorcery_config.downcase_username_before_authenticating)
41
+ credential
42
+ end
43
+
44
+ def find_by_credentials(credentials)
45
+ @klass.sorcery_config.username_attribute_names.each do |attribute|
46
+ @user = @klass.where(attribute => credential_regex(credentials[0])).first
47
+ break if @user
48
+ end
49
+ @user
50
+ end
51
+
52
+ def find_by_oauth_credentials(provider, uid)
53
+ @user_config ||= ::Sorcery::Controller::Config.user_class.to_s.constantize.sorcery_config
54
+ @klass.where(@user_config.provider_attribute_name => provider, @user_config.provider_uid_attribute_name => uid).first
55
+ end
56
+
57
+ def find_by_activation_token(token)
58
+ @klass.where(@klass.sorcery_config.activation_token_attribute_name => token).first
59
+ end
60
+
61
+ def find_by_remember_me_token(token)
62
+ @klass.where(@klass.sorcery_config.remember_me_token_attribute_name => token).first
63
+ end
64
+
65
+ def transaction(&blk)
66
+ tap(&blk)
67
+ end
68
+
69
+ def find_by_id(id)
70
+ @klass.find(id)
71
+ rescue ::Mongoid::Errors::DocumentNotFound
72
+ nil
73
+ end
74
+
75
+ def find_by_username(username)
76
+ query = @klass.sorcery_config.username_attribute_names.map {|name| {name => username}}
77
+ @klass.any_of(*query).first
78
+ end
79
+
80
+ def find_by_token(token_attr_name, token)
81
+ @klass.where(token_attr_name => token).first
82
+ end
83
+
84
+ def find_by_email(email)
85
+ @klass.where(@klass.sorcery_config.email_attribute_name => email).first
86
+ end
87
+
88
+ def get_current_users
89
+ config = @klass.sorcery_config
90
+ @klass.where(config.last_activity_at_attribute_name.ne => nil) \
91
+ .where("this.#{config.last_logout_at_attribute_name} == null || this.#{config.last_activity_at_attribute_name} > this.#{config.last_logout_at_attribute_name}") \
92
+ .where(config.last_activity_at_attribute_name.gt => config.activity_timeout.seconds.ago.utc).order_by([:_id,:asc])
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,65 @@
1
+ module Sorcery
2
+ module Controller
3
+ module Config
4
+ class << self
5
+ attr_accessor :submodules,
6
+ :user_class, # what class to use as the user class.
7
+ :not_authenticated_action, # what controller action to call for non-authenticated users.
8
+
9
+ :save_return_to_url, # when a non logged in user tries to enter a page that requires
10
+ # login, save the URL he wanted to reach,
11
+ # and send him there after login.
12
+
13
+ :cookie_domain, # set domain option for cookies
14
+
15
+ :login_sources,
16
+ :after_login,
17
+ :after_failed_login,
18
+ :before_logout,
19
+ :after_logout
20
+
21
+ def init!
22
+ @defaults = {
23
+ :@user_class => nil,
24
+ :@submodules => [],
25
+ :@not_authenticated_action => :not_authenticated,
26
+ :@login_sources => [],
27
+ :@after_login => [],
28
+ :@after_failed_login => [],
29
+ :@before_logout => [],
30
+ :@after_logout => [],
31
+ :@save_return_to_url => true,
32
+ :@cookie_domain => nil
33
+ }
34
+ end
35
+
36
+ # Resets all configuration options to their default values.
37
+ def reset!
38
+ @defaults.each do |k,v|
39
+ instance_variable_set(k,v)
40
+ end
41
+ end
42
+
43
+ def update!
44
+ @defaults.each do |k,v|
45
+ instance_variable_set(k,v) if !instance_variable_defined?(k)
46
+ end
47
+ end
48
+
49
+ def user_config(&blk)
50
+ block_given? ? @user_config = blk : @user_config
51
+ end
52
+
53
+ def configure(&blk)
54
+ @configure_blk = blk
55
+ end
56
+
57
+ def configure!
58
+ @configure_blk.call(self) if @configure_blk
59
+ end
60
+ end
61
+ init!
62
+ reset!
63
+ end
64
+ end
65
+ end
@@ -1,13 +1,13 @@
1
1
  module Sorcery
2
2
  module Controller
3
3
  module Submodules
4
- # This submodule keeps track of events such as login, logout,
4
+ # This submodule keeps track of events such as login, logout,
5
5
  # and last activity time, per user.
6
6
  # It helps in estimating which users are active now in the site.
7
- # This cannot be determined absolutely because a user might be
7
+ # This cannot be determined absolutely because a user might be
8
8
  # reading a page without clicking anything for a while.
9
- # This is the controller part of the submodule, which adds hooks
10
- # to register user events,
9
+ # This is the controller part of the submodule, which adds hooks
10
+ # to register user events,
11
11
  # and methods to collect active users data for use in the app.
12
12
  # see Socery::Model::Submodules::ActivityLogging for configuration
13
13
  # options.
@@ -19,55 +19,61 @@ module Sorcery
19
19
  attr_accessor :register_login_time
20
20
  attr_accessor :register_logout_time
21
21
  attr_accessor :register_last_activity_time
22
-
22
+ attr_accessor :register_last_ip_address
23
+
23
24
  def merge_activity_logging_defaults!
24
25
  @defaults.merge!(:@register_login_time => true,
25
26
  :@register_logout_time => true,
26
- :@register_last_activity_time => true)
27
+ :@register_last_activity_time => true,
28
+ :@register_last_ip_address => true
29
+ )
27
30
  end
28
31
  end
29
32
  merge_activity_logging_defaults!
30
33
  end
31
34
  Config.after_login << :register_login_time_to_db
35
+ Config.after_login << :register_last_ip_address
32
36
  Config.before_logout << :register_logout_time_to_db
33
37
  base.after_filter :register_last_activity_time_to_db
34
38
  end
35
-
39
+
36
40
  module InstanceMethods
37
41
  # Returns an array of the active users.
38
42
  def current_users
43
+ ActiveSupport::Deprecation.warn("Sorcery: `current_users` method is deprecated. Read more on Github: https://github.com/NoamB/sorcery/issues/602")
44
+
39
45
  user_class.current_users
40
- # A possible patch here:
41
- # we'll add the current_user to the users list if he's not in it
42
- # (can happen when he was inactive for more than activity timeout):
43
- #
44
- # users.unshift!(current_user) if logged_in? && users.find {|u| u.id == current_user.id}.nil?
45
- #
46
- # disadvantages: can hurt performance.
47
46
  end
48
-
47
+
49
48
  protected
50
-
49
+
51
50
  # registers last login time on every login.
52
51
  # This runs as a hook just after a successful login.
53
52
  def register_login_time_to_db(user, credentials)
54
53
  return unless Config.register_login_time
55
- user.update_single_attribute(user.sorcery_config.last_login_at_attribute_name, Time.now.in_time_zone)
54
+ user.set_last_login_at(Time.now.in_time_zone)
56
55
  end
57
-
56
+
58
57
  # registers last logout time on every logout.
59
58
  # This runs as a hook just before a logout.
60
59
  def register_logout_time_to_db(user)
61
60
  return unless Config.register_logout_time
62
- user.update_single_attribute(user.sorcery_config.last_logout_at_attribute_name, Time.now.in_time_zone)
61
+ user.set_last_logout_at(Time.now.in_time_zone)
63
62
  end
64
-
63
+
65
64
  # Updates last activity time on every request.
66
65
  # The only exception is logout - we do not update activity on logout
67
66
  def register_last_activity_time_to_db
68
67
  return unless Config.register_last_activity_time
69
68
  return unless logged_in?
70
- current_user.update_single_attribute(current_user.sorcery_config.last_activity_at_attribute_name, Time.now.in_time_zone)
69
+ current_user.set_last_activity_at(Time.now.in_time_zone)
70
+ end
71
+
72
+ # Updates IP address on every login.
73
+ # This runs as a hook just after a successful login.
74
+ def register_last_ip_address(user, credentials)
75
+ return unless Config.register_last_ip_address
76
+ current_user.set_last_ip_addess(request.remote_ip)
71
77
  end
72
78
  end
73
79
  end
@@ -14,22 +14,22 @@ module Sorcery
14
14
  Config.after_login << :reset_failed_logins_count!
15
15
  Config.after_failed_login << :update_failed_logins_count!
16
16
  end
17
-
17
+
18
18
  module InstanceMethods
19
-
19
+
20
20
  protected
21
-
21
+
22
22
  # Increments the failed logins counter on every failed login.
23
23
  # Runs as a hook after a failed login.
24
24
  def update_failed_logins_count!(credentials)
25
- user = user_class.find_by_credentials(credentials)
25
+ user = user_class.sorcery_adapter.find_by_credentials(credentials)
26
26
  user.register_failed_login! if user
27
27
  end
28
-
28
+
29
29
  # Resets the failed logins counter.
30
30
  # Runs as a hook after a successful login.
31
31
  def reset_failed_logins_count!(user, credentials)
32
- user.update_many_attributes(user_class.sorcery_config.failed_logins_count_attribute_name => 0)
32
+ user.sorcery_adapter.update_attribute(user_class.sorcery_config.failed_logins_count_attribute_name, 0)
33
33
  end
34
34
  end
35
35
  end