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
@@ -1,17 +1,9 @@
1
1
  class SorceryResetPassword < ActiveRecord::Migration
2
- def self.up
2
+ def change
3
3
  add_column :<%= model_class_name.tableize %>, :reset_password_token, :string, :default => nil
4
4
  add_column :<%= model_class_name.tableize %>, :reset_password_token_expires_at, :datetime, :default => nil
5
5
  add_column :<%= model_class_name.tableize %>, :reset_password_email_sent_at, :datetime, :default => nil
6
-
7
- add_index :<%= model_class_name.tableize %>, :reset_password_token
8
- end
9
6
 
10
- def self.down
11
- remove_index :<%= model_class_name.tableize %>, :reset_password_token
12
-
13
- remove_column :<%= model_class_name.tableize %>, :reset_password_email_sent_at
14
- remove_column :<%= model_class_name.tableize %>, :reset_password_token_expires_at
15
- remove_column :<%= model_class_name.tableize %>, :reset_password_token
7
+ add_index :<%= model_class_name.tableize %>, :reset_password_token
16
8
  end
17
9
  end
@@ -1,17 +1,9 @@
1
1
  class SorceryUserActivation < ActiveRecord::Migration
2
- def self.up
2
+ def change
3
3
  add_column :<%= model_class_name.tableize %>, :activation_state, :string, :default => nil
4
4
  add_column :<%= model_class_name.tableize %>, :activation_token, :string, :default => nil
5
5
  add_column :<%= model_class_name.tableize %>, :activation_token_expires_at, :datetime, :default => nil
6
-
7
- add_index :<%= model_class_name.tableize %>, :activation_token
8
- end
9
6
 
10
- def self.down
11
- remove_index :<%= model_class_name.tableize %>, :activation_token
12
-
13
- remove_column :<%= model_class_name.tableize %>, :activation_token_expires_at
14
- remove_column :<%= model_class_name.tableize %>, :activation_token
15
- remove_column :<%= model_class_name.tableize %>, :activation_state
7
+ add_index :<%= model_class_name.tableize %>, :activation_token
16
8
  end
17
9
  end
@@ -6,21 +6,38 @@ module Sorcery
6
6
  module External
7
7
  def self.included(base)
8
8
  base.send(:include, InstanceMethods)
9
+
10
+ require 'sorcery/providers/base'
11
+ require 'sorcery/providers/facebook'
12
+ require 'sorcery/providers/twitter'
13
+ require 'sorcery/providers/vk'
14
+ require 'sorcery/providers/linkedin'
15
+ require 'sorcery/providers/liveid'
16
+ require 'sorcery/providers/xing'
17
+ require 'sorcery/providers/github'
18
+ require 'sorcery/providers/google'
19
+
9
20
  Config.module_eval do
10
21
  class << self
11
- attr_reader :external_providers # external providers like twitter.
12
- attr_accessor :ca_file # path to ca_file. By default use a internal ca-bundle.crt.
13
-
14
- def merge_external_defaults!
15
- @defaults.merge!(:@external_providers => [],
16
- :@ca_file => File.join(File.expand_path(File.dirname(__FILE__)), 'external/protocols/certs/ca-bundle.crt'))
17
- end
22
+ attr_reader :external_providers
23
+ attr_accessor :ca_file
18
24
 
19
25
  def external_providers=(providers)
20
- providers.each do |provider|
21
- include Providers.const_get(provider.to_s.split("_").map {|p| p.capitalize}.join(""))
26
+ @external_providers = providers
27
+
28
+ providers.each do |name|
29
+ class_eval <<-E
30
+ def self.#{name}
31
+ @#{name} ||= Sorcery::Providers.const_get('#{name}'.to_s.capitalize).new
32
+ end
33
+ E
22
34
  end
23
35
  end
36
+
37
+ def merge_external_defaults!
38
+ @defaults.merge!(:@external_providers => [],
39
+ :@ca_file => File.join(File.expand_path(File.dirname(__FILE__)), '../../protocols/certs/ca-bundle.crt'))
40
+ end
24
41
  end
25
42
  merge_external_defaults!
26
43
  end
@@ -31,18 +48,17 @@ module Sorcery
31
48
 
32
49
  # save the singleton ProviderClient instance into @provider
33
50
  def sorcery_get_provider(provider_name)
34
- allowed = %w(facebook github google linkedin liveid twitter vk xing)
35
- return unless allowed.include?(provider_name.to_s)
36
-
51
+ return unless Config.external_providers.include?(provider_name.to_sym)
37
52
  Config.send(provider_name.to_sym)
38
53
  end
39
54
 
40
55
  # get the login URL from the provider, if applicable. Returns nil if the provider
41
56
  # does not provide a login URL. (as of v0.8.1 all providers provide a login URL)
42
- def sorcery_login_url(provider_name)
57
+ def sorcery_login_url(provider_name, args = {})
43
58
  @provider = sorcery_get_provider provider_name
44
59
  sorcery_fixup_callback_url @provider
45
60
  if @provider.respond_to?(:login_url) && @provider.has_callback?
61
+ @provider.state = args[:state] if args[:state]
46
62
  return @provider.login_url(params, session)
47
63
  else
48
64
  return nil
@@ -89,22 +105,22 @@ module Sorcery
89
105
  # sends user to authenticate at the provider's website.
90
106
  # after authentication the user is redirected to the callback defined in the provider config
91
107
  def login_at(provider_name, args = {})
92
- redirect_to sorcery_login_url(provider_name)
108
+ redirect_to sorcery_login_url(provider_name, args)
93
109
  end
94
110
 
95
111
  # tries to login the user from provider's callback
96
- def login_from(provider_name)
112
+ def login_from(provider_name, should_remember = false)
97
113
  sorcery_fetch_user_hash provider_name
98
-
114
+
99
115
  if user = user_class.load_from_provider(provider_name, @user_hash[:uid].to_s)
100
116
  # we found the user.
101
117
  # clear the session
102
118
  return_to_url = session[:return_to_url]
103
- reset_session
119
+ reset_sorcery_session
104
120
  session[:return_to_url] = return_to_url
105
121
 
106
122
  # sign in the user
107
- auto_login(user)
123
+ auto_login(user, should_remember)
108
124
  after_login!(user)
109
125
 
110
126
  # return the user
@@ -118,9 +134,9 @@ module Sorcery
118
134
  config = user_class.sorcery_config
119
135
 
120
136
  # first check to see if user has a particular authentication already
121
- unless (current_user.send(config.authentications_class.to_s.downcase.pluralize).send("find_by_#{config.provider_attribute_name}_and_#{config.provider_uid_attribute_name}", provider_name, @user_hash[:uid].to_s))
122
- user = current_user.send(config.authentications_class.to_s.downcase.pluralize).build(config.provider_uid_attribute_name => @user_hash[:uid], config.provider_attribute_name => provider_name.to_s)
123
- user.save(:validate => false)
137
+ unless (current_user.send(config.authentications_class.name.underscore.pluralize).send("find_by_#{config.provider_attribute_name}_and_#{config.provider_uid_attribute_name}", provider_name, @user_hash[:uid].to_s))
138
+ user = current_user.send(config.authentications_class.name.underscore.pluralize).build(config.provider_uid_attribute_name => @user_hash[:uid], config.provider_attribute_name => provider_name.to_s)
139
+ user.sorcery_save(:validate => false)
124
140
  else
125
141
  user = false
126
142
  end
@@ -143,7 +159,7 @@ module Sorcery
143
159
  session[:incomplete_user] = {
144
160
  :provider => {config.provider_uid_attribute_name => @user_hash[:uid], config.provider_attribute_name => provider_name},
145
161
  :user_hash => attrs
146
- } unless user.save
162
+ } unless user.sorcery_save
147
163
 
148
164
  return user
149
165
  end
@@ -180,7 +196,7 @@ module Sorcery
180
196
  return false unless yield @user
181
197
  end
182
198
 
183
- @user.save(:validate => false)
199
+ @user.sorcery_save(:validate => false)
184
200
  user_class.sorcery_config.authentications_class.create!({config.authentications_user_id_attribute_name => @user.id, config.provider_attribute_name => provider_name, config.provider_uid_attribute_name => @user_hash[:uid]})
185
201
  end
186
202
  @user
@@ -31,7 +31,7 @@ module Sorcery
31
31
 
32
32
  # Clears the cookie and clears the token from the db.
33
33
  def forget_me!
34
- @current_user.forget_me!
34
+ current_user.forget_me!
35
35
  cookies.delete(:remember_me_token, :domain => Config.cookie_domain)
36
36
  end
37
37
 
@@ -37,8 +37,8 @@ module Sorcery
37
37
  # To be used as a before_filter, before require_login
38
38
  def validate_session
39
39
  session_to_use = Config.session_timeout_from_last_action ? session[:last_action_time] : session[:login_time]
40
- if session_to_use && (Time.now.in_time_zone - session_to_use > Config.session_timeout)
41
- reset_session
40
+ if session_to_use && (Time.now.in_time_zone - session_to_use.to_time > Config.session_timeout)
41
+ reset_sorcery_session
42
42
  @current_user = nil
43
43
  else
44
44
  session[:last_action_time] = Time.now.in_time_zone
@@ -5,7 +5,7 @@ module Sorcery
5
5
  include InstanceMethods
6
6
  Config.submodules.each do |mod|
7
7
  begin
8
- include Submodules.const_get(mod.to_s.split("_").map {|p| p.capitalize}.join(""))
8
+ include Submodules.const_get(mod.to_s.split('_').map { |p| p.capitalize }.join)
9
9
  rescue NameError
10
10
  # don't stop on a missing submodule.
11
11
  end
@@ -33,7 +33,7 @@ module Sorcery
33
33
  user = user_class.authenticate(*credentials)
34
34
  if user
35
35
  old_session = session.dup.to_hash
36
- reset_session # protect from session fixation attacks
36
+ reset_sorcery_session
37
37
  old_session.each_pair do |k,v|
38
38
  session[k.to_sym] = v
39
39
  end
@@ -48,12 +48,20 @@ module Sorcery
48
48
  end
49
49
  end
50
50
 
51
+ # put this into the catch block to rescue undefined method `destroy_session'
52
+ # hotfix for https://github.com/NoamB/sorcery/issues/464
53
+ # can be removed when Rails 4.1 is out
54
+ def reset_sorcery_session
55
+ reset_session # protect from session fixation attacks
56
+ rescue NoMethodError
57
+ end
58
+
51
59
  # Resets the session and runs hooks before and after.
52
60
  def logout
53
61
  if logged_in?
54
62
  @current_user = current_user if @current_user.nil?
55
63
  before_logout!(@current_user)
56
- reset_session
64
+ reset_sorcery_session
57
65
  after_logout!
58
66
  @current_user = nil
59
67
  end
@@ -64,9 +72,12 @@ module Sorcery
64
72
  end
65
73
 
66
74
  # attempts to auto-login from the sources defined (session, basic_auth, cookie, etc.)
67
- # returns the logged in user if found, false if not (using old restful-authentication trick, nil != false).
75
+ # returns the logged in user if found, nil if not
68
76
  def current_user
69
- @current_user ||= login_from_session || login_from_other_sources unless @current_user == false
77
+ unless defined?(@current_user)
78
+ @current_user = login_from_session || login_from_other_sources || nil
79
+ end
80
+ @current_user
70
81
  end
71
82
 
72
83
  def current_user=(user)
@@ -91,7 +102,7 @@ module Sorcery
91
102
  #
92
103
  # @param [<User-Model>] user the user instance.
93
104
  # @return - do not depend on the return value.
94
- def auto_login(user)
105
+ def auto_login(user, should_remember = false)
95
106
  session[:user_id] = user.id
96
107
  @current_user = user
97
108
  end
@@ -115,11 +126,7 @@ module Sorcery
115
126
  end
116
127
 
117
128
  def login_from_session
118
- @current_user = (user_class.find(session[:user_id]) if session[:user_id]) || false
119
- rescue => exception
120
- return false if defined?(Mongoid) and exception.is_a?(Mongoid::Errors::DocumentNotFound)
121
- return false if defined?(ActiveRecord) and exception.is_a?(ActiveRecord::RecordNotFound)
122
- raise exception
129
+ @current_user = (user_class.find_by_id(session[:user_id]) if session[:user_id]) || nil
123
130
  end
124
131
 
125
132
  def after_login!(user, credentials = [])
@@ -19,12 +19,17 @@ module Sorcery
19
19
  def update_single_attribute(name, value)
20
20
  update_many_attributes(name => value)
21
21
  end
22
+
23
+ def sorcery_save(options = {})
24
+ mthd = options.delete(:raise_on_failure) ? :save! : :save
25
+ self.send(mthd, options)
26
+ end
22
27
  end
23
28
 
24
29
  module ClassMethods
25
30
  def column_name(attribute)
26
31
  return "LOWER(#{attribute})" if (@sorcery_config.downcase_username_before_authenticating)
27
- return "#{attribute}"
32
+ attribute.to_s
28
33
  end
29
34
 
30
35
  def find_by_credentials(credentials)
@@ -37,7 +42,7 @@ module Sorcery
37
42
  end
38
43
 
39
44
  def get_current_users
40
- config = sorcery_config
45
+ config = @sorcery_config
41
46
  where("#{config.last_activity_at_attribute_name} IS NOT NULL") \
42
47
  .where("#{config.last_logout_at_attribute_name} IS NULL OR #{config.last_activity_at_attribute_name} > #{config.last_logout_at_attribute_name}") \
43
48
  .where("#{config.last_activity_at_attribute_name} > ? ", config.activity_timeout.seconds.ago.utc.to_s(:db))
@@ -0,0 +1,123 @@
1
+ module Sorcery
2
+ module Model
3
+ module Adapters
4
+ module DataMapper
5
+ def self.included(klass)
6
+ klass.extend ClassMethods
7
+ klass.send(:include, InstanceMethods)
8
+ end
9
+
10
+ module InstanceMethods
11
+ def increment(attr)
12
+ self[attr] ||= 0
13
+ self[attr] += 1
14
+ self
15
+ end
16
+
17
+ def update_many_attributes(attrs)
18
+ attrs.each do |name, value|
19
+ value = value.utc if value.is_a?(ActiveSupport::TimeWithZone)
20
+ self.send(:"#{name}=", value)
21
+ end
22
+ self.class.get(self.id).update(attrs)
23
+ end
24
+
25
+ def update_single_attribute(name, value)
26
+ update_many_attributes(name => value)
27
+ end
28
+
29
+ def sorcery_save(options = {})
30
+ if options.key?(:validate) && ! options[:validate]
31
+ save!
32
+ else
33
+ save
34
+ end
35
+ end
36
+ end
37
+
38
+ module ClassMethods
39
+ def find(id)
40
+ get(id)
41
+ end
42
+
43
+ def delete_all
44
+ destroy
45
+ end
46
+
47
+ # NOTE
48
+ # DM Adapter dependent
49
+ # DM creates MySQL tables case insensitive by default
50
+ # http://datamapper.lighthouseapp.com/projects/20609-datamapper/tickets/1105
51
+ def find_by_credentials(credentials)
52
+ credential = credentials[0].dup
53
+ credential.downcase! if @sorcery_config.downcase_username_before_authenticating
54
+ @sorcery_config.username_attribute_names.each do |name|
55
+ @user = first(name => credential)
56
+ break if @user
57
+ end
58
+ !!@user ? get(@user.id) : nil
59
+ end
60
+
61
+ def find_by_provider_and_uid(provider, uid)
62
+ @user_klass ||= ::Sorcery::Controller::Config.user_class.to_s.constantize
63
+ user = first(@user_klass.sorcery_config.provider_attribute_name => provider, @user_klass.sorcery_config.provider_uid_attribute_name => uid)
64
+ !!user ? get(user.id) : nil
65
+ end
66
+
67
+ def find_by_id(id)
68
+ find(id)
69
+ rescue ::DataMapper::ObjectNotFoundError
70
+ nil
71
+ end
72
+
73
+ def find_by_activation_token(token)
74
+ user = first(sorcery_config.activation_token_attribute_name => token)
75
+ !!user ? get(user.id) : nil
76
+ end
77
+
78
+ def find_by_remember_me_token(token)
79
+ user = first(sorcery_config.remember_me_token_attribute_name => token)
80
+ !!user ? get(user.id) : nil
81
+ end
82
+
83
+ def find_by_username(username)
84
+ user = nil
85
+ sorcery_config.username_attribute_names.each do |name|
86
+ user = first(name => username)
87
+ break if user
88
+ end
89
+ !!user ? get(user.id) : nil
90
+ end
91
+
92
+ def transaction(&blk)
93
+ tap(&blk)
94
+ end
95
+
96
+ def find_by_sorcery_token(token_attr_name, token)
97
+ user = first(token_attr_name => token)
98
+ !!user ? get(user.id) : nil
99
+ end
100
+
101
+ def find_by_email(email)
102
+ user = first(sorcery_config.email_attribute_name => email)
103
+ !!user ? get(user.id) : nil
104
+ end
105
+
106
+ # NOTE
107
+ # DM Adapter dependent
108
+ def get_current_users
109
+ unless self.repository.adapter.is_a?(::DataMapper::Adapters::MysqlAdapter)
110
+ raise 'Unsupported DataMapper Adapter'
111
+ end
112
+ config = sorcery_config
113
+ ret = all(config.last_logout_at_attribute_name => nil) |
114
+ all(config.last_activity_at_attribute_name.gt => config.last_logout_at_attribute_name)
115
+ ret = ret.all(config.last_activity_at_attribute_name.not => nil)
116
+ ret = ret.all(config.last_activity_at_attribute_name.gt => config.activity_timeout.seconds.ago.utc)
117
+ ret
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -5,15 +5,19 @@ module Sorcery
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  included do
8
- include Sorcery::Model
8
+ extend Sorcery::Model
9
9
  end
10
10
 
11
11
  def increment(attr)
12
12
  self.class.increment(id, attr => 1)
13
13
  end
14
14
 
15
- def save!(options = {})
16
- save(options)
15
+ def sorcery_save(options = {})
16
+ if options.delete(:raise_on_failure) && options[:validate] != false
17
+ save! options
18
+ else
19
+ save options
20
+ end
17
21
  end
18
22
 
19
23
  def update_many_attributes(attrs)
@@ -22,7 +26,7 @@ module Sorcery
22
26
 
23
27
  module ClassMethods
24
28
  def credential_regex(credential)
25
- return { :$regex => /^#{credential}$/i } if (@sorcery_config.downcase_username_before_authenticating)
29
+ return { :$regex => /^#{Regexp.escape(credential)}$/i } if (@sorcery_config.downcase_username_before_authenticating)
26
30
  return credential
27
31
  end
28
32
 
@@ -2,14 +2,9 @@ module Sorcery
2
2
  module Model
3
3
  module Adapters
4
4
  module Mongoid
5
- def self.included(klass)
6
- klass.extend ClassMethods
7
- klass.send(:include, InstanceMethods)
8
- end
9
-
10
5
  module InstanceMethods
11
6
  def increment(attr)
12
- self.inc(attr,1)
7
+ self.inc(attr, 1)
13
8
  end
14
9
 
15
10
  def update_many_attributes(attrs)
@@ -23,12 +18,17 @@ module Sorcery
23
18
  def update_single_attribute(name, value)
24
19
  update_many_attributes(name => value)
25
20
  end
21
+
22
+ def sorcery_save(options = {})
23
+ mthd = options.delete(:raise_on_failure) ? :save! : :save
24
+ self.send(mthd, options)
25
+ end
26
26
  end
27
27
 
28
28
  module ClassMethods
29
29
  def credential_regex(credential)
30
- return { :$regex => /^#{credential}$/i } if (@sorcery_config.downcase_username_before_authenticating)
31
- return credential
30
+ return { :$regex => /^#{Regexp.escape(credential)}$/i } if (@sorcery_config.downcase_username_before_authenticating)
31
+ credential
32
32
  end
33
33
 
34
34
  def find_by_credentials(credentials)
@@ -29,6 +29,13 @@ module Sorcery
29
29
  end
30
30
 
31
31
  base.sorcery_config.after_config << :define_activity_logging_mongoid_fields if defined?(Mongoid) and base.ancestors.include?(Mongoid::Document)
32
+ if defined?(DataMapper) and base.ancestors.include?(DataMapper::Resource)
33
+ # NOTE raise exception if data-store is not supported
34
+ unless base.repository.adapter.is_a?(DataMapper::Adapters::MysqlAdapter)
35
+ raise 'Unsupported DataMapper Adapter'
36
+ end
37
+ base.sorcery_config.after_config << :define_activity_logging_datamapper_fields
38
+ end
32
39
  end
33
40
 
34
41
  module ClassMethods
@@ -46,6 +53,23 @@ module Sorcery
46
53
  field sorcery_config.last_activity_at_attribute_name, :type => Time
47
54
  field sorcery_config.last_login_from_ip_address_name, :type => String
48
55
  end
56
+
57
+ def define_activity_logging_datamapper_fields
58
+ property sorcery_config.last_login_at_attribute_name, Time
59
+ property sorcery_config.last_logout_at_attribute_name, Time
60
+ property sorcery_config.last_activity_at_attribute_name, Time
61
+ property sorcery_config.last_login_from_ip_address_name, String
62
+ # Workaround local timezone retrieval problem NOTE dm-core issue #193
63
+ [sorcery_config.last_login_at_attribute_name,
64
+ sorcery_config.last_logout_at_attribute_name,
65
+ sorcery_config.last_activity_at_attribute_name].each do |sym|
66
+ alias_method "orig_#{sym}", sym
67
+ define_method(sym) do
68
+ t = send("orig_#{sym}")
69
+ t && Time.new(t.year, t.month, t.day, t.hour, t.min, t.sec, 0)
70
+ end
71
+ end
72
+ end
49
73
  end
50
74
  end
51
75
  end
@@ -39,6 +39,9 @@ module Sorcery
39
39
  if defined?(MongoMapper) and base.ancestors.include?(MongoMapper::Document)
40
40
  base.sorcery_config.after_config << :define_brute_force_protection_mongo_mapper_fields
41
41
  end
42
+ if defined?(DataMapper) and base.ancestors.include?(DataMapper::Resource)
43
+ base.sorcery_config.after_config << :define_brute_force_protection_datamapper_fields
44
+ end
42
45
  base.extend(ClassMethods)
43
46
  base.send(:include, InstanceMethods)
44
47
  end
@@ -63,6 +66,19 @@ module Sorcery
63
66
  key sorcery_config.lock_expires_at_attribute_name, Time
64
67
  key sorcery_config.unlock_token_attribute_name, String
65
68
  end
69
+
70
+ def define_brute_force_protection_datamapper_fields
71
+ property sorcery_config.failed_logins_count_attribute_name, Integer, :default => 0
72
+ property sorcery_config.lock_expires_at_attribute_name, Time
73
+ property sorcery_config.unlock_token_attribute_name, String
74
+ [sorcery_config.lock_expires_at_attribute_name].each do |sym|
75
+ alias_method "orig_#{sym}", sym
76
+ define_method(sym) do
77
+ t = send("orig_#{sym}")
78
+ t && Time.new(t.year, t.month, t.day, t.hour, t.min, t.sec, 0)
79
+ end
80
+ end
81
+ end
66
82
  end
67
83
 
68
84
  module InstanceMethods
@@ -82,8 +98,8 @@ module Sorcery
82
98
  def unlock!
83
99
  config = sorcery_config
84
100
  attributes = {config.lock_expires_at_attribute_name => nil,
85
- config.failed_logins_count_attribute_name => 0}
86
- attributes[config.unlock_token_attribute_name] = nil unless config.unlock_token_mailer_disabled or config.unlock_token_mailer.nil?
101
+ config.failed_logins_count_attribute_name => 0,
102
+ config.unlock_token_attribute_name => nil}
87
103
  self.update_many_attributes(attributes)
88
104
  end
89
105
 
@@ -91,14 +107,12 @@ module Sorcery
91
107
 
92
108
  def lock!
93
109
  config = sorcery_config
94
- attributes = {config.lock_expires_at_attribute_name => Time.now.in_time_zone + config.login_lock_time_period}
110
+ attributes = {config.lock_expires_at_attribute_name => Time.now.in_time_zone + config.login_lock_time_period,
111
+ config.unlock_token_attribute_name => TemporaryToken.generate_random_token}
112
+ self.update_many_attributes(attributes)
95
113
 
96
114
  unless config.unlock_token_mailer_disabled || config.unlock_token_mailer.nil?
97
- attributes[config.unlock_token_attribute_name] = TemporaryToken.generate_random_token
98
- self.update_many_attributes(attributes)
99
115
  send_unlock_token_email!
100
- else
101
- self.update_many_attributes(attributes)
102
116
  end
103
117
  end
104
118
 
@@ -108,7 +122,7 @@ module Sorcery
108
122
  end
109
123
 
110
124
  def send_unlock_token_email!
111
- generic_send_email(:unlock_token_email_method_name, :unlock_token_mailer) unless sorcery_config.unlock_token_email_method_name.nil? or sorcery_config.unlock_token_mailer_disabled == true
125
+ generic_send_email(:unlock_token_email_method_name, :unlock_token_mailer) unless sorcery_config.unlock_token_email_method_name.nil?
112
126
  end
113
127
 
114
128
  # Prevents a locked user from logging in, and unlocks users that expired their lock time.
@@ -12,7 +12,7 @@ module Sorcery
12
12
  :remember_me_for # how long in seconds to remember.
13
13
 
14
14
  end
15
-
15
+
16
16
  base.sorcery_config.instance_eval do
17
17
  @defaults.merge!(:@remember_me_token_attribute_name => :remember_me_token,
18
18
  :@remember_me_token_expires_at_attribute_name => :remember_me_token_expires_at,
@@ -20,14 +20,17 @@ module Sorcery
20
20
 
21
21
  reset!
22
22
  end
23
-
23
+
24
24
  base.send(:include, InstanceMethods)
25
25
 
26
26
  base.sorcery_config.after_config << :define_remember_me_mongoid_fields if defined?(Mongoid) and base.ancestors.include?(Mongoid::Document)
27
27
  if defined?(MongoMapper) and base.ancestors.include?(MongoMapper::Document)
28
28
  base.sorcery_config.after_config << :define_remember_me_mongo_mapper_fields
29
29
  end
30
-
30
+ if defined?(DataMapper) and base.ancestors.include?(DataMapper::Resource)
31
+ base.sorcery_config.after_config << :define_remember_me_datamapper_fields
32
+ end
33
+
31
34
  base.extend(ClassMethods)
32
35
  end
33
36
 
@@ -43,6 +46,18 @@ module Sorcery
43
46
  key sorcery_config.remember_me_token_attribute_name, String
44
47
  key sorcery_config.remember_me_token_expires_at_attribute_name, Time
45
48
  end
49
+
50
+ def define_remember_me_datamapper_fields
51
+ property sorcery_config.remember_me_token_attribute_name, String
52
+ property sorcery_config.remember_me_token_expires_at_attribute_name, Time
53
+ [sorcery_config.remember_me_token_expires_at_attribute_name].each do |sym|
54
+ alias_method "orig_#{sym}", sym
55
+ define_method(sym) do
56
+ t = send("orig_#{sym}")
57
+ t && Time.new(t.year, t.month, t.day, t.hour, t.min, t.sec, 0)
58
+ end
59
+ end
60
+ end
46
61
  end
47
62
 
48
63
  module InstanceMethods
@@ -63,4 +78,4 @@ module Sorcery
63
78
  end
64
79
  end
65
80
  end
66
- end
81
+ end