From 4900080ff19c0010cbdfcca16aa315cb771895cd Mon Sep 17 00:00:00 2001 From: Pierre Mesure Date: Wed, 8 Aug 2018 15:30:29 +0200 Subject: [PATCH 1/4] First integration with the gem personnummer --- Gemfile.lock | 2 ++ Gemfile_custom | 3 ++- lib/census_caller.rb | 1 + lib/personnummer_api.rb | 50 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 lib/personnummer_api.rb diff --git a/Gemfile.lock b/Gemfile.lock index 737a46469a6..12c89170e6d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -319,6 +319,7 @@ GEM activerecord (>= 4.0, < 5.2) parser (2.5.0.5) ast (~> 2.4.0) + personnummer (0.1.0) pg (0.21.0) pg_search (2.0.1) activerecord (>= 4.2) @@ -562,6 +563,7 @@ DEPENDENCIES omniauth-twitter (~> 1.4.0) paperclip (~> 5.2.1) paranoia (~> 2.4.0) + personnummer pg (~> 0.21.0) pg_search (~> 2.0.1) puma diff --git a/Gemfile_custom b/Gemfile_custom index 77a5b575cb8..2a2dd3230fa 100644 --- a/Gemfile_custom +++ b/Gemfile_custom @@ -8,9 +8,10 @@ gem 'puma' #gem 'rack-timeout' gem 'rails_12factor', :group => :production gem 'heroku-deflater', :group => :production +gem 'personnummer' group :test do gem 'fuubar' end -ruby '2.3.2' \ No newline at end of file +ruby '2.3.2' diff --git a/lib/census_caller.rb b/lib/census_caller.rb index d104b03c81d..ee9750097b1 100644 --- a/lib/census_caller.rb +++ b/lib/census_caller.rb @@ -3,6 +3,7 @@ class CensusCaller def call(document_type, document_number) response = CensusApi.new.call(document_type, document_number) response = LocalCensus.new.call(document_type, document_number) unless response.valid? + response = PersonnummerApi.new.call(document_type, document_number) unless response.valid? response end diff --git a/lib/personnummer_api.rb b/lib/personnummer_api.rb new file mode 100644 index 00000000000..3914d2553a5 --- /dev/null +++ b/lib/personnummer_api.rb @@ -0,0 +1,50 @@ +class PersonnummerApi + + def call(document_type, document_number) + Response.new(document_type, document_number) + end + + class Response + def initialize(document_type, document_number) + @document_type = document_type + @document_number = document_number + if personnummer? + @personnummer = Personnummer.new(document_number) + end + end + + def valid? + if personnummer? + @personnummer.valid? + else + true + end + end + + def date_of_birth + if personnummer? + @personnummer.born + else + nil + end + end + + def region + @personnummer.region + end + + def gender + if @personnummer.female? + "female" + else + "male" + end + end + + private + + def personnummer? + @document_type.to_s == "1" + end + end +end From 404cc218ec18a4723b4ebe913ef0c7f8acfeb81d Mon Sep 17 00:00:00 2001 From: Pierre Mesure Date: Wed, 8 Aug 2018 16:38:24 +0200 Subject: [PATCH 2/4] Catching the ArgumentError and added some custom strings --- config/locales/custom/.keep | 0 config/locales/custom/en/verification.yml | 7 ++++++ config/locales/custom/sv/verification.yml | 7 ++++++ lib/personnummer_api.rb | 28 +++++++++++++++++------ 4 files changed, 35 insertions(+), 7 deletions(-) delete mode 100644 config/locales/custom/.keep create mode 100644 config/locales/custom/en/verification.yml create mode 100644 config/locales/custom/sv/verification.yml diff --git a/config/locales/custom/.keep b/config/locales/custom/.keep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/config/locales/custom/en/verification.yml b/config/locales/custom/en/verification.yml new file mode 100644 index 00000000000..3567796405e --- /dev/null +++ b/config/locales/custom/en/verification.yml @@ -0,0 +1,7 @@ +sv: + verification: + residence: + new: + document_number_help_text_html: 'Personnummer: 199206239176
Pass: AAA000001
Övrig identitetshandling: X1234567P' + document_type: + spanish_id: Personnummer diff --git a/config/locales/custom/sv/verification.yml b/config/locales/custom/sv/verification.yml new file mode 100644 index 00000000000..21f1e9eb515 --- /dev/null +++ b/config/locales/custom/sv/verification.yml @@ -0,0 +1,7 @@ +en: + verification: + residence: + new: + document_number_help_text_html: 'Personal Number: 199206239176
Passport: AAA000001
Residence card: X1234567P' + document_type: + spanish_id: Personal number diff --git a/lib/personnummer_api.rb b/lib/personnummer_api.rb index 3914d2553a5..5d22642d5c5 100644 --- a/lib/personnummer_api.rb +++ b/lib/personnummer_api.rb @@ -9,20 +9,22 @@ def initialize(document_type, document_number) @document_type = document_type @document_number = document_number if personnummer? - @personnummer = Personnummer.new(document_number) + begin + @personnummer = Personnummer.new(document_number) + end end end def valid? if personnummer? - @personnummer.valid? + valid_personnummer? else true end end def date_of_birth - if personnummer? + if valid_personnummer? @personnummer.born else nil @@ -30,14 +32,22 @@ def date_of_birth end def region - @personnummer.region + if valid_personnummer? + @personnummer.region + else + nil + end end def gender - if @personnummer.female? - "female" + if valid_personnummer? + if @personnummer.female? + "female" + else + "male" + end else - "male" + nil end end @@ -46,5 +56,9 @@ def gender def personnummer? @document_type.to_s == "1" end + + def valid_personnummer? + personnummer? && @personnummer != nil && @personnummer.valid? + end end end From 28d6cb5178463c07c77685e79b9ab041493d4360 Mon Sep 17 00:00:00 2001 From: Pierre Mesure Date: Thu, 9 Aug 2018 15:18:38 +0200 Subject: [PATCH 3/4] Adding the ability to login with your personnummer (with some specs) --- app/models/user.rb | 15 +++++- spec/features/custom/users_auth_spec.rb | 65 +++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 spec/features/custom/users_auth_spec.rb diff --git a/app/models/user.rb b/app/models/user.rb index 4b999207ddc..024dd2e3605 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -321,12 +321,23 @@ def public_comments public_activity? ? comments : User.none end - # overwritting of Devise method to allow login using email OR username + # overwritting of Devise method to allow login using email OR username OR personal number def self.find_for_database_authentication(warden_conditions) conditions = warden_conditions.dup login = conditions.delete(:login) + begin + personal_number = Personnummer.new(login) + if personal_number.valid? + personal_number = personal_number.to_s.delete '-' + else + personal_number = nil + end + rescue ArgumentError + personal_number = nil + end where(conditions.to_hash).where(["lower(email) = ?", login.downcase]).first || - where(conditions.to_hash).where(["username = ?", login]).first + where(conditions.to_hash).where(["username = ?", login]).first || + where(conditions.to_hash).where(document_type: '1').where(["document_number = ?", personal_number]).first end def interests diff --git a/spec/features/custom/users_auth_spec.rb b/spec/features/custom/users_auth_spec.rb new file mode 100644 index 00000000000..ea4d57512d0 --- /dev/null +++ b/spec/features/custom/users_auth_spec.rb @@ -0,0 +1,65 @@ +require 'rails_helper' + +feature 'Users' do + + context 'Regular authentication' do + + context 'Sign in' do + + scenario 'with short personal number' do + create(:user, email: 'manuela@consul.dev', document_type: '1', + document_number: '9305249170', password: 'judgementday') + + visit '/' + click_link 'Sign in' + fill_in 'user_login', with: '9305249170' + fill_in 'user_password', with: 'judgementday' + click_button 'Enter' + + expect(page).to have_content 'You have been signed in successfully.' + end + + scenario 'with long personal number' do + create(:user, email: 'manuela@consul.dev', document_type: '1', + document_number: '9305249170', password: 'judgementday') + + visit '/' + click_link 'Sign in' + fill_in 'user_login', with: '199305249170' + fill_in 'user_password', with: 'judgementday' + click_button 'Enter' + + expect(page).to have_content 'You have been signed in successfully.' + end + + scenario 'with long hyphenated personal number' do + create(:user, email: 'manuela@consul.dev', document_type: '1', + document_number: '9305249170', password: 'judgementday') + + visit '/' + click_link 'Sign in' + fill_in 'user_login', with: '19930524-9170' + fill_in 'user_password', with: 'judgementday' + click_button 'Enter' + + expect(page).to have_content 'You have been signed in successfully.' + end + + scenario 'with incomplete personal number' do + create(:user, email: 'manuela@consul.dev', document_type: '1', + document_number: '9305249170', password: 'judgementday') + + visit '/' + click_link 'Sign in' + fill_in 'user_login', with: '930524917' + fill_in 'user_password', with: 'judgementday' + click_button 'Enter' + + expect(page).to have_content 'Invalid login or password' + end + + end + + end + +end From c0ad2556e6262bbc8ca5f553a9ae3eef8ee5a786 Mon Sep 17 00:00:00 2001 From: Pierre Mesure Date: Thu, 9 Aug 2018 17:16:26 +0200 Subject: [PATCH 4/4] Adding custom locales in sv and en to account for the fact that you can login with a personal number --- config/locales/custom/en/activerecord.yml | 5 +++++ config/locales/custom/en/devise_views.yml | 5 +++++ config/locales/custom/sv/activerecord.yml | 5 +++++ config/locales/custom/sv/devise_views.yml | 5 +++++ 4 files changed, 20 insertions(+) create mode 100644 config/locales/custom/en/activerecord.yml create mode 100644 config/locales/custom/en/devise_views.yml create mode 100644 config/locales/custom/sv/activerecord.yml create mode 100644 config/locales/custom/sv/devise_views.yml diff --git a/config/locales/custom/en/activerecord.yml b/config/locales/custom/en/activerecord.yml new file mode 100644 index 00000000000..4715cffa3d7 --- /dev/null +++ b/config/locales/custom/en/activerecord.yml @@ -0,0 +1,5 @@ +en: + activerecord: + attributes: + user: + login: "Email or username or personal number" diff --git a/config/locales/custom/en/devise_views.yml b/config/locales/custom/en/devise_views.yml new file mode 100644 index 00000000000..c86f649df37 --- /dev/null +++ b/config/locales/custom/en/devise_views.yml @@ -0,0 +1,5 @@ +en: + devise_views: + sessions: + new: + login_label: Email or username or personal number diff --git a/config/locales/custom/sv/activerecord.yml b/config/locales/custom/sv/activerecord.yml new file mode 100644 index 00000000000..2caf469164c --- /dev/null +++ b/config/locales/custom/sv/activerecord.yml @@ -0,0 +1,5 @@ +sv: + activerecord: + attributes: + user: + login: "E-post eller användarnamn eller personnummer" diff --git a/config/locales/custom/sv/devise_views.yml b/config/locales/custom/sv/devise_views.yml new file mode 100644 index 00000000000..91a53cd0667 --- /dev/null +++ b/config/locales/custom/sv/devise_views.yml @@ -0,0 +1,5 @@ +sv: + devise_views: + sessions: + new: + login_label: "E-post eller användarnamn eller personnummer"