sorcery 0.8.4 → 0.8.6

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 (341) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +55 -0
  3. data/.travis.yml +69 -1
  4. data/CHANGELOG.md +248 -0
  5. data/Gemfile +16 -22
  6. data/Gemfile.rails4 +22 -0
  7. data/README.md +320 -0
  8. data/Rakefile +3 -79
  9. data/VERSION +1 -1
  10. data/gemfiles/active_record-rails41.gemfile +6 -0
  11. data/gemfiles/mongo_mapper-rails41.gemfile +8 -0
  12. data/gemfiles/mongoid-rails41.gemfile +11 -0
  13. data/lib/generators/sorcery/helpers.rb +40 -0
  14. data/lib/generators/sorcery/install_generator.rb +21 -17
  15. data/lib/generators/sorcery/templates/initializer.rb +1 -1
  16. data/lib/generators/sorcery/templates/migration/activity_logging.rb +2 -11
  17. data/lib/generators/sorcery/templates/migration/brute_force_protection.rb +1 -7
  18. data/lib/generators/sorcery/templates/migration/core.rb +5 -8
  19. data/lib/generators/sorcery/templates/migration/external.rb +1 -5
  20. data/lib/generators/sorcery/templates/migration/remember_me.rb +2 -9
  21. data/lib/generators/sorcery/templates/migration/reset_password.rb +2 -10
  22. data/lib/generators/sorcery/templates/migration/user_activation.rb +2 -10
  23. data/lib/sorcery/controller/submodules/external.rb +39 -23
  24. data/lib/sorcery/controller/submodules/remember_me.rb +1 -1
  25. data/lib/sorcery/controller/submodules/session_timeout.rb +2 -2
  26. data/lib/sorcery/controller.rb +18 -11
  27. data/lib/sorcery/model/adapters/active_record.rb +7 -2
  28. data/lib/sorcery/model/adapters/datamapper.rb +123 -0
  29. data/lib/sorcery/model/adapters/mongo_mapper.rb +8 -4
  30. data/lib/sorcery/model/adapters/mongoid.rb +8 -8
  31. data/lib/sorcery/model/submodules/activity_logging.rb +24 -0
  32. data/lib/sorcery/model/submodules/brute_force_protection.rb +22 -8
  33. data/lib/sorcery/model/submodules/remember_me.rb +19 -4
  34. data/lib/sorcery/model/submodules/reset_password.rb +35 -14
  35. data/lib/sorcery/model/submodules/user_activation.rb +69 -24
  36. data/lib/sorcery/model.rb +111 -73
  37. data/lib/sorcery/protocols/oauth.rb +42 -0
  38. data/lib/sorcery/protocols/oauth2.rb +47 -0
  39. data/lib/sorcery/providers/base.rb +27 -0
  40. data/lib/sorcery/providers/facebook.rb +63 -0
  41. data/lib/sorcery/providers/github.rb +51 -0
  42. data/lib/sorcery/providers/google.rb +51 -0
  43. data/lib/sorcery/providers/linkedin.rb +66 -0
  44. data/lib/sorcery/providers/liveid.rb +53 -0
  45. data/lib/sorcery/providers/twitter.rb +59 -0
  46. data/lib/sorcery/providers/vk.rb +61 -0
  47. data/lib/sorcery/providers/xing.rb +64 -0
  48. data/lib/sorcery/test_helpers/internal/rails.rb +17 -6
  49. data/lib/sorcery/test_helpers/internal.rb +23 -6
  50. data/lib/sorcery/test_helpers/rails/controller.rb +17 -0
  51. data/lib/sorcery/test_helpers/rails/integration.rb +26 -0
  52. data/lib/sorcery/test_helpers/rails.rb +1 -10
  53. data/lib/sorcery.rb +20 -28
  54. data/sorcery.gemspec +21 -363
  55. data/spec/active_record/controller_activity_logging_spec.rb +29 -0
  56. data/spec/active_record/controller_brute_force_protection_spec.rb +158 -0
  57. data/spec/active_record/controller_http_basic_auth_spec.rb +65 -0
  58. data/spec/active_record/controller_oauth2_spec.rb +342 -0
  59. data/spec/{rails3/spec → active_record}/controller_oauth_spec.rb +69 -59
  60. data/spec/active_record/controller_remember_me_spec.rb +97 -0
  61. data/spec/active_record/controller_session_timeout_spec.rb +70 -0
  62. data/spec/active_record/controller_spec.rb +8 -0
  63. data/spec/{rails3/spec → active_record}/integration_spec.rb +3 -3
  64. data/spec/active_record/user_activation_spec.rb +18 -0
  65. data/spec/active_record/user_activity_logging_spec.rb +8 -0
  66. data/spec/{rails3/spec → active_record}/user_brute_force_protection_spec.rb +6 -5
  67. data/spec/{rails3/spec → active_record}/user_oauth_spec.rb +6 -5
  68. data/spec/{rails3/spec → active_record}/user_remember_me_spec.rb +5 -4
  69. data/spec/{rails3/spec → active_record}/user_reset_password_spec.rb +7 -7
  70. data/spec/active_record/user_spec.rb +37 -0
  71. data/spec/datamapper/controller_activity_logging_spec.rb +17 -0
  72. data/spec/datamapper/controller_spec.rb +8 -0
  73. data/spec/datamapper/user_activation_spec.rb +10 -0
  74. data/spec/datamapper/user_activity_logging_spec.rb +9 -0
  75. data/spec/datamapper/user_brute_force_protection_spec.rb +9 -0
  76. data/spec/datamapper/user_oauth_spec.rb +9 -0
  77. data/spec/datamapper/user_remember_me_spec.rb +8 -0
  78. data/spec/datamapper/user_reset_password_spec.rb +8 -0
  79. data/spec/datamapper/user_spec.rb +27 -0
  80. data/spec/mongo_mapper/controller_spec.rb +8 -0
  81. data/spec/mongo_mapper/user_activation_spec.rb +9 -0
  82. data/spec/mongo_mapper/user_activity_logging_spec.rb +8 -0
  83. data/spec/mongo_mapper/user_brute_force_protection_spec.rb +8 -0
  84. data/spec/mongo_mapper/user_oauth_spec.rb +8 -0
  85. data/spec/mongo_mapper/user_remember_me_spec.rb +8 -0
  86. data/spec/mongo_mapper/user_reset_password_spec.rb +8 -0
  87. data/spec/mongo_mapper/user_spec.rb +37 -0
  88. data/spec/mongoid/controller_activity_logging_spec.rb +16 -0
  89. data/spec/mongoid/controller_spec.rb +8 -0
  90. data/spec/mongoid/user_activation_spec.rb +9 -0
  91. data/spec/mongoid/user_activity_logging_spec.rb +8 -0
  92. data/spec/mongoid/user_brute_force_protection_spec.rb +8 -0
  93. data/spec/mongoid/user_oauth_spec.rb +8 -0
  94. data/spec/mongoid/user_remember_me_spec.rb +8 -0
  95. data/spec/mongoid/user_reset_password_spec.rb +8 -0
  96. data/spec/mongoid/user_spec.rb +38 -0
  97. data/spec/orm/active_record.rb +9 -0
  98. data/spec/orm/datamapper.rb +34 -0
  99. data/spec/orm/mongo_mapper.rb +11 -0
  100. data/spec/orm/mongoid.rb +18 -0
  101. data/spec/{rails3/app/models → rails_app/app/active_record}/user.rb +1 -2
  102. data/spec/rails_app/app/active_record/user_provider.rb +3 -0
  103. data/spec/rails_app/app/controllers/sorcery_controller.rb +224 -0
  104. data/spec/rails_app/app/datamapper/authentication.rb +8 -0
  105. data/spec/rails_app/app/datamapper/user.rb +7 -0
  106. data/spec/{rails3_mongoid/app/models → rails_app/app/mongoid}/user.rb +2 -0
  107. data/spec/{rails3_mongo_mapper → rails_app}/config/application.rb +13 -8
  108. data/spec/rails_app/config/boot.rb +4 -0
  109. data/spec/rails_app/config/database.yml +22 -0
  110. data/spec/{rails3_mongo_mapper → rails_app}/config/environments/test.rb +2 -0
  111. data/spec/{rails3_mongoid → rails_app}/config/initializers/session_store.rb +4 -0
  112. data/spec/rails_app/config/routes.rb +42 -0
  113. data/spec/{rails3_mongo_mapper → rails_app}/config.ru +1 -1
  114. data/spec/{rails3 → rails_app}/db/migrate/activation/20101224223622_add_activation_to_users.rb +3 -3
  115. data/spec/rails_app/db/migrate/external/20101224223628_create_authentications_and_user_providers.rb +22 -0
  116. data/spec/rails_app/log/development.log +1791 -0
  117. data/spec/shared_examples/controller_activity_logging_shared_examples.rb +125 -0
  118. data/spec/shared_examples/controller_oauth2_shared_examples.rb +32 -36
  119. data/spec/shared_examples/controller_oauth_shared_examples.rb +35 -28
  120. data/spec/shared_examples/controller_shared_examples.rb +203 -0
  121. data/spec/shared_examples/user_activation_shared_examples.rb +136 -97
  122. data/spec/shared_examples/user_activity_logging_shared_examples.rb +10 -10
  123. data/spec/shared_examples/user_brute_force_protection_shared_examples.rb +14 -13
  124. data/spec/shared_examples/user_oauth_shared_examples.rb +23 -15
  125. data/spec/shared_examples/user_remember_me_shared_examples.rb +32 -23
  126. data/spec/shared_examples/user_reset_password_shared_examples.rb +162 -129
  127. data/spec/shared_examples/user_shared_examples.rb +265 -190
  128. data/spec/sorcery_crypto_providers_spec.rb +74 -72
  129. data/spec/spec_helper.rb +47 -4
  130. metadata +187 -368
  131. data/Gemfile.lock +0 -175
  132. data/README.rdoc +0 -261
  133. data/lib/sorcery/controller/submodules/external/protocols/oauth1.rb +0 -46
  134. data/lib/sorcery/controller/submodules/external/protocols/oauth2.rb +0 -49
  135. data/lib/sorcery/controller/submodules/external/providers/base.rb +0 -21
  136. data/lib/sorcery/controller/submodules/external/providers/facebook.rb +0 -98
  137. data/lib/sorcery/controller/submodules/external/providers/github.rb +0 -92
  138. data/lib/sorcery/controller/submodules/external/providers/google.rb +0 -91
  139. data/lib/sorcery/controller/submodules/external/providers/linkedin.rb +0 -102
  140. data/lib/sorcery/controller/submodules/external/providers/liveid.rb +0 -92
  141. data/lib/sorcery/controller/submodules/external/providers/twitter.rb +0 -93
  142. data/lib/sorcery/controller/submodules/external/providers/vk.rb +0 -100
  143. data/lib/sorcery/controller/submodules/external/providers/xing.rb +0 -97
  144. data/lib/sorcery/test_helpers.rb +0 -5
  145. data/spec/Gemfile +0 -12
  146. data/spec/Gemfile.lock +0 -129
  147. data/spec/README.md +0 -31
  148. data/spec/Rakefile +0 -12
  149. data/spec/rails3/.gitignore +0 -4
  150. data/spec/rails3/.rspec +0 -1
  151. data/spec/rails3/Gemfile +0 -15
  152. data/spec/rails3/Gemfile.lock +0 -162
  153. data/spec/rails3/README +0 -256
  154. data/spec/rails3/Rakefile +0 -11
  155. data/spec/rails3/app/controllers/application_controller.rb +0 -208
  156. data/spec/rails3/config/application.rb +0 -46
  157. data/spec/rails3/config/boot.rb +0 -13
  158. data/spec/rails3/config/database.yml +0 -27
  159. data/spec/rails3/config/environments/development.rb +0 -26
  160. data/spec/rails3/config/environments/in_memory.rb +0 -35
  161. data/spec/rails3/config/environments/production.rb +0 -49
  162. data/spec/rails3/config/environments/test.rb +0 -35
  163. data/spec/rails3/config/initializers/session_store.rb +0 -8
  164. data/spec/rails3/config/routes.rb +0 -59
  165. data/spec/rails3/config.ru +0 -4
  166. data/spec/rails3/db/migrate/external/20101224223628_create_authentications.rb +0 -14
  167. data/spec/rails3/public/stylesheets/.gitkeep +0 -0
  168. data/spec/rails3/script/rails +0 -6
  169. data/spec/rails3/spec/controller_activity_logging_spec.rb +0 -130
  170. data/spec/rails3/spec/controller_brute_force_protection_spec.rb +0 -96
  171. data/spec/rails3/spec/controller_http_basic_auth_spec.rb +0 -50
  172. data/spec/rails3/spec/controller_oauth2_spec.rb +0 -380
  173. data/spec/rails3/spec/controller_remember_me_spec.rb +0 -96
  174. data/spec/rails3/spec/controller_session_timeout_spec.rb +0 -55
  175. data/spec/rails3/spec/controller_spec.rb +0 -182
  176. data/spec/rails3/spec/spec.opts +0 -2
  177. data/spec/rails3/spec/spec_helper.orig.rb +0 -27
  178. data/spec/rails3/spec/spec_helper.rb +0 -71
  179. data/spec/rails3/spec/user_activation_spec.rb +0 -16
  180. data/spec/rails3/spec/user_activity_logging_spec.rb +0 -8
  181. data/spec/rails3/spec/user_spec.rb +0 -36
  182. data/spec/rails3/vendor/plugins/.gitkeep +0 -0
  183. data/spec/rails3_mongo_mapper/.gitignore +0 -4
  184. data/spec/rails3_mongo_mapper/.rspec +0 -1
  185. data/spec/rails3_mongo_mapper/Gemfile +0 -16
  186. data/spec/rails3_mongo_mapper/Gemfile.lock +0 -156
  187. data/spec/rails3_mongo_mapper/Rakefile +0 -11
  188. data/spec/rails3_mongo_mapper/app/controllers/application_controller.rb +0 -122
  189. data/spec/rails3_mongo_mapper/app/helpers/application_helper.rb +0 -2
  190. data/spec/rails3_mongo_mapper/app/mailers/sorcery_mailer.rb +0 -25
  191. data/spec/rails3_mongo_mapper/app/views/layouts/application.html.erb +0 -14
  192. data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/activation_email.html.erb +0 -17
  193. data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/activation_email.text.erb +0 -9
  194. data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/activation_success_email.text.erb +0 -9
  195. data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/reset_password_email.html.erb +0 -16
  196. data/spec/rails3_mongo_mapper/app/views/sorcery_mailer/reset_password_email.text.erb +0 -8
  197. data/spec/rails3_mongo_mapper/config/boot.rb +0 -13
  198. data/spec/rails3_mongo_mapper/config/environment.rb +0 -5
  199. data/spec/rails3_mongo_mapper/config/environments/development.rb +0 -30
  200. data/spec/rails3_mongo_mapper/config/environments/in_memory.rb +0 -0
  201. data/spec/rails3_mongo_mapper/config/environments/production.rb +0 -49
  202. data/spec/rails3_mongo_mapper/config/initializers/backtrace_silencers.rb +0 -7
  203. data/spec/rails3_mongo_mapper/config/initializers/inflections.rb +0 -10
  204. data/spec/rails3_mongo_mapper/config/initializers/mime_types.rb +0 -5
  205. data/spec/rails3_mongo_mapper/config/initializers/mongo.rb +0 -2
  206. data/spec/rails3_mongo_mapper/config/initializers/secret_token.rb +0 -7
  207. data/spec/rails3_mongo_mapper/config/initializers/session_store.rb +0 -8
  208. data/spec/rails3_mongo_mapper/config/locales/en.yml +0 -5
  209. data/spec/rails3_mongo_mapper/config/routes.rb +0 -59
  210. data/spec/rails3_mongo_mapper/db/schema.rb +0 -23
  211. data/spec/rails3_mongo_mapper/db/seeds.rb +0 -7
  212. data/spec/rails3_mongo_mapper/lib/tasks/.gitkeep +0 -0
  213. data/spec/rails3_mongo_mapper/public/404.html +0 -26
  214. data/spec/rails3_mongo_mapper/public/422.html +0 -26
  215. data/spec/rails3_mongo_mapper/public/500.html +0 -26
  216. data/spec/rails3_mongo_mapper/public/favicon.ico +0 -0
  217. data/spec/rails3_mongo_mapper/public/images/rails.png +0 -0
  218. data/spec/rails3_mongo_mapper/public/javascripts/application.js +0 -2
  219. data/spec/rails3_mongo_mapper/public/javascripts/controls.js +0 -965
  220. data/spec/rails3_mongo_mapper/public/javascripts/dragdrop.js +0 -974
  221. data/spec/rails3_mongo_mapper/public/javascripts/effects.js +0 -1123
  222. data/spec/rails3_mongo_mapper/public/javascripts/prototype.js +0 -6001
  223. data/spec/rails3_mongo_mapper/public/javascripts/rails.js +0 -175
  224. data/spec/rails3_mongo_mapper/public/robots.txt +0 -5
  225. data/spec/rails3_mongo_mapper/public/stylesheets/.gitkeep +0 -0
  226. data/spec/rails3_mongo_mapper/script/rails +0 -6
  227. data/spec/rails3_mongo_mapper/spec/controller_spec.rb +0 -175
  228. data/spec/rails3_mongo_mapper/spec/spec.opts +0 -2
  229. data/spec/rails3_mongo_mapper/spec/spec_helper.orig.rb +0 -27
  230. data/spec/rails3_mongo_mapper/spec/spec_helper.rb +0 -55
  231. data/spec/rails3_mongo_mapper/spec/user_activation_spec.rb +0 -9
  232. data/spec/rails3_mongo_mapper/spec/user_activity_logging_spec.rb +0 -8
  233. data/spec/rails3_mongo_mapper/spec/user_brute_force_protection_spec.rb +0 -8
  234. data/spec/rails3_mongo_mapper/spec/user_oauth_spec.rb +0 -8
  235. data/spec/rails3_mongo_mapper/spec/user_remember_me_spec.rb +0 -8
  236. data/spec/rails3_mongo_mapper/spec/user_reset_password_spec.rb +0 -8
  237. data/spec/rails3_mongo_mapper/spec/user_spec.rb +0 -37
  238. data/spec/rails3_mongo_mapper/vendor/plugins/.gitkeep +0 -0
  239. data/spec/rails3_mongoid/.gitignore +0 -4
  240. data/spec/rails3_mongoid/.rspec +0 -1
  241. data/spec/rails3_mongoid/Gemfile +0 -15
  242. data/spec/rails3_mongoid/Gemfile.lock +0 -146
  243. data/spec/rails3_mongoid/Rakefile +0 -11
  244. data/spec/rails3_mongoid/app/controllers/application_controller.rb +0 -127
  245. data/spec/rails3_mongoid/app/helpers/application_helper.rb +0 -2
  246. data/spec/rails3_mongoid/app/mailers/sorcery_mailer.rb +0 -25
  247. data/spec/rails3_mongoid/app/views/layouts/application.html.erb +0 -14
  248. data/spec/rails3_mongoid/app/views/sorcery_mailer/activation_email.html.erb +0 -17
  249. data/spec/rails3_mongoid/app/views/sorcery_mailer/activation_email.text.erb +0 -9
  250. data/spec/rails3_mongoid/app/views/sorcery_mailer/activation_success_email.html.erb +0 -17
  251. data/spec/rails3_mongoid/app/views/sorcery_mailer/activation_success_email.text.erb +0 -9
  252. data/spec/rails3_mongoid/app/views/sorcery_mailer/reset_password_email.html.erb +0 -16
  253. data/spec/rails3_mongoid/app/views/sorcery_mailer/reset_password_email.text.erb +0 -8
  254. data/spec/rails3_mongoid/config/application.rb +0 -51
  255. data/spec/rails3_mongoid/config/boot.rb +0 -13
  256. data/spec/rails3_mongoid/config/environment.rb +0 -5
  257. data/spec/rails3_mongoid/config/environments/development.rb +0 -26
  258. data/spec/rails3_mongoid/config/environments/in_memory.rb +0 -0
  259. data/spec/rails3_mongoid/config/environments/production.rb +0 -49
  260. data/spec/rails3_mongoid/config/environments/test.rb +0 -35
  261. data/spec/rails3_mongoid/config/initializers/backtrace_silencers.rb +0 -7
  262. data/spec/rails3_mongoid/config/initializers/inflections.rb +0 -10
  263. data/spec/rails3_mongoid/config/initializers/mime_types.rb +0 -5
  264. data/spec/rails3_mongoid/config/initializers/secret_token.rb +0 -7
  265. data/spec/rails3_mongoid/config/locales/en.yml +0 -5
  266. data/spec/rails3_mongoid/config/mongoid.yml +0 -7
  267. data/spec/rails3_mongoid/config/routes.rb +0 -59
  268. data/spec/rails3_mongoid/config.ru +0 -4
  269. data/spec/rails3_mongoid/db/schema.rb +0 -23
  270. data/spec/rails3_mongoid/db/seeds.rb +0 -7
  271. data/spec/rails3_mongoid/lib/tasks/.gitkeep +0 -0
  272. data/spec/rails3_mongoid/public/404.html +0 -26
  273. data/spec/rails3_mongoid/public/422.html +0 -26
  274. data/spec/rails3_mongoid/public/500.html +0 -26
  275. data/spec/rails3_mongoid/public/favicon.ico +0 -0
  276. data/spec/rails3_mongoid/public/images/rails.png +0 -0
  277. data/spec/rails3_mongoid/public/javascripts/application.js +0 -2
  278. data/spec/rails3_mongoid/public/javascripts/controls.js +0 -965
  279. data/spec/rails3_mongoid/public/javascripts/dragdrop.js +0 -974
  280. data/spec/rails3_mongoid/public/javascripts/effects.js +0 -1123
  281. data/spec/rails3_mongoid/public/javascripts/prototype.js +0 -6001
  282. data/spec/rails3_mongoid/public/javascripts/rails.js +0 -175
  283. data/spec/rails3_mongoid/public/robots.txt +0 -5
  284. data/spec/rails3_mongoid/public/stylesheets/.gitkeep +0 -0
  285. data/spec/rails3_mongoid/script/rails +0 -6
  286. data/spec/rails3_mongoid/spec/controller_activity_logging_spec.rb +0 -111
  287. data/spec/rails3_mongoid/spec/controller_spec.rb +0 -186
  288. data/spec/rails3_mongoid/spec/spec.opts +0 -2
  289. data/spec/rails3_mongoid/spec/spec_helper.orig.rb +0 -27
  290. data/spec/rails3_mongoid/spec/spec_helper.rb +0 -55
  291. data/spec/rails3_mongoid/spec/user_activation_spec.rb +0 -9
  292. data/spec/rails3_mongoid/spec/user_activity_logging_spec.rb +0 -8
  293. data/spec/rails3_mongoid/spec/user_brute_force_protection_spec.rb +0 -8
  294. data/spec/rails3_mongoid/spec/user_oauth_spec.rb +0 -8
  295. data/spec/rails3_mongoid/spec/user_remember_me_spec.rb +0 -8
  296. data/spec/rails3_mongoid/spec/user_reset_password_spec.rb +0 -8
  297. data/spec/rails3_mongoid/spec/user_spec.rb +0 -38
  298. data/spec/rails3_mongoid/vendor/plugins/.gitkeep +0 -0
  299. /data/lib/sorcery/{controller/submodules/external/protocols → protocols}/certs/ca-bundle.crt +0 -0
  300. /data/spec/{rails3/app/models → rails_app/app/active_record}/authentication.rb +0 -0
  301. /data/spec/{rails3 → rails_app}/app/helpers/application_helper.rb +0 -0
  302. /data/spec/{rails3 → rails_app}/app/mailers/sorcery_mailer.rb +0 -0
  303. /data/spec/{rails3_mongo_mapper/app/models → rails_app/app/mongo_mapper}/authentication.rb +0 -0
  304. /data/spec/{rails3_mongo_mapper/app/models → rails_app/app/mongo_mapper}/user.rb +0 -0
  305. /data/spec/{rails3_mongoid/app/models → rails_app/app/mongoid}/authentication.rb +0 -0
  306. /data/spec/{rails3 → rails_app}/app/views/application/index.html.erb +0 -0
  307. /data/spec/{rails3 → rails_app}/app/views/layouts/application.html.erb +0 -0
  308. /data/spec/{rails3 → rails_app}/app/views/sorcery_mailer/activation_email.html.erb +0 -0
  309. /data/spec/{rails3 → rails_app}/app/views/sorcery_mailer/activation_email.text.erb +0 -0
  310. /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
  311. /data/spec/{rails3_mongo_mapper → rails_app}/app/views/sorcery_mailer/activation_success_email.html.erb +0 -0
  312. /data/spec/{rails3 → rails_app}/app/views/sorcery_mailer/activation_success_email.text.erb +0 -0
  313. /data/spec/{rails3 → rails_app}/app/views/sorcery_mailer/reset_password_email.html.erb +0 -0
  314. /data/spec/{rails3 → rails_app}/app/views/sorcery_mailer/reset_password_email.text.erb +0 -0
  315. /data/spec/{rails3 → rails_app}/app/views/sorcery_mailer/send_unlock_token_email.text.erb +0 -0
  316. /data/spec/{rails3 → rails_app}/config/environment.rb +0 -0
  317. /data/spec/{rails3 → rails_app}/config/initializers/backtrace_silencers.rb +0 -0
  318. /data/spec/{rails3 → rails_app}/config/initializers/inflections.rb +0 -0
  319. /data/spec/{rails3 → rails_app}/config/initializers/mime_types.rb +0 -0
  320. /data/spec/{rails3 → rails_app}/config/initializers/secret_token.rb +0 -0
  321. /data/spec/{rails3 → rails_app}/config/locales/en.yml +0 -0
  322. /data/spec/{rails3 → rails_app}/db/migrate/activity_logging/20101224223624_add_activity_logging_to_users.rb +0 -0
  323. /data/spec/{rails3 → rails_app}/db/migrate/brute_force_protection/20101224223626_add_brute_force_protection_to_users.rb +0 -0
  324. /data/spec/{rails3 → rails_app}/db/migrate/core/20101224223620_create_users.rb +0 -0
  325. /data/spec/{rails3 → rails_app}/db/migrate/remember_me/20101224223623_add_remember_me_token_to_users.rb +0 -0
  326. /data/spec/{rails3 → rails_app}/db/migrate/reset_password/20101224223622_add_reset_password_to_users.rb +0 -0
  327. /data/spec/{rails3 → rails_app}/db/schema.rb +0 -0
  328. /data/spec/{rails3 → rails_app}/db/seeds.rb +0 -0
  329. /data/spec/{rails3 → rails_app}/public/404.html +0 -0
  330. /data/spec/{rails3 → rails_app}/public/422.html +0 -0
  331. /data/spec/{rails3 → rails_app}/public/500.html +0 -0
  332. /data/spec/{rails3 → rails_app}/public/favicon.ico +0 -0
  333. /data/spec/{rails3 → rails_app}/public/images/rails.png +0 -0
  334. /data/spec/{rails3 → rails_app}/public/javascripts/application.js +0 -0
  335. /data/spec/{rails3 → rails_app}/public/javascripts/controls.js +0 -0
  336. /data/spec/{rails3 → rails_app}/public/javascripts/dragdrop.js +0 -0
  337. /data/spec/{rails3 → rails_app}/public/javascripts/effects.js +0 -0
  338. /data/spec/{rails3 → rails_app}/public/javascripts/prototype.js +0 -0
  339. /data/spec/{rails3 → rails_app}/public/javascripts/rails.js +0 -0
  340. /data/spec/{rails3 → rails_app}/public/robots.txt +0 -0
  341. /data/spec/{rails3/lib/tasks → rails_app/public/stylesheets}/.gitkeep +0 -0
@@ -9,14 +9,14 @@ module Sorcery
9
9
  # he will be able to reset his password via a form.
10
10
  #
11
11
  # When using this submodule, supplying a mailer is mandatory.
12
- module ResetPassword
12
+ module ResetPassword
13
13
  def self.included(base)
14
14
  base.sorcery_config.class_eval do
15
15
  attr_accessor :reset_password_token_attribute_name, # reset password code attribute name.
16
16
  :reset_password_token_expires_at_attribute_name, # expires at attribute name.
17
17
  :reset_password_email_sent_at_attribute_name, # when was email sent, used for hammering
18
18
  # protection.
19
-
19
+
20
20
  :reset_password_mailer, # mailer class. Needed.
21
21
 
22
22
  :reset_password_mailer_disabled, # when true sorcery will not automatically
@@ -25,15 +25,15 @@ module Sorcery
25
25
 
26
26
  :reset_password_email_method_name, # reset password email method on your
27
27
  # mailer class.
28
-
28
+
29
29
  :reset_password_expiration_period, # how many seconds before the reset request
30
30
  # expires. nil for never expires.
31
-
31
+
32
32
  :reset_password_time_between_emails # hammering protection, how long to wait
33
33
  # before allowing another email to be sent.
34
34
 
35
35
  end
36
-
36
+
37
37
  base.sorcery_config.instance_eval do
38
38
  @defaults.merge!(:@reset_password_token_attribute_name => :reset_password_token,
39
39
  :@reset_password_token_expires_at_attribute_name => :reset_password_token_expires_at,
@@ -54,11 +54,14 @@ module Sorcery
54
54
  if defined?(MongoMapper) and base.ancestors.include?(MongoMapper::Document)
55
55
  base.sorcery_config.after_config << :define_reset_password_mongo_mapper_fields
56
56
  end
57
+ if defined?(DataMapper) and base.ancestors.include?(DataMapper::Resource)
58
+ base.sorcery_config.after_config << :define_reset_password_datamapper_fields
59
+ end
57
60
 
58
61
  base.send(:include, InstanceMethods)
59
62
 
60
63
  end
61
-
64
+
62
65
  module ClassMethods
63
66
  # Find user by token, also checks for expiration.
64
67
  # Returns the user if token found and is valid.
@@ -67,9 +70,9 @@ module Sorcery
67
70
  token_expiration_date_attr = @sorcery_config.reset_password_token_expires_at_attribute_name
68
71
  load_from_token(token, token_attr_name, token_expiration_date_attr)
69
72
  end
70
-
73
+
71
74
  protected
72
-
75
+
73
76
  # This submodule requires the developer to define his own mailer class to be used by it
74
77
  # when reset_password_mailer_disabled is false
75
78
  def validate_mailer_defined
@@ -82,14 +85,28 @@ module Sorcery
82
85
  field sorcery_config.reset_password_token_expires_at_attribute_name, :type => Time
83
86
  field sorcery_config.reset_password_email_sent_at_attribute_name, :type => Time
84
87
  end
85
-
88
+
86
89
  def define_reset_password_mongo_mapper_fields
87
90
  key sorcery_config.reset_password_token_attribute_name, String
88
91
  key sorcery_config.reset_password_token_expires_at_attribute_name, Time
89
92
  key sorcery_config.reset_password_email_sent_at_attribute_name, Time
90
93
  end
94
+
95
+ def define_reset_password_datamapper_fields
96
+ property sorcery_config.reset_password_token_attribute_name, String
97
+ property sorcery_config.reset_password_token_expires_at_attribute_name, Time
98
+ property sorcery_config.reset_password_email_sent_at_attribute_name, Time
99
+ [sorcery_config.reset_password_token_expires_at_attribute_name,
100
+ sorcery_config.reset_password_email_sent_at_attribute_name].each do |sym|
101
+ alias_method "orig_#{sym}", sym
102
+ define_method(sym) do
103
+ t = send("orig_#{sym}")
104
+ t && Time.new(t.year, t.month, t.day, t.hour, t.min, t.sec, 0)
105
+ end
106
+ end
107
+ end
91
108
  end
92
-
109
+
93
110
  module InstanceMethods
94
111
  # generates a reset code with expiration and sends an email to the user.
95
112
  def deliver_reset_password_instructions!
@@ -101,18 +118,22 @@ module Sorcery
101
118
  attributes[config.reset_password_token_expires_at_attribute_name] = Time.now.in_time_zone + config.reset_password_expiration_period if config.reset_password_expiration_period
102
119
  self.class.transaction do
103
120
  self.update_many_attributes(attributes)
104
- generic_send_email(:reset_password_email_method_name, :reset_password_mailer) unless config.reset_password_mailer_disabled
121
+ send_reset_password_email! unless sorcery_config.reset_password_mailer_disabled
105
122
  end
106
123
  end
107
-
124
+
108
125
  # Clears token and tries to update the new password for the user.
109
126
  def change_password!(new_password)
110
127
  clear_reset_password_token
111
128
  self.send(:"#{sorcery_config.password_attribute_name}=", new_password)
112
- save
129
+ sorcery_save
113
130
  end
114
131
 
115
132
  protected
133
+
134
+ def send_reset_password_email!
135
+ generic_send_email(:reset_password_email_method_name, :reset_password_mailer)
136
+ end
116
137
 
117
138
  # Clears the token.
118
139
  def clear_reset_password_token
@@ -121,7 +142,7 @@ module Sorcery
121
142
  self.send(:"#{config.reset_password_token_expires_at_attribute_name}=", nil) if config.reset_password_expiration_period
122
143
  end
123
144
  end
124
-
145
+
125
146
  end
126
147
  end
127
148
  end
@@ -10,16 +10,16 @@ module Sorcery
10
10
  base.sorcery_config.class_eval do
11
11
  attr_accessor :activation_state_attribute_name, # the attribute name to hold activation state
12
12
  # (active/pending).
13
-
13
+
14
14
  :activation_token_attribute_name, # the attribute name to hold activation code
15
15
  # (sent by email).
16
-
16
+
17
17
  :activation_token_expires_at_attribute_name, # the attribute name to hold activation code
18
18
  # expiration date.
19
-
19
+
20
20
  :activation_token_expiration_period, # how many seconds before the activation code
21
21
  # expires. nil for never expires.
22
-
22
+
23
23
  :user_activation_mailer, # your mailer class. Required when
24
24
  # activation_mailer_disabled == false.
25
25
 
@@ -29,14 +29,14 @@ module Sorcery
29
29
 
30
30
  :activation_needed_email_method_name, # activation needed email method on your
31
31
  # mailer class.
32
-
32
+
33
33
  :activation_success_email_method_name, # activation success email method on your
34
34
  # mailer class.
35
-
35
+
36
36
  :prevent_non_active_users_to_login # do you want to prevent or allow users that
37
37
  # did not activate by email to login?
38
38
  end
39
-
39
+
40
40
  base.sorcery_config.instance_eval do
41
41
  @defaults.merge!(:@activation_state_attribute_name => :activation_state,
42
42
  :@activation_token_attribute_name => :activation_token,
@@ -49,27 +49,43 @@ module Sorcery
49
49
  :@prevent_non_active_users_to_login => true)
50
50
  reset!
51
51
  end
52
-
52
+
53
53
  base.class_eval do
54
- # don't setup activation if no password supplied - this user is created automatically
55
- before_create :setup_activation, :if => Proc.new { |user| user.send(sorcery_config.password_attribute_name).present? }
56
- # don't send activation needed email if no crypted password created - this user is external (OAuth etc.)
57
- after_create :send_activation_needed_email!, :if => Proc.new { |user| !user.external? }
54
+ if defined?(DataMapper) && self.ancestors.include?(DataMapper::Resource)
55
+ before :valid? do
56
+ if self.send(sorcery_config.password_attribute_name).present?
57
+ setup_activation
58
+ end
59
+ end
60
+ after :create do
61
+ if send_activation_needed_email?
62
+ send_activation_needed_email!
63
+ end
64
+ end
65
+ else
66
+ # don't setup activation if no password supplied - this user is created automatically
67
+ before_create :setup_activation, :if => Proc.new { |user| user.send(sorcery_config.password_attribute_name).present? }
68
+ # don't send activation needed email if no crypted password created - this user is external (OAuth etc.)
69
+ after_create :send_activation_needed_email!, :if => :send_activation_needed_email?
70
+ end
58
71
  end
59
-
72
+
60
73
  base.sorcery_config.after_config << :validate_mailer_defined
61
74
  base.sorcery_config.after_config << :define_user_activation_mongoid_fields if defined?(Mongoid) and base.ancestors.include?(Mongoid::Document)
62
75
  if defined?(MongoMapper) and base.ancestors.include?(MongoMapper::Document)
63
76
  base.sorcery_config.after_config << :define_user_activation_mongo_mapper_fields
64
77
  end
78
+ if defined?(DataMapper) and base.ancestors.include?(DataMapper::Resource)
79
+ base.sorcery_config.after_config << :define_user_activation_datamapper_fields
80
+ end
65
81
  base.sorcery_config.before_authenticate << :prevent_non_active_login
66
-
82
+
67
83
  base.extend(ClassMethods)
68
84
  base.send(:include, InstanceMethods)
69
85
 
70
86
 
71
87
  end
72
-
88
+
73
89
  module ClassMethods
74
90
  # Find user by token, also checks for expiration.
75
91
  # Returns the user if token found and is valid.
@@ -78,9 +94,9 @@ module Sorcery
78
94
  token_expiration_date_attr = @sorcery_config.activation_token_expires_at_attribute_name
79
95
  load_from_token(token, token_attr_name, token_expiration_date_attr)
80
96
  end
81
-
97
+
82
98
  protected
83
-
99
+
84
100
  # This submodule requires the developer to define his own mailer class to be used by it
85
101
  # when activation_mailer_disabled is false
86
102
  def validate_mailer_defined
@@ -103,18 +119,33 @@ module Sorcery
103
119
  key sorcery_config.activation_token_expires_at_attribute_name, Time
104
120
  end
105
121
  end
122
+
123
+ def define_user_activation_datamapper_fields
124
+ self.class_eval do
125
+ property sorcery_config.activation_state_attribute_name, String
126
+ property sorcery_config.activation_token_attribute_name, String
127
+ property sorcery_config.activation_token_expires_at_attribute_name, Time
128
+ [sorcery_config.activation_token_expires_at_attribute_name].each do |sym|
129
+ alias_method "orig_#{sym}", sym
130
+ define_method(sym) do
131
+ t = send("orig_#{sym}")
132
+ t && Time.new(t.year, t.month, t.day, t.hour, t.min, t.sec, 0)
133
+ end
134
+ end
135
+ end
136
+ end
106
137
  end
107
-
138
+
108
139
  module InstanceMethods
109
140
  # clears activation code, sets the user as 'active' and optionaly sends a success email.
110
141
  def activate!
111
142
  config = sorcery_config
112
143
  self.send(:"#{config.activation_token_attribute_name}=", nil)
113
144
  self.send(:"#{config.activation_state_attribute_name}=", "active")
114
- send_activation_success_email! unless self.external?
115
- save!(:validate => false) # don't run validations
145
+ send_activation_success_email! if send_activation_success_email?
146
+ sorcery_save(:validate => false, :raise_on_failure => true)
116
147
  end
117
-
148
+
118
149
  protected
119
150
 
120
151
  def setup_activation
@@ -127,13 +158,27 @@ module Sorcery
127
158
 
128
159
  # called automatically after user initial creation.
129
160
  def send_activation_needed_email!
130
- generic_send_email(:activation_needed_email_method_name, :user_activation_mailer) unless sorcery_config.activation_needed_email_method_name.nil? or sorcery_config.activation_mailer_disabled == true
161
+ generic_send_email(:activation_needed_email_method_name, :user_activation_mailer)
131
162
  end
132
163
 
133
164
  def send_activation_success_email!
134
- generic_send_email(:activation_success_email_method_name, :user_activation_mailer) unless sorcery_config.activation_success_email_method_name.nil? or sorcery_config.activation_mailer_disabled == true
165
+ generic_send_email(:activation_success_email_method_name, :user_activation_mailer)
135
166
  end
136
167
 
168
+ def send_activation_success_email?
169
+ !external? && (
170
+ !(sorcery_config.activation_success_email_method_name.nil? ||
171
+ sorcery_config.activation_mailer_disabled == true)
172
+ )
173
+ end
174
+
175
+ def send_activation_needed_email?
176
+ !external? && (
177
+ !(sorcery_config.activation_needed_email_method_name.nil? ||
178
+ sorcery_config.activation_mailer_disabled == true)
179
+ )
180
+ end
181
+
137
182
  def prevent_non_active_login
138
183
  config = sorcery_config
139
184
  config.prevent_non_active_users_to_login ? self.send(config.activation_state_attribute_name) == "active" : true
@@ -143,4 +188,4 @@ module Sorcery
143
188
  end
144
189
  end
145
190
  end
146
- end
191
+ end
data/lib/sorcery/model.rb CHANGED
@@ -7,86 +7,114 @@ module Sorcery
7
7
  # which when called adds the other capabilities to the class.
8
8
  # This method is also the place to configure the plugin in the Model layer.
9
9
  module Model
10
- def self.included(klass)
11
- klass.class_eval do
12
- class << self
13
- def authenticates_with_sorcery!
14
- @sorcery_config = Config.new
15
- self.class_eval do
16
- extend ClassMethods # included here, before submodules, so they can be overriden by them.
17
- include InstanceMethods
18
- include TemporaryToken
19
- end
10
+ def authenticates_with_sorcery!
11
+ @sorcery_config = Config.new
20
12
 
21
- include_required_submodules!
13
+ extend ClassMethods # included here, before submodules, so they can be overriden by them.
14
+ include InstanceMethods
15
+ include TemporaryToken
22
16
 
23
- # This runs the options block set in the initializer on the model class.
24
- ::Sorcery::Controller::Config.user_config.tap{|blk| blk.call(@sorcery_config) if blk}
17
+ include_required_submodules!
25
18
 
26
- init_mongoid_support! if defined?(Mongoid) and self.ancestors.include?(Mongoid::Document)
27
- init_mongo_mapper_support! if defined?(MongoMapper) and self.ancestors.include?(MongoMapper::Document)
19
+ # This runs the options block set in the initializer on the model class.
20
+ ::Sorcery::Controller::Config.user_config.tap{|blk| blk.call(@sorcery_config) if blk}
28
21
 
29
- init_orm_hooks!
22
+ init_mongoid_support! if defined?(Mongoid) and self.ancestors.include?(Mongoid::Document)
23
+ init_mongo_mapper_support! if defined?(MongoMapper) and self.ancestors.include?(MongoMapper::Document)
24
+ init_datamapper_support! if defined?(DataMapper) and self.ancestors.include?(DataMapper::Resource)
30
25
 
31
- @sorcery_config.after_config << :add_config_inheritance if @sorcery_config.subclasses_inherit_config
32
- @sorcery_config.after_config.each { |c| send(c) }
33
- end
26
+ init_orm_hooks!
34
27
 
35
- protected
36
-
37
- # includes required submodules into the model class,
38
- # which usually is called User.
39
- def include_required_submodules!
40
- self.class_eval do
41
- @sorcery_config.submodules = ::Sorcery::Controller::Config.submodules
42
- @sorcery_config.submodules.each do |mod|
43
- begin
44
- include Submodules.const_get(mod.to_s.split("_").map {|p| p.capitalize}.join(""))
45
- rescue NameError
46
- # don't stop on a missing submodule. Needed because some submodules are only defined
47
- # in the controller side.
48
- end
49
- end
50
- end
51
- end
28
+ @sorcery_config.after_config << :add_config_inheritance if @sorcery_config.subclasses_inherit_config
29
+ @sorcery_config.after_config.each { |c| send(c) }
30
+ end
52
31
 
53
- # defines mongoid fields on the model class,
54
- # using 1.8.x hash syntax to perserve compatibility.
55
- def init_mongoid_support!
56
- self.class_eval do
57
- sorcery_config.username_attribute_names.each do |username|
58
- field username, :type => String
59
- end
60
- field sorcery_config.email_attribute_name, :type => String unless sorcery_config.username_attribute_names.include?(sorcery_config.email_attribute_name)
61
- field sorcery_config.crypted_password_attribute_name, :type => String
62
- field sorcery_config.salt_attribute_name, :type => String
63
- end
32
+ protected
33
+
34
+ # includes required submodules into the model class,
35
+ # which usually is called User.
36
+ def include_required_submodules!
37
+ self.class_eval do
38
+ @sorcery_config.submodules = ::Sorcery::Controller::Config.submodules
39
+ @sorcery_config.submodules.each do |mod|
40
+ begin
41
+ include Submodules.const_get(mod.to_s.split('_').map {|p| p.capitalize}.join)
42
+ rescue NameError
43
+ # don't stop on a missing submodule. Needed because some submodules are only defined
44
+ # in the controller side.
64
45
  end
46
+ end
47
+ end
48
+ end
65
49
 
66
- # defines mongo_mapper fields on the model class,
67
- def init_mongo_mapper_support!
68
- self.class_eval do
69
- sorcery_config.username_attribute_names.each do |username|
70
- key username, String
71
- end
72
- key sorcery_config.email_attribute_name, String unless sorcery_config.username_attribute_names.include?(sorcery_config.email_attribute_name)
73
- key sorcery_config.crypted_password_attribute_name, String
74
- key sorcery_config.salt_attribute_name, String
75
- end
76
- end
50
+ # defines mongoid fields on the model class,
51
+ # using 1.8.x hash syntax to perserve compatibility.
52
+ def init_mongoid_support!
53
+ self.class_eval do
54
+ sorcery_config.username_attribute_names.each do |username|
55
+ field username, :type => String
56
+ end
57
+ field sorcery_config.email_attribute_name, :type => String unless sorcery_config.username_attribute_names.include?(sorcery_config.email_attribute_name)
58
+ field sorcery_config.crypted_password_attribute_name, :type => String
59
+ field sorcery_config.salt_attribute_name, :type => String
60
+ end
61
+ end
77
62
 
78
- # add virtual password accessor and ORM callbacks.
79
- def init_orm_hooks!
80
- self.class_eval do
81
- attr_accessor @sorcery_config.password_attribute_name
82
- #attr_protected @sorcery_config.crypted_password_attribute_name, @sorcery_config.salt_attribute_name
83
- before_save :encrypt_password, :if => Proc.new { |record|
84
- record.send(sorcery_config.password_attribute_name).present?
85
- }
86
- after_save :clear_virtual_password, :if => Proc.new { |record|
87
- record.send(sorcery_config.password_attribute_name).present?
88
- }
89
- end
63
+ # defines mongo_mapper fields on the model class,
64
+ def init_mongo_mapper_support!
65
+ self.class_eval do
66
+ sorcery_config.username_attribute_names.each do |username|
67
+ key username, String
68
+ end
69
+ key sorcery_config.email_attribute_name, String unless sorcery_config.username_attribute_names.include?(sorcery_config.email_attribute_name)
70
+ key sorcery_config.crypted_password_attribute_name, String
71
+ key sorcery_config.salt_attribute_name, String
72
+ end
73
+ end
74
+
75
+ # defines datamapper fields on the model class
76
+ def init_datamapper_support!
77
+ self.class_eval do
78
+ sorcery_config.username_attribute_names.each do |username|
79
+ property username, String, :length => 255
80
+ end
81
+ unless sorcery_config.username_attribute_names.include?(sorcery_config.email_attribute_name)
82
+ property sorcery_config.email_attribute_name, String, :length => 255
83
+ end
84
+ property sorcery_config.crypted_password_attribute_name, String, :length => 255
85
+ property sorcery_config.salt_attribute_name, String, :length => 255
86
+ end
87
+ end
88
+
89
+ # add virtual password accessor and ORM callbacks.
90
+ def init_orm_hooks!
91
+ if defined?(DataMapper) and self.ancestors.include?(DataMapper::Resource)
92
+ init_datamapper_hooks!
93
+ return
94
+ end
95
+ self.class_eval do
96
+ attr_accessor @sorcery_config.password_attribute_name
97
+ #attr_protected @sorcery_config.crypted_password_attribute_name, @sorcery_config.salt_attribute_name
98
+ before_save :encrypt_password, :if => Proc.new { |record|
99
+ record.send(sorcery_config.password_attribute_name).present?
100
+ }
101
+ after_save :clear_virtual_password, :if => Proc.new { |record|
102
+ record.send(sorcery_config.password_attribute_name).present?
103
+ }
104
+ end
105
+ end
106
+
107
+ def init_datamapper_hooks!
108
+ self.class_eval do
109
+ attr_accessor @sorcery_config.password_attribute_name
110
+ before :valid? do
111
+ if self.send(sorcery_config.password_attribute_name).present?
112
+ encrypt_password
113
+ end
114
+ end
115
+ after :save do
116
+ if self.send(sorcery_config.password_attribute_name).present?
117
+ clear_virtual_password
90
118
  end
91
119
  end
92
120
  end
@@ -104,10 +132,16 @@ module Sorcery
104
132
  # returns the user if success, nil otherwise.
105
133
  def authenticate(*credentials)
106
134
  raise ArgumentError, "at least 2 arguments required" if credentials.size < 2
107
- credentials[0].downcase! if @sorcery_config.downcase_username_before_authenticating
135
+
136
+ return false if credentials[0].blank?
137
+
138
+ if @sorcery_config.downcase_username_before_authenticating
139
+ credentials[0].downcase!
140
+ end
141
+
108
142
  user = find_by_credentials(credentials)
109
143
 
110
- set_encryption_attributes()
144
+ set_encryption_attributes
111
145
 
112
146
  _salt = user.send(@sorcery_config.salt_attribute_name) if user && !@sorcery_config.salt_attribute_name.nil? && !@sorcery_config.encryption_provider.nil?
113
147
  user if user && @sorcery_config.before_authenticate.all? {|c| user.send(c)} && credentials_match?(user.send(@sorcery_config.crypted_password_attribute_name),credentials[1],_salt)
@@ -177,6 +211,10 @@ module Sorcery
177
211
  def clear_virtual_password
178
212
  config = sorcery_config
179
213
  self.send(:"#{config.password_attribute_name}=", nil)
214
+
215
+ if respond_to?(:"#{config.password_attribute_name}_confirmation=")
216
+ self.send(:"#{config.password_attribute_name}_confirmation=", nil)
217
+ end
180
218
  end
181
219
 
182
220
  # calls the requested email method on the configured mailer
@@ -230,7 +268,7 @@ module Sorcery
230
268
  def initialize
231
269
  @defaults = {
232
270
  :@submodules => [],
233
- :@username_attribute_names => [:username],
271
+ :@username_attribute_names => [:email],
234
272
  :@password_attribute_name => :password,
235
273
  :@downcase_username_before_authenticating => false,
236
274
  :@email_attribute_name => :email,
@@ -0,0 +1,42 @@
1
+ require 'oauth'
2
+
3
+ module Sorcery
4
+ module Protocols
5
+ module Oauth
6
+
7
+ def oauth_version
8
+ '1.0'
9
+ end
10
+
11
+ def get_request_token(token=nil,secret=nil)
12
+ return ::OAuth::RequestToken.new(get_consumer, token, secret) if token && secret
13
+ get_consumer.get_request_token(oauth_callback: @callback_url)
14
+ end
15
+
16
+ def authorize_url(args)
17
+ get_request_token(
18
+ args[:request_token],
19
+ args[:request_token_secret]
20
+ ).authorize_url({
21
+ oauth_callback: @callback_url
22
+ })
23
+ end
24
+
25
+ def get_access_token(args)
26
+ get_request_token(
27
+ args[:request_token],
28
+ args[:request_token_secret]
29
+ ).get_access_token({
30
+ oauth_verifier: args[:oauth_verifier]
31
+ })
32
+ end
33
+
34
+ protected
35
+
36
+ def get_consumer
37
+ ::OAuth::Consumer.new(@key, @secret, site: @site)
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,47 @@
1
+ require 'oauth2'
2
+
3
+ module Sorcery
4
+ module Protocols
5
+ module Oauth2
6
+
7
+ def oauth_version
8
+ '2.0'
9
+ end
10
+
11
+ def authorize_url(options = {})
12
+ client = build_client(options)
13
+ client.auth_code.authorize_url(
14
+ redirect_uri: @callback_url,
15
+ scope: @scope,
16
+ display: @display,
17
+ state: @state
18
+ )
19
+ end
20
+
21
+ def get_access_token(args, options = {})
22
+ client = build_client(options)
23
+ client.auth_code.get_token(
24
+ args[:code],
25
+ {
26
+ redirect_uri: @callback_url,
27
+ parse: options.delete(:parse)
28
+ },
29
+ options
30
+ )
31
+ end
32
+
33
+ def build_client(options = {})
34
+ defaults = {
35
+ site: @site,
36
+ ssl: { ca_file: Sorcery::Controller::Config.ca_file }
37
+ }
38
+ ::OAuth2::Client.new(
39
+ @key,
40
+ @secret,
41
+ defaults.merge!(options)
42
+ )
43
+ end
44
+
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,27 @@
1
+ module Sorcery
2
+ module Providers
3
+ class Base
4
+
5
+ attr_reader :access_token
6
+
7
+ attr_accessor :callback_url, :key, :original_callback_url, :secret,
8
+ :site, :state, :user_info_mapping
9
+
10
+ def has_callback?; true; end
11
+
12
+ def initialize
13
+ @user_info_mapping = {}
14
+ end
15
+
16
+ def self.name
17
+ super.gsub(/Sorcery::Providers::/, '').downcase
18
+ end
19
+
20
+ # Ensure that all descendant classes are loaded before run this
21
+ def self.descendants
22
+ ObjectSpace.each_object(Class).select { |klass| klass < self }
23
+ end
24
+
25
+ end
26
+ end
27
+ end