]> git.openstreetmap.org Git - rails.git/commitdiff
Merge remote-tracking branch 'upstream/pull/3349'
authorTom Hughes <tom@compton.nu>
Wed, 27 Oct 2021 21:35:37 +0000 (22:35 +0100)
committerTom Hughes <tom@compton.nu>
Wed, 27 Oct 2021 21:35:37 +0000 (22:35 +0100)
Gemfile.lock
app/controllers/browse_controller.rb
app/controllers/concerns/session_methods.rb
app/controllers/users_controller.rb
config/locales/ca.yml
config/locales/fa.yml
config/locales/fy.yml
config/locales/ru.yml
test/integration/user_login_test.rb

index 1551295ddd2ce2a8f25afdf62ca7d05a591c54d2..e712649382e1e1cee0a8d946211f8d0123c063ec 100644 (file)
@@ -77,8 +77,8 @@ GEM
     autoprefixer-rails (10.3.3.0)
       execjs (~> 2)
     aws-eventstream (1.2.0)
-    aws-partitions (1.516.0)
-    aws-sdk-core (3.121.2)
+    aws-partitions (1.519.0)
+    aws-sdk-core (3.121.3)
       aws-eventstream (~> 1, >= 1.0.2)
       aws-partitions (~> 1, >= 1.239.0)
       aws-sigv4 (~> 1.1)
@@ -123,8 +123,9 @@ GEM
     cancancan (3.3.0)
     canonical-rails (0.2.12)
       rails (>= 4.1, < 6.2)
-    capybara (3.35.3)
+    capybara (3.36.0)
       addressable
+      matrix
       mini_mime (>= 0.1.3)
       nokogiri (~> 1.8)
       rack (>= 1.6.0)
@@ -143,7 +144,7 @@ GEM
     crack (0.4.5)
       rexml
     crass (1.0.6)
-    dalli (3.0.2)
+    dalli (3.0.3)
     debug_inspector (1.1.0)
     deep_merge (1.2.1)
     delayed_job (4.1.9)
@@ -240,10 +241,10 @@ GEM
       concurrent-ruby (~> 1.0)
     i18n-js (3.9.0)
       i18n (>= 0.6.6)
-    image_optim (0.31.0)
+    image_optim (0.31.1)
       exifr (~> 1.2, >= 1.2.2)
       fspath (~> 3.0)
-      image_size (>= 1.5, < 3)
+      image_size (>= 1.5, < 4)
       in_threads (~> 1.3)
       progress (~> 3.0, >= 3.0.1)
     image_optim_rails (0.4.3)
@@ -253,7 +254,7 @@ GEM
     image_processing (1.12.1)
       mini_magick (>= 4.9.5, < 5)
       ruby-vips (>= 2.0.17, < 3)
-    image_size (2.1.2)
+    image_size (3.0.1)
     in_threads (1.5.4)
     jbuilder (2.11.2)
       activesupport (>= 5.0.0)
@@ -262,7 +263,7 @@ GEM
       rails-dom-testing (>= 1, < 3)
       railties (>= 4.2.0)
       thor (>= 0.14, < 2.0)
-    json (2.6.0)
+    json (2.6.1)
     jwt (2.3.0)
     kgio (2.11.4)
     kramdown (2.3.1)
@@ -280,6 +281,7 @@ GEM
     mail (2.7.1)
       mini_mime (>= 0.1.1)
     marcel (1.0.2)
+    matrix (0.4.2)
     maxminddb (0.1.22)
     method_source (1.0.0)
     mini_magick (4.11.0)
@@ -310,7 +312,7 @@ GEM
       hashie (>= 3.4.6)
       rack (>= 1.6.2, < 3)
       rack-protection
-    omniauth-facebook (8.0.0)
+    omniauth-facebook (9.0.0)
       omniauth-oauth2 (~> 1.2)
     omniauth-github (2.0.0)
       omniauth (~> 2.0)
@@ -406,7 +408,7 @@ GEM
     rexml (3.2.5)
     rinku (2.0.6)
     rotp (6.2.0)
-    rubocop (1.22.1)
+    rubocop (1.22.2)
       parallel (~> 1.10)
       parser (>= 3.0.0.0)
       rainbow (>= 2.2.2, < 4.0)
@@ -485,7 +487,7 @@ GEM
     websocket-extensions (0.1.5)
     xpath (3.2.0)
       nokogiri (~> 1.8)
-    zeitwerk (2.4.2)
+    zeitwerk (2.5.1)
 
 PLATFORMS
   ruby
index 50d0ae0a545e60b130331aabbbeb5764331a540c..6c5336908605448679b2111295883862da9c1e03 100644 (file)
@@ -5,6 +5,7 @@ class BrowseController < ApplicationController
   before_action :set_locale
   before_action -> { check_database_readable(:need_api => true) }
   before_action :require_oauth
+  before_action :update_totp, :only => [:query]
   around_action :web_timeout
   authorize_resource :class => false
 
@@ -88,4 +89,6 @@ class BrowseController < ApplicationController
   rescue ActiveRecord::RecordNotFound
     render :action => "not_found", :status => :not_found
   end
+
+  def query; end
 end
index dd6458b1b9359aa42ed4b5bce4cc6a5df0b9a269..eb24f6b2089afef5c41372458c81345b450540ec 100644 (file)
@@ -69,7 +69,7 @@ module SessionMethods
   def failed_login(message, username = nil)
     flash[:error] = message
 
-    redirect_to :action => "new", :referer => session[:referer],
+    redirect_to :controller => "sessions", :action => "new", :referer => session[:referer],
                 :username => username, :remember_me => session[:remember_me]
 
     session.delete(:remember_me)
index 42ac6ac11a15e05145d926611215bdaef3437dc4..38a61208c4635120ea9864a65dfd360728914baa 100644 (file)
@@ -341,17 +341,6 @@ class UsersController < ApplicationController
 
   private
 
-  ##
-  #
-  def unconfirmed_login(user)
-    session[:token] = user.tokens.create.token
-
-    redirect_to :action => "confirm", :display_name => user.display_name
-
-    session.delete(:remember_me)
-    session.delete(:referer)
-  end
-
   ##
   # update a user's details
   def update_user(user, params)
index a2fb15749587ff42497a2b289eaa9c725c5d0b2d..197885409046079340ccf570604a28ca7d42b7ea 100644 (file)
@@ -1470,8 +1470,8 @@ ca:
     intro_text: L'OpenStreetMap és un mapa del món creat per persones com tu i d'ús
       lliure sota una llicència oberta.
     intro_2_create_account: Crea un compte d’usuari
-    hosting_partners_html: L'allotjament és a càrrec de %{ucl}, %{bytemark} i d'altres
-      %{partners}.
+    hosting_partners_html: L'allotjament és a càrrec de %{ucl}, %{fastly}, %{bytemark}
+      i d'altres %{partners}.
     partners_ucl: UCL
     partners_bytemark: Bytemark Hosting
     partners_partners: socis
index b1e6ab09f20ace85f2d6e3e76fc741e2986e2534..63ad0fc217f48d1958c1ea6c355bffa4539a1f61 100644 (file)
@@ -736,7 +736,7 @@ fa:
           boardwalk: Boardwalk
           suspension: پل معلق
           swing: پل نوسان
-          viaduct: پل راه آهن روی دره
+          viaduct: پل چنددهانه
           "yes": پل
         building:
           apartment: آپارتمان
index d9cad45a40995f213036a82402cd07eb9f842575..f46034b623af9d9d139f42046db902636ef451d7 100644 (file)
@@ -82,6 +82,7 @@ fy:
     providers:
       none: Gjint
   browse:
+    edited_by_html: Bewurke <abbr title='%{title}'>%{time}</abbr> troch %{user}
     version: Ferzje
     anonymous: anonym
     part_of: Part fan
@@ -115,6 +116,8 @@ fy:
       type:
         way: wei
         relation: relaasje
+    tag_details:
+      tags: Lebels
     note:
       description: Beskriuwing
   changesets:
@@ -140,6 +143,16 @@ fy:
       location: 'Lokaasje:'
       edit: Bewurkje
   geocoder:
+    search:
+      title:
+        latlon_html: Treffers <a href="https://openstreetmap.org/">yntern</a>
+        ca_postcode_html: Treffers fan <a href="https://geocoder.ca/">Geocoder.CA</a>
+        osm_nominatim_html: Treffers fan <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
+          Nominatim</a>
+        geonames_html: Treffers fan <a href="http://www.geonames.org/">GeoNames</a>
+        osm_nominatim_reverse_html: Treffers fan <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
+          Nominatim</a>
+        geonames_reverse_html: Treffers fan <a href="http://www.geonames.org/">GeoNames</a>
     search_osm_nominatim:
       prefix:
         aerialway:
@@ -151,10 +164,12 @@ fy:
           apron: Platfoarm
           gate: Gate
           helipad: Helyhaven
-          runway: Start- en lâningsbaan
+          runway: Start-/lâningsbaan
           taxiway: Taksybaan
           terminal: Terminal
         amenity:
+          animal_boarding: Bistepinsjon
+          animal_shelter: Biste-asyl
           arts_centre: Keunstsintrum
           atm: Jildautomaat
           bank: Bank
@@ -164,19 +179,24 @@ fy:
           bicycle_parking: Fytsestalling
           bicycle_rental: Fytsferhier
           biergarten: Kafeeterras
+          blood_bank: Bloedbank
+          boat_rental: Boatferhier
           brothel: Bordeel
           bureau_de_change: Wikselkantoar
           bus_station: Busstasjon
           cafe: Kafee
           car_rental: Autoferhier
           car_sharing: Autodielen
-          car_wash: Autowaskstrjitte
+          car_wash: Autowaskerij
           casino: Kasino
+          charging_station: Laadstasjon
+          childcare: Berne-opfang
           cinema: Bioskoop
           clinic: Klinyk
           clock: Klok
           college: Hegeskoalle
           community_centre: Mienskipshûs
+          conference_centre: Kongressintrum
           courthouse: Rjochtbank
           crematorium: Krematoarium
           dentist: Toskedokter
@@ -184,34 +204,43 @@ fy:
           drinking_water: Drinkwetter
           driving_school: Rydskoalle
           embassy: Ambassade
+          events_venue: Evenemintehal
           fast_food: Flugge hap
           fire_station: Brânwacht
           food_court: Itenshal
           fountain: Fontein
           fuel: Brânstof
           grave_yard: Begraafplak
+          grit_bin: Struibak
           hospital: Sikehûs
           hunting_stand: Jachttoer
           ice_cream: Iisko
+          internet_cafe: Ynternetkafee
           kindergarten: Beukerskoalle
+          language_school: Taalskoalle
           library: Bibleteek
           marketplace: Merkplein
+          monastery: Kleaster
           music_school: Muzykskoalle
           nightclub: Nachtklup
           nursing_home: Ferpleechhûs
           parking: Parkearplak
+          payment_terminal: Betelautomaat
           pharmacy: Apoteek
           police: Plysje
           post_box: Brievebus
           post_office: Postkantoar
           prison: Finzenis
           pub: Kafee
+          public_bath: Badhûs
+          public_building: Iepenbier gebou
           restaurant: Restaurant
           school: Skoalle
           shelter: Skûlplak
           shower: Dûs
           swimming_pool: Swimbad
           taxi: Taksy
+          telephone: Tillefoansel
           theatre: Teäter
           toilets: Húskes
           townhall: Gemeentehûs
@@ -222,18 +251,25 @@ fy:
           waste_basket: Jiskefet
         boundary:
           administrative: Bestjoerlike grins
+          national_park: Nasjonaal park
         bridge:
           aqueduct: Akwadukt
           viaduct: Fiadukt
           "yes": Brêge
         building:
+          apartment: Appartemint
+          apartments: Apparteminten
+          chapel: Kapel
+          church: Tsjerkegebou
           "yes": Gebou
         highway:
           bridleway: Ruterpaad
           bus_stop: Bushalte
           living_street: Wenhiem
           milestone: Mylpeal
-          motorway: Gongwei
+          motorway: Autogongwei
+          motorway_junction: Knooppunt autogongwei
+          motorway_link: Op-/ôfreed autogongwei
           path: Paad
           platform: Perron
           residential: Strjitte
@@ -356,6 +392,7 @@ fy:
           village: Doarp
         railway:
           light_rail: Sneltrem
+          station: Spoarweistasjon
           tram: Trembaan
           tram_stop: Tremhalte
         shop:
@@ -414,10 +451,14 @@ fy:
       admin_levels:
         level2: Lânsgrins
         level4: Steatsgrins
+        level7: Gemeentegrins
       types:
         cities: Grutte stêden
         towns: Stêden
         places: Plakken
+    results:
+      no_results: Gjin treffers fûn
+      more_results: Mear treffers
   layouts:
     logo:
       alt_text: Logo OpenStreetMap
@@ -629,6 +670,8 @@ fy:
   traces:
     new:
       help: Help
+    trace_optionals:
+      tags: Lebels
     show:
       filename: 'Bestânsnamme:'
       coordinates_html: '%{latitude}; %{longitude}'
@@ -750,10 +793,70 @@ fy:
       descend: Dalen
       directions: Rûtebeskriuwing
       distance: Ofstân
+      errors:
+        no_route: Koe gjin rûte fine tusken dy twa plakken.
+        no_place: Spitich - koe '%{place}' net fine.
       instructions:
-        continue_without_exit: Fierder op %{name}
+        continue_without_exit: Fierder oer %{name}
+        slight_right_without_exit: Flau rjochts nei %{name}
+        offramp_right: Rjochts de ôfreed nimme
+        offramp_right_with_exit: Rjochts ôfslach %{exit} nimme
+        offramp_right_with_exit_name: Rjochts ôfslach %{exit} nimme nei %{name}
+        offramp_right_with_exit_directions: Rjochts ôfslach %{exit} nimme rjochting
+          %{directions}
+        offramp_right_with_exit_name_directions: Rjochts ôfslach %{exit} nimme nei
+          %{name}, rjochting %{directions}
+        offramp_right_with_name: Rjochts de ôfreed nimme nei %{name}
+        offramp_right_with_directions: Rjochts de ôfreed nimme rjochting %{directions}
+        offramp_right_with_name_directions: Rjochts de ôfreed nimme nei %{name}, rjochting
+          %{directions}
+        onramp_right_without_exit: Rjochts de opreed ynslaan nei %{name}
+        onramp_right_with_directions: Rjochts de opreed ynslaan rjochting %{directions}
+        onramp_right_with_name_directions: Rjochts de opreed ynslaan nei %{name},
+          rjochting %{directions}
+        onramp_right_without_directions: Rjochts de opreed ynslaan
+        onramp_right: Rjochts de opreed ynslaan
+        endofroad_right_without_exit: Oan 'e ein fan 'e wei rjochts ôfslaan nei %{name}
+        merge_right_without_exit: Rjochts ynfoegje op %{name}
+        fork_right_without_exit: Op 'e splitsing rjochts oanhâlde nei %{name}
         turn_right_without_exit: Rjochts ôfslaan nei %{name}
+        sharp_right_without_exit: Skerp rjochts nei %{name}
+        uturn_without_exit: U-bocht oer %{name}
+        sharp_left_without_exit: Skerp lofts nei %{name}
         turn_left_without_exit: Lofts ôfslaan nei %{name}
+        offramp_left: Lofts de ôfreed nimme
+        offramp_left_with_exit: Lofts ôfslach %{exit} nimme
+        offramp_left_with_exit_name: Lofts ôfslach %{exit} nimme nei %{name}
+        offramp_left_with_exit_directions: Lofts ôfslach %{exit} nimme rjochting %{directions}
+        offramp_left_with_exit_name_directions: Lofts ôfslach %{exit} nimme nei %{name},
+          rjochting %{directions}
+        offramp_left_with_name: Lofts de ôfreed nimme nei %{name}
+        offramp_left_with_directions: Lofts de ôfreed nimme rjochting %{directions}
+        offramp_left_with_name_directions: Lofts de ôfreed nimme nei %{name}, rjochting
+          %{directions}
+        onramp_left_without_exit: Lofts de opreed ynslaan nei %{name}
+        onramp_left_with_directions: Lofts de opreed ynslaan rjochting %{directions}
+        onramp_left_with_name_directions: Lofts de opreed ynslaan nei %{name}, rjochting
+          %{directions}
+        onramp_left_without_directions: Lofts de opreed ynslaan
+        onramp_left: Lofts de opreed ynslaan
+        endofroad_left_without_exit: Oan 'e ein fan 'e wei lofts ôfslaan nei %{name}
+        merge_left_without_exit: Lofts ynfoegje op %{name}
+        fork_left_without_exit: Op 'e splitsing lofts oanhâlde nei %{name}
+        slight_left_without_exit: Flau lofts nei %{name}
+        via_point_without_exit: (tuskenpunt)
+        follow_without_exit: Folgje %{name}
+        roundabout_without_exit: Op 'e rotonde ôfslaan nei %{name}
+        leave_roundabout_without_exit: Rotonde ferlitte - %{name}
+        stay_roundabout_without_exit: Op 'e rotonde bliuwe - %{name}
+        start_without_exit: Starte op %{name}
+        destination_without_exit: Bestimming berikt
+        against_oneway_without_exit: Tsjin it ienrjochtingsferkear yn op %{name}
+        end_oneway_without_exit: Ein ienrjochtingsferkear op %{name}
+        roundabout_with_exit: Op 'e rotonde ôfslach %{exit} nimme nei %{name}
+        roundabout_with_exit_ordinal: Op 'e rotonde %{exit} ôfslach nimme nei %{name}
+        exit_roundabout: Rotonde ferlitte oer %{name}
+        unnamed: nammeleaze wei
         courtesy: Rûte mei tank oan %{link}
         exit_counts:
           first: 1e
index 539d717244259db6bb9ab0e37cbfd44aeaae9e30..afc13f0e0740e03299284bbac351b22a71ace999 100644 (file)
@@ -548,7 +548,9 @@ ru:
       nearby mapper: Ближайший картограф
       friend: Друг
     show:
-      title: Моя панель
+      title: Мой пульт
+      no_home_location_html: '%{edit_profile_link} и установите ваше местоположение,
+        чтобы видеть близлежащих  пользователей.'
       edit_your_profile: Править свой профиль
       my friends: Друзья
       no friends: Вы не добавили ещё ни одного друга.
@@ -673,6 +675,7 @@ ru:
           chair_lift: Кресельный канатный подъёмник
           drag_lift: Якорный (бугельный) подъёмник
           gondola: Канатная дорога
+          magic_carpet: Волшебный подъемник для ковров
           platter: Бугельный подъёмник
           pylon: Опора линии электропередач
           station: Станция канатного подъёмника
@@ -686,6 +689,7 @@ ru:
           hangar: Ангар
           helipad: Вертолётная площадка
           holding_position: Место ожидания
+          navigationaid: Авиационная навигационная система
           parking_position: Позиция парковки
           runway: Взлётно-посадочная полоса
           taxilane: Ряд для такси
@@ -1786,12 +1790,12 @@ ru:
       flash token bad: Невозможно найти такой код подтверждения, проверьте ссылку.
   preferences:
     show:
-      title: Ð\9cои Ð½Ð°Ñ\81Ñ\82Ñ\80ойки
+      title: Ð\9cои Ð¿Ñ\80едпоÑ\87Ñ\82ениÑ\8f
       preferred_editor: Предпочитаемый редактор
       preferred_languages: Предпочитаемые языки
       edit_preferences: Изменить настройки
     edit:
-      title: Ð\98змениÑ\82Ñ\8c Ð½Ð°Ñ\81Ñ\82Ñ\80ойки
+      title: Ð\98змениÑ\82Ñ\8c Ð¿Ñ\80едпоÑ\87Ñ\82ениÑ\8f
       save: Обновить настройки
       cancel: Отмена
     update:
@@ -2655,7 +2659,8 @@ ru:
       my profile: Мой профиль
       my settings: Мои настройки
       my comments: Мои комментарии
-      my_preferences: Мои настройки
+      my_preferences: Мои предпочтения
+      my_dashboard: Мой пульт
       blocks on me: Мои блокировки
       blocks by me: Наложенные мною блокировки
       edit_profile: Редактировать настройки
index 21d8847caa59895d7ccbee9b25eeeeaa3eea9710..5b39ea76a44be70480178b2011a466f57369092a 100644 (file)
@@ -370,6 +370,72 @@ class UserLoginTest < ActionDispatch::IntegrationTest
     assert_select "span.username", user.display_name
   end
 
+  def test_login_openid_pending
+    user = create(:user, :pending, :auth_provider => "openid", :auth_uid => "http://example.com/john.doe")
+    OmniAuth.config.add_mock(:openid, :uid => user.auth_uid)
+
+    get "/login", :params => { :referer => "/history" }
+    assert_response :redirect
+    assert_redirected_to login_path(:cookie_test => true, :referer => "/history")
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    post auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    assert_response :redirect
+    assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    follow_redirect!
+    assert_response :redirect
+    follow_redirect!
+    assert_response :success
+    assert_template "confirm"
+  end
+
+  def test_login_openid_suspended
+    user = create(:user, :suspended, :auth_provider => "openid", :auth_uid => "http://example.com/john.doe")
+    OmniAuth.config.add_mock(:openid, :uid => user.auth_uid)
+
+    get "/login", :params => { :referer => "/history" }
+    assert_response :redirect
+    assert_redirected_to login_path(:cookie_test => true, :referer => "/history")
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    post auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    assert_response :redirect
+    assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    follow_redirect!
+    assert_response :redirect
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    assert_select "span.username", false
+    assert_select "div.flash.error", /your account has been suspended/ do
+      assert_select "a[href='mailto:openstreetmap@example.com']", "support"
+    end
+  end
+
+  def test_login_openid_blocked
+    user = create(:user, :auth_provider => "openid", :auth_uid => "http://example.com/john.doe")
+    create(:user_block, :needs_view, :user => user)
+    OmniAuth.config.add_mock(:openid, :uid => user.auth_uid)
+
+    get "/login", :params => { :referer => "/history" }
+    assert_response :redirect
+    assert_redirected_to login_path(:cookie_test => true, :referer => "/history")
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    post auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    assert_response :redirect
+    assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    follow_redirect!
+    assert_response :redirect
+    follow_redirect!
+    assert_response :success
+    assert_template "user_blocks/show"
+    assert_select "span.username", user.display_name
+  end
+
   def test_login_openid_connection_failed
     user = create(:user, :auth_provider => "openid", :auth_uid => "http://example.com/john.doe")
     OmniAuth.config.mock_auth[:openid] = :connection_failed
@@ -463,6 +529,78 @@ class UserLoginTest < ActionDispatch::IntegrationTest
     assert_select "span.username", user.display_name
   end
 
+  def test_login_google_pending
+    user = create(:user, :pending, :auth_provider => "google", :auth_uid => "1234567890")
+    OmniAuth.config.add_mock(:google, :uid => user.auth_uid, :extra => {
+                               :id_info => { "openid_id" => "http://localhost:1123/fred.bloggs" }
+                             })
+
+    get "/login", :params => { :referer => "/history" }
+    assert_response :redirect
+    assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    post auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    assert_response :redirect
+    assert_redirected_to auth_success_path(:provider => "google")
+    follow_redirect!
+    assert_response :redirect
+    follow_redirect!
+    assert_response :success
+    assert_template "confirm"
+  end
+
+  def test_login_google_suspended
+    user = create(:user, :suspended, :auth_provider => "google", :auth_uid => "1234567890")
+    OmniAuth.config.add_mock(:google, :uid => user.auth_uid, :extra => {
+                               :id_info => { "openid_id" => "http://localhost:1123/fred.bloggs" }
+                             })
+
+    get "/login", :params => { :referer => "/history" }
+    assert_response :redirect
+    assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    post auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    assert_response :redirect
+    assert_redirected_to auth_success_path(:provider => "google")
+    follow_redirect!
+    assert_response :redirect
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    assert_select "span.username", false
+    assert_select "div.flash.error", /your account has been suspended/ do
+      assert_select "a[href='mailto:openstreetmap@example.com']", "support"
+    end
+  end
+
+  def test_login_google_blocked
+    user = create(:user, :auth_provider => "google", :auth_uid => "1234567890")
+    create(:user_block, :needs_view, :user => user)
+    OmniAuth.config.add_mock(:google, :uid => user.auth_uid, :extra => {
+                               :id_info => { "openid_id" => "http://localhost:1123/fred.bloggs" }
+                             })
+
+    get "/login", :params => { :referer => "/history" }
+    assert_response :redirect
+    assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    post auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    assert_response :redirect
+    assert_redirected_to auth_success_path(:provider => "google")
+    follow_redirect!
+    assert_response :redirect
+    follow_redirect!
+    assert_response :success
+    assert_template "user_blocks/show"
+    assert_select "span.username", user.display_name
+  end
+
   def test_login_google_connection_failed
     OmniAuth.config.mock_auth[:google] = :connection_failed
 
@@ -581,6 +719,72 @@ class UserLoginTest < ActionDispatch::IntegrationTest
     assert_select "span.username", user.display_name
   end
 
+  def test_login_facebook_pending
+    user = create(:user, :pending, :auth_provider => "facebook", :auth_uid => "1234567890")
+    OmniAuth.config.add_mock(:facebook, :uid => user.auth_uid)
+
+    get "/login", :params => { :referer => "/history" }
+    assert_response :redirect
+    assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    post auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    assert_response :redirect
+    assert_redirected_to auth_success_path(:provider => "facebook")
+    follow_redirect!
+    assert_response :redirect
+    follow_redirect!
+    assert_response :success
+    assert_template "confirm"
+  end
+
+  def test_login_facebook_suspended
+    user = create(:user, :suspended, :auth_provider => "facebook", :auth_uid => "1234567890")
+    OmniAuth.config.add_mock(:facebook, :uid => user.auth_uid)
+
+    get "/login", :params => { :referer => "/history" }
+    assert_response :redirect
+    assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    post auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    assert_response :redirect
+    assert_redirected_to auth_success_path(:provider => "facebook")
+    follow_redirect!
+    assert_response :redirect
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    assert_select "span.username", false
+    assert_select "div.flash.error", /your account has been suspended/ do
+      assert_select "a[href='mailto:openstreetmap@example.com']", "support"
+    end
+  end
+
+  def test_login_facebook_blocked
+    user = create(:user, :auth_provider => "facebook", :auth_uid => "1234567890")
+    create(:user_block, :needs_view, :user => user)
+    OmniAuth.config.add_mock(:facebook, :uid => user.auth_uid)
+
+    get "/login", :params => { :referer => "/history" }
+    assert_response :redirect
+    assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    post auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    assert_response :redirect
+    assert_redirected_to auth_success_path(:provider => "facebook")
+    follow_redirect!
+    assert_response :redirect
+    follow_redirect!
+    assert_response :success
+    assert_template "user_blocks/show"
+    assert_select "span.username", user.display_name
+  end
+
   def test_login_facebook_connection_failed
     OmniAuth.config.mock_auth[:facebook] = :connection_failed
 
@@ -670,6 +874,72 @@ class UserLoginTest < ActionDispatch::IntegrationTest
     assert_select "span.username", user.display_name
   end
 
+  def test_login_windowslive_pending
+    user = create(:user, :pending, :auth_provider => "windowslive", :auth_uid => "1234567890")
+    OmniAuth.config.add_mock(:windowslive, :uid => user.auth_uid)
+
+    get "/login", :params => { :referer => "/history" }
+    assert_response :redirect
+    assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    post auth_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    assert_response :redirect
+    assert_redirected_to auth_success_path(:provider => "windowslive")
+    follow_redirect!
+    assert_response :redirect
+    follow_redirect!
+    assert_response :success
+    assert_template "confirm"
+  end
+
+  def test_login_windowslive_suspended
+    user = create(:user, :suspended, :auth_provider => "windowslive", :auth_uid => "1234567890")
+    OmniAuth.config.add_mock(:windowslive, :uid => user.auth_uid)
+
+    get "/login", :params => { :referer => "/history" }
+    assert_response :redirect
+    assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    post auth_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    assert_response :redirect
+    assert_redirected_to auth_success_path(:provider => "windowslive")
+    follow_redirect!
+    assert_response :redirect
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    assert_select "span.username", false
+    assert_select "div.flash.error", /your account has been suspended/ do
+      assert_select "a[href='mailto:openstreetmap@example.com']", "support"
+    end
+  end
+
+  def test_login_windowslive_blocked
+    user = create(:user, :auth_provider => "windowslive", :auth_uid => "1234567890")
+    create(:user_block, :needs_view, :user => user)
+    OmniAuth.config.add_mock(:windowslive, :uid => user.auth_uid)
+
+    get "/login", :params => { :referer => "/history" }
+    assert_response :redirect
+    assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    post auth_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    assert_response :redirect
+    assert_redirected_to auth_success_path(:provider => "windowslive")
+    follow_redirect!
+    assert_response :redirect
+    follow_redirect!
+    assert_response :success
+    assert_template "user_blocks/show"
+    assert_select "span.username", user.display_name
+  end
+
   def test_login_windowslive_connection_failed
     OmniAuth.config.mock_auth[:windowslive] = :connection_failed
 
@@ -759,6 +1029,72 @@ class UserLoginTest < ActionDispatch::IntegrationTest
     assert_select "span.username", user.display_name
   end
 
+  def test_login_github_pending
+    user = create(:user, :pending, :auth_provider => "github", :auth_uid => "1234567890")
+    OmniAuth.config.add_mock(:github, :uid => user.auth_uid)
+
+    get "/login", :params => { :referer => "/history" }
+    assert_response :redirect
+    assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    post auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    assert_response :redirect
+    assert_redirected_to auth_success_path(:provider => "github")
+    follow_redirect!
+    assert_response :redirect
+    follow_redirect!
+    assert_response :success
+    assert_template "confirm"
+  end
+
+  def test_login_github_suspended
+    user = create(:user, :suspended, :auth_provider => "github", :auth_uid => "1234567890")
+    OmniAuth.config.add_mock(:github, :uid => user.auth_uid)
+
+    get "/login", :params => { :referer => "/history" }
+    assert_response :redirect
+    assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    post auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    assert_response :redirect
+    assert_redirected_to auth_success_path(:provider => "github")
+    follow_redirect!
+    assert_response :redirect
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    assert_select "span.username", false
+    assert_select "div.flash.error", /your account has been suspended/ do
+      assert_select "a[href='mailto:openstreetmap@example.com']", "support"
+    end
+  end
+
+  def test_login_github_blocked
+    user = create(:user, :auth_provider => "github", :auth_uid => "1234567890")
+    create(:user_block, :needs_view, :user => user)
+    OmniAuth.config.add_mock(:github, :uid => user.auth_uid)
+
+    get "/login", :params => { :referer => "/history" }
+    assert_response :redirect
+    assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    post auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    assert_response :redirect
+    assert_redirected_to auth_success_path(:provider => "github")
+    follow_redirect!
+    assert_response :redirect
+    follow_redirect!
+    assert_response :success
+    assert_template "user_blocks/show"
+    assert_select "span.username", user.display_name
+  end
+
   def test_login_github_connection_failed
     OmniAuth.config.mock_auth[:github] = :connection_failed
 
@@ -848,6 +1184,72 @@ class UserLoginTest < ActionDispatch::IntegrationTest
     assert_select "span.username", user.display_name
   end
 
+  def test_login_wikipedia_pending
+    user = create(:user, :pending, :auth_provider => "wikipedia", :auth_uid => "1234567890")
+    OmniAuth.config.add_mock(:wikipedia, :uid => user.auth_uid)
+
+    get "/login", :params => { :referer => "/history" }
+    assert_response :redirect
+    assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    post auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    assert_response :redirect
+    assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    follow_redirect!
+    assert_response :redirect
+    follow_redirect!
+    assert_response :success
+    assert_template "confirm"
+  end
+
+  def test_login_wikipedia_suspended
+    user = create(:user, :suspended, :auth_provider => "wikipedia", :auth_uid => "1234567890")
+    OmniAuth.config.add_mock(:wikipedia, :uid => user.auth_uid)
+
+    get "/login", :params => { :referer => "/history" }
+    assert_response :redirect
+    assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    post auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    assert_response :redirect
+    assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    follow_redirect!
+    assert_response :redirect
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    assert_select "span.username", false
+    assert_select "div.flash.error", /your account has been suspended/ do
+      assert_select "a[href='mailto:openstreetmap@example.com']", "support"
+    end
+  end
+
+  def test_login_wikipedia_blocked
+    user = create(:user, :auth_provider => "wikipedia", :auth_uid => "1234567890")
+    create(:user_block, :needs_view, :user => user)
+    OmniAuth.config.add_mock(:wikipedia, :uid => user.auth_uid)
+
+    get "/login", :params => { :referer => "/history" }
+    assert_response :redirect
+    assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
+    follow_redirect!
+    assert_response :success
+    assert_template "sessions/new"
+    post auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    assert_response :redirect
+    assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
+    follow_redirect!
+    assert_response :redirect
+    follow_redirect!
+    assert_response :success
+    assert_template "user_blocks/show"
+    assert_select "span.username", user.display_name
+  end
+
   def test_login_wikipedia_connection_failed
     OmniAuth.config.mock_auth[:wikipedia] = :connection_failed