Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

account_controller_test.rb 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. # Redmine - project management software
  2. # Copyright (C) 2006-2017 Jean-Philippe Lang
  3. #
  4. # This program is free software; you can redistribute it and/or
  5. # modify it under the terms of the GNU General Public License
  6. # as published by the Free Software Foundation; either version 2
  7. # of the License, or (at your option) any later version.
  8. #
  9. # This program is distributed in the hope that it will be useful,
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. # GNU General Public License for more details.
  13. #
  14. # You should have received a copy of the GNU General Public License
  15. # along with this program; if not, write to the Free Software
  16. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  17. require File.expand_path('../../test_helper', __FILE__)
  18. class AccountControllerTest < Redmine::ControllerTest
  19. fixtures :users, :email_addresses, :roles
  20. def setup
  21. User.current = nil
  22. end
  23. def test_get_login
  24. get :login
  25. assert_response :success
  26. assert_select 'input[name=username]'
  27. assert_select 'input[name=password]'
  28. end
  29. def test_get_login_while_logged_in_should_redirect_to_back_url_if_present
  30. @request.session[:user_id] = 2
  31. @request.env["HTTP_REFERER"] = 'http://test.host/issues/show/1'
  32. get :login, :params => {
  33. :back_url => 'http://test.host/issues/show/1'
  34. }
  35. assert_redirected_to '/issues/show/1'
  36. assert_equal 2, @request.session[:user_id]
  37. end
  38. def test_get_login_while_logged_in_should_redirect_to_referer_without_back_url
  39. @request.session[:user_id] = 2
  40. @request.env["HTTP_REFERER"] = 'http://test.host/issues/show/1'
  41. get :login
  42. assert_redirected_to '/issues/show/1'
  43. assert_equal 2, @request.session[:user_id]
  44. end
  45. def test_get_login_while_logged_in_should_redirect_to_home_by_default
  46. @request.session[:user_id] = 2
  47. get :login
  48. assert_redirected_to '/'
  49. assert_equal 2, @request.session[:user_id]
  50. end
  51. def test_login_should_redirect_to_back_url_param
  52. # request.uri is "test.host" in test environment
  53. back_urls = [
  54. 'http://test.host/issues/show/1',
  55. 'http://test.host/',
  56. '/'
  57. ]
  58. back_urls.each do |back_url|
  59. post :login, :params => {
  60. :username => 'jsmith',
  61. :password => 'jsmith',
  62. :back_url => back_url
  63. }
  64. assert_redirected_to back_url
  65. end
  66. end
  67. def test_login_with_suburi_should_redirect_to_back_url_param
  68. @relative_url_root = Redmine::Utils.relative_url_root
  69. Redmine::Utils.relative_url_root = '/redmine'
  70. back_urls = [
  71. 'http://test.host/redmine/issues/show/1',
  72. '/redmine'
  73. ]
  74. back_urls.each do |back_url|
  75. post :login, :params => {
  76. :username => 'jsmith',
  77. :password => 'jsmith',
  78. :back_url => back_url
  79. }
  80. assert_redirected_to back_url
  81. end
  82. ensure
  83. Redmine::Utils.relative_url_root = @relative_url_root
  84. end
  85. def test_login_should_not_redirect_to_another_host
  86. back_urls = [
  87. 'http://test.foo/fake',
  88. '//test.foo/fake'
  89. ]
  90. back_urls.each do |back_url|
  91. post :login, :params => {
  92. :username => 'jsmith',
  93. :password => 'jsmith',
  94. :back_url => back_url
  95. }
  96. assert_redirected_to '/my/page'
  97. end
  98. end
  99. def test_login_with_suburi_should_not_redirect_to_another_suburi
  100. @relative_url_root = Redmine::Utils.relative_url_root
  101. Redmine::Utils.relative_url_root = '/redmine'
  102. back_urls = [
  103. 'http://test.host/',
  104. 'http://test.host/fake',
  105. 'http://test.host/fake/issues',
  106. 'http://test.host/redmine/../fake',
  107. 'http://test.host/redmine/../fake/issues',
  108. 'http://test.host/redmine/%2e%2e/fake',
  109. '//test.foo/fake',
  110. 'http://test.host//fake',
  111. 'http://test.host/\n//fake',
  112. '//bar@test.foo',
  113. '//test.foo',
  114. '////test.foo',
  115. '@test.foo',
  116. 'fake@test.foo',
  117. '.test.foo'
  118. ]
  119. back_urls.each do |back_url|
  120. post :login, :params => {
  121. :username => 'jsmith',
  122. :password => 'jsmith',
  123. :back_url => back_url
  124. }
  125. assert_redirected_to '/my/page'
  126. end
  127. ensure
  128. Redmine::Utils.relative_url_root = @relative_url_root
  129. end
  130. def test_login_with_wrong_password
  131. post :login, :params => {
  132. :username => 'admin',
  133. :password => 'bad'
  134. }
  135. assert_response :success
  136. assert_select 'div.flash.error', :text => /Invalid user or password/
  137. assert_select 'input[name=username][value=admin]'
  138. assert_select 'input[name=password]'
  139. assert_select 'input[name=password][value]', 0
  140. end
  141. def test_login_with_locked_account_should_fail
  142. User.find(2).update_attribute :status, User::STATUS_LOCKED
  143. post :login, :params => {
  144. :username => 'jsmith',
  145. :password => 'jsmith'
  146. }
  147. assert_redirected_to '/login'
  148. assert_include 'locked', flash[:error]
  149. assert_nil @request.session[:user_id]
  150. end
  151. def test_login_as_registered_user_with_manual_activation_should_inform_user
  152. User.find(2).update_attribute :status, User::STATUS_REGISTERED
  153. with_settings :self_registration => '2', :default_language => 'en' do
  154. post :login, :params => {
  155. :username => 'jsmith',
  156. :password => 'jsmith'
  157. }
  158. assert_redirected_to '/login'
  159. assert_include 'pending administrator approval', flash[:error]
  160. end
  161. end
  162. def test_login_as_registered_user_with_email_activation_should_propose_new_activation_email
  163. User.find(2).update_attribute :status, User::STATUS_REGISTERED
  164. with_settings :self_registration => '1', :default_language => 'en' do
  165. post :login, :params => {
  166. :username => 'jsmith',
  167. :password => 'jsmith'
  168. }
  169. assert_redirected_to '/login'
  170. assert_equal 2, @request.session[:registered_user_id]
  171. assert_include 'new activation email', flash[:error]
  172. end
  173. end
  174. def test_login_should_rescue_auth_source_exception
  175. source = AuthSource.create!(:name => 'Test')
  176. User.find(2).update_attribute :auth_source_id, source.id
  177. AuthSource.any_instance.stubs(:authenticate).raises(AuthSourceException.new("Something wrong"))
  178. post :login, :params => {
  179. :username => 'jsmith',
  180. :password => 'jsmith'
  181. }
  182. assert_response 500
  183. assert_select_error /Something wrong/
  184. end
  185. def test_login_should_reset_session
  186. @controller.expects(:reset_session).once
  187. post :login, :params => {
  188. :username => 'jsmith',
  189. :password => 'jsmith'
  190. }
  191. assert_response 302
  192. end
  193. def test_login_should_strip_whitespaces_from_user_name
  194. post :login, :params => {
  195. :username => ' jsmith ',
  196. :password => 'jsmith'
  197. }
  198. assert_response 302
  199. assert_equal 2, @request.session[:user_id]
  200. end
  201. def test_get_logout_should_not_logout
  202. @request.session[:user_id] = 2
  203. get :logout
  204. assert_response :success
  205. assert_equal 2, @request.session[:user_id]
  206. end
  207. def test_get_logout_with_anonymous_should_redirect
  208. get :logout
  209. assert_redirected_to '/'
  210. end
  211. def test_logout
  212. @request.session[:user_id] = 2
  213. post :logout
  214. assert_redirected_to '/'
  215. assert_nil @request.session[:user_id]
  216. end
  217. def test_logout_should_reset_session
  218. @controller.expects(:reset_session).once
  219. @request.session[:user_id] = 2
  220. post :logout
  221. assert_response 302
  222. end
  223. def test_get_register_with_registration_on
  224. with_settings :self_registration => '3' do
  225. get :register
  226. assert_response :success
  227. assert_select 'input[name=?]', 'user[password]'
  228. assert_select 'input[name=?]', 'user[password_confirmation]'
  229. end
  230. end
  231. def test_get_register_should_detect_user_language
  232. with_settings :self_registration => '3' do
  233. @request.env['HTTP_ACCEPT_LANGUAGE'] = 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3'
  234. get :register
  235. assert_response :success
  236. assert_select 'select[name=?]', 'user[language]' do
  237. assert_select 'option[value=fr][selected=selected]'
  238. end
  239. end
  240. end
  241. def test_get_register_with_registration_off_should_redirect
  242. with_settings :self_registration => '0' do
  243. get :register
  244. assert_redirected_to '/'
  245. end
  246. end
  247. def test_get_register_should_show_hide_mail_preference
  248. get :register
  249. assert_select 'input[name=?][checked=checked]', 'pref[hide_mail]'
  250. end
  251. def test_get_register_should_show_hide_mail_preference_with_setting_turned_off
  252. with_settings :default_users_hide_mail => '0' do
  253. get :register
  254. assert_select 'input[name=?]:not([checked=checked])', 'pref[hide_mail]'
  255. end
  256. end
  257. # See integration/account_test.rb for the full test
  258. def test_post_register_with_registration_on
  259. with_settings :self_registration => '3' do
  260. assert_difference 'User.count' do
  261. post :register, :params => {
  262. :user => {
  263. :login => 'register',
  264. :password => 'secret123',
  265. :password_confirmation => 'secret123',
  266. :firstname => 'John',
  267. :lastname => 'Doe',
  268. :mail => 'register@example.com'
  269. }
  270. }
  271. assert_redirected_to '/my/account'
  272. end
  273. user = User.order('id DESC').first
  274. assert_equal 'register', user.login
  275. assert_equal 'John', user.firstname
  276. assert_equal 'Doe', user.lastname
  277. assert_equal 'register@example.com', user.mail
  278. assert user.check_password?('secret123')
  279. assert user.active?
  280. end
  281. end
  282. def test_post_register_with_registration_off_should_redirect
  283. with_settings :self_registration => '0' do
  284. assert_no_difference 'User.count' do
  285. post :register, :params => {
  286. :user => {
  287. :login => 'register',
  288. :password => 'test',
  289. :password_confirmation => 'test',
  290. :firstname => 'John',
  291. :lastname => 'Doe',
  292. :mail => 'register@example.com'
  293. }
  294. }
  295. assert_redirected_to '/'
  296. end
  297. end
  298. end
  299. def test_post_register_should_create_user_with_hide_mail_preference
  300. with_settings :default_users_hide_mail => '0' do
  301. user = new_record(User) do
  302. post :register, :params => {
  303. :user => {
  304. :login => 'register',
  305. :password => 'secret123',
  306. :password_confirmation => 'secret123',
  307. :firstname => 'John',
  308. :lastname => 'Doe',
  309. :mail => 'register@example.com'
  310. },
  311. :pref => {
  312. :hide_mail => '1'
  313. }
  314. }
  315. end
  316. assert_equal true, user.pref.hide_mail
  317. end
  318. end
  319. def test_get_lost_password_should_display_lost_password_form
  320. get :lost_password
  321. assert_response :success
  322. assert_select 'input[name=mail]'
  323. end
  324. def test_lost_password_for_active_user_should_create_a_token
  325. Token.delete_all
  326. ActionMailer::Base.deliveries.clear
  327. assert_difference 'ActionMailer::Base.deliveries.size' do
  328. assert_difference 'Token.count' do
  329. post :lost_password, :params => {
  330. :mail => 'JSmith@somenet.foo'
  331. }
  332. assert_redirected_to '/login'
  333. end
  334. end
  335. token = Token.order('id DESC').first
  336. assert_equal User.find(2), token.user
  337. assert_equal 'recovery', token.action
  338. assert_select_email do
  339. assert_select "a[href=?]", "http://localhost:3000/account/lost_password?token=#{token.value}"
  340. end
  341. end
  342. def test_lost_password_with_whitespace_should_send_email_to_the_address
  343. Token.delete_all
  344. assert_difference 'ActionMailer::Base.deliveries.size' do
  345. assert_difference 'Token.count' do
  346. post :lost_password, params: {
  347. mail: ' JSmith@somenet.foo '
  348. }
  349. assert_redirected_to '/login'
  350. end
  351. end
  352. mail = ActionMailer::Base.deliveries.last
  353. assert_equal ['jsmith@somenet.foo'], mail.bcc
  354. end
  355. def test_lost_password_using_additional_email_address_should_send_email_to_the_address
  356. EmailAddress.create!(:user_id => 2, :address => 'anotherAddress@foo.bar')
  357. Token.delete_all
  358. assert_difference 'ActionMailer::Base.deliveries.size' do
  359. assert_difference 'Token.count' do
  360. post :lost_password, :params => {
  361. :mail => 'ANOTHERaddress@foo.bar'
  362. }
  363. assert_redirected_to '/login'
  364. end
  365. end
  366. mail = ActionMailer::Base.deliveries.last
  367. assert_equal ['anotherAddress@foo.bar'], mail.bcc
  368. end
  369. def test_lost_password_for_unknown_user_should_fail
  370. Token.delete_all
  371. assert_no_difference 'Token.count' do
  372. post :lost_password, :params => {
  373. :mail => 'invalid@somenet.foo'
  374. }
  375. assert_response :success
  376. end
  377. end
  378. def test_lost_password_for_non_active_user_should_fail
  379. Token.delete_all
  380. assert User.find(2).lock!
  381. assert_no_difference 'Token.count' do
  382. post :lost_password, :params => {
  383. :mail => 'JSmith@somenet.foo'
  384. }
  385. assert_redirected_to '/account/lost_password'
  386. end
  387. end
  388. def test_lost_password_for_user_who_cannot_change_password_should_fail
  389. User.any_instance.stubs(:change_password_allowed?).returns(false)
  390. assert_no_difference 'Token.count' do
  391. post :lost_password, :params => {
  392. :mail => 'JSmith@somenet.foo'
  393. }
  394. assert_response :success
  395. end
  396. end
  397. def test_get_lost_password_with_token_should_redirect_with_token_in_session
  398. user = User.find(2)
  399. token = Token.create!(:action => 'recovery', :user => user)
  400. get :lost_password, :params => {
  401. :token => token.value
  402. }
  403. assert_redirected_to '/account/lost_password'
  404. assert_equal token.value, request.session[:password_recovery_token]
  405. end
  406. def test_get_lost_password_with_token_in_session_should_display_the_password_recovery_form
  407. user = User.find(2)
  408. token = Token.create!(:action => 'recovery', :user => user)
  409. request.session[:password_recovery_token] = token.value
  410. get :lost_password
  411. assert_response :success
  412. assert_select 'input[type=hidden][name=token][value=?]', token.value
  413. end
  414. def test_get_lost_password_with_invalid_token_should_redirect
  415. get :lost_password, :params => {
  416. :token => "abcdef"
  417. }
  418. assert_redirected_to '/'
  419. end
  420. def test_post_lost_password_with_token_should_change_the_user_password
  421. ActionMailer::Base.deliveries.clear
  422. user = User.find(2)
  423. token = Token.create!(:action => 'recovery', :user => user)
  424. post :lost_password, :params => {
  425. :token => token.value,
  426. :new_password => 'newpass123',
  427. :new_password_confirmation => 'newpass123'
  428. }
  429. assert_redirected_to '/login'
  430. user.reload
  431. assert user.check_password?('newpass123')
  432. assert_nil Token.find_by_id(token.id), "Token was not deleted"
  433. assert_not_nil (mail = ActionMailer::Base.deliveries.last)
  434. assert_select_email do
  435. assert_select 'a[href^=?]', 'http://localhost:3000/my/password', :text => 'Change password'
  436. end
  437. end
  438. def test_post_lost_password_with_token_for_non_active_user_should_fail
  439. user = User.find(2)
  440. token = Token.create!(:action => 'recovery', :user => user)
  441. user.lock!
  442. post :lost_password, :params => {
  443. :token => token.value,
  444. :new_password => 'newpass123',
  445. :new_password_confirmation => 'newpass123'
  446. }
  447. assert_redirected_to '/'
  448. assert ! user.check_password?('newpass123')
  449. end
  450. def test_post_lost_password_with_token_and_password_confirmation_failure_should_redisplay_the_form
  451. user = User.find(2)
  452. token = Token.create!(:action => 'recovery', :user => user)
  453. post :lost_password, :params => {
  454. :token => token.value,
  455. :new_password => 'newpass',
  456. :new_password_confirmation => 'wrongpass'
  457. }
  458. assert_response :success
  459. assert_not_nil Token.find_by_id(token.id), "Token was deleted"
  460. assert_select 'input[type=hidden][name=token][value=?]', token.value
  461. end
  462. def test_post_lost_password_with_token_should_not_accept_same_password_if_user_must_change_password
  463. user = User.find(2)
  464. user.password = "originalpassword"
  465. user.must_change_passwd = true
  466. user.save!
  467. token = Token.create!(:action => 'recovery', :user => user)
  468. post :lost_password, :params => {
  469. :token => token.value,
  470. :new_password => 'originalpassword',
  471. :new_password_confirmation => 'originalpassword'
  472. }
  473. assert_response :success
  474. assert_not_nil Token.find_by_id(token.id), "Token was deleted"
  475. assert_select '.flash', :text => /The new password must be different/
  476. assert_select 'input[type=hidden][name=token][value=?]', token.value
  477. end
  478. def test_post_lost_password_with_token_should_reset_must_change_password
  479. user = User.find(2)
  480. user.password = "originalpassword"
  481. user.must_change_passwd = true
  482. user.save!
  483. token = Token.create!(:action => 'recovery', :user => user)
  484. post :lost_password, :params => {
  485. :token => token.value,
  486. :new_password => 'newpassword',
  487. :new_password_confirmation => 'newpassword'
  488. }
  489. assert_redirected_to '/login'
  490. assert_equal false, user.reload.must_change_passwd
  491. end
  492. def test_post_lost_password_with_invalid_token_should_redirect
  493. post :lost_password, :params => {
  494. :token => "abcdef",
  495. :new_password => 'newpass',
  496. :new_password_confirmation => 'newpass'
  497. }
  498. assert_redirected_to '/'
  499. end
  500. def test_activation_email_should_send_an_activation_email
  501. User.find(2).update_attribute :status, User::STATUS_REGISTERED
  502. @request.session[:registered_user_id] = 2
  503. with_settings :self_registration => '1' do
  504. assert_difference 'ActionMailer::Base.deliveries.size' do
  505. get :activation_email
  506. assert_redirected_to '/login'
  507. end
  508. end
  509. end
  510. def test_activation_email_without_session_data_should_fail
  511. User.find(2).update_attribute :status, User::STATUS_REGISTERED
  512. with_settings :self_registration => '1' do
  513. assert_no_difference 'ActionMailer::Base.deliveries.size' do
  514. get :activation_email
  515. assert_redirected_to '/'
  516. end
  517. end
  518. end
  519. end