diff --git a/Gemfile b/Gemfile index db43b470e..98a6bed4c 100644 --- a/Gemfile +++ b/Gemfile @@ -63,6 +63,9 @@ gem 'countries', '~> 0.10.0' # cloning activerecord objects gem 'deep_cloneable', '~> 2.1.1' +# id + mid login +gem 'digidoc_client', '~> 0.2.1' + group :development do # dev tools gem 'spring', '~> 1.2.0' diff --git a/Gemfile.lock b/Gemfile.lock index 3dd8ba99e..045f05d6e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -60,6 +60,9 @@ GEM thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) addressable (2.3.6) + akami (1.2.2) + gyoku (>= 0.4.0) + nokogiri arel (6.0.0) ast (2.0.0) astrolabe (1.3.0) @@ -122,6 +125,8 @@ GEM coffee-script-source (1.8.0) countries (0.10.0) currencies (~> 0.4.2) + crack (0.4.2) + safe_yaml (~> 1.0.0) currencies (0.4.2) daemons (1.1.9) database_cleaner (1.3.0) @@ -143,6 +148,12 @@ GEM thread_safe (~> 0.1) warden (~> 1.2.3) diff-lcs (1.2.5) + digidoc_client (0.2.1) + crack (>= 0.1.8) + httpclient (>= 2.3.4) + mime-types (>= 1.16) + nokogiri (>= 1.4.0) + savon (>= 2.4.0) docile (1.1.5) epp (1.4.0) hpricot @@ -193,6 +204,8 @@ GEM guard-rubocop (1.1.0) guard (~> 2.0) rubocop (~> 0.20) + gyoku (1.2.3) + builder (>= 2.1.2) haml (4.0.6) tilt haml-rails (0.6.0) @@ -209,6 +222,9 @@ GEM hike (1.2.3) hitimes (1.2.2) hpricot (0.8.6) + httpclient (2.6.0.1) + httpi (2.3.0) + rack i18n (0.7.0) ice_nine (0.11.1) isikukood (0.1.2) @@ -236,6 +252,8 @@ GEM loofah (2.0.1) nokogiri (>= 1.5.9) lumberjack (1.0.9) + macaddr (1.7.1) + systemu (~> 2.6.2) mail (2.6.3) mime-types (>= 1.16, < 3) method_source (0.8.2) @@ -250,6 +268,7 @@ GEM newrelic_rpm (3.9.9.275) nokogiri (1.6.2.1) mini_portile (= 0.6.0) + nori (2.4.0) nprogress-rails (0.1.6.5) open4 (1.3.4) orm_adapter (0.5.0) @@ -366,6 +385,7 @@ GEM reek (= 1.3.8) ruby2ruby (>= 2.1.1, < 3.0) virtus (~> 1.0) + safe_yaml (1.0.4) sass (3.4.10) sass-rails (5.0.1) railties (>= 4.0.0, < 5.0) @@ -373,6 +393,15 @@ GEM sprockets (>= 2.8, < 4.0) sprockets-rails (>= 2.0, < 4.0) tilt (~> 1.1) + savon (2.10.1) + akami (~> 1.2) + builder (>= 2.1.2) + gyoku (~> 1.2) + httpi (~> 2.3) + nokogiri (>= 1.4.0) + nori (~> 2.4) + uuid (~> 2.3.7) + wasabi (~> 3.4) sdoc (0.4.1) json (~> 1.7, >= 1.7.7) rdoc (~> 4.0) @@ -404,6 +433,7 @@ GEM sprockets (>= 2.8, < 4.0) sys-uname (0.9.0) ffi (>= 1.0.0) + systemu (2.6.5) temple (0.6.10) terminal-table (1.4.5) therubyracer (0.12.1) @@ -428,6 +458,8 @@ GEM rack raindrops (~> 0.7) uniform_notifier (1.6.2) + uuid (2.3.7) + macaddr (~> 1.0) uuidtools (2.1.5) virtus (1.0.4) axiom-types (~> 0.1) @@ -436,6 +468,9 @@ GEM equalizer (~> 0.0, >= 0.0.9) warden (1.2.3) rack (>= 1.0) + wasabi (3.4.0) + httpi (~> 2.0) + nokogiri (>= 1.4.2) websocket-driver (0.5.1) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.1) @@ -465,6 +500,7 @@ DEPENDENCIES deep_cloneable (~> 2.1.1) delayed_job_active_record (~> 4.0.3) devise (~> 3.4.1) + digidoc_client (~> 0.2.1) epp (~> 1.4.0) epp-xml (~> 0.10.4) fabrication (~> 2.12.2) diff --git a/app/assets/images/id_card.gif b/app/assets/images/id_card.gif new file mode 100644 index 000000000..ee23a2fb1 Binary files /dev/null and b/app/assets/images/id_card.gif differ diff --git a/app/assets/images/mid.gif b/app/assets/images/mid.gif new file mode 100644 index 000000000..bf8409a9b Binary files /dev/null and b/app/assets/images/mid.gif differ diff --git a/app/assets/javascripts/app.js.coffee b/app/assets/javascripts/app.js.coffee index 2bc26b09c..ed5be014f 100644 --- a/app/assets/javascripts/app.js.coffee +++ b/app/assets/javascripts/app.js.coffee @@ -1,3 +1,15 @@ +@flash_notice = (msg) -> + $('#flash').find('div').removeClass('bg-danger') + $('#flash').find('div').addClass('bg-success') + $('#flash').find('div').html(msg) + $('#flash').show() + +@flash_alert = (msg) -> + $('#flash').find('div').removeClass('bg-success') + $('#flash').find('div').addClass('bg-danger') + $('#flash').find('div').html(msg) + $('#flash').show() + ready = -> $('.selectize').selectize({ allowEmptyOption: true diff --git a/app/assets/stylesheets/app.sass b/app/assets/stylesheets/app.sass index 64b9857d4..e1605df99 100644 --- a/app/assets/stylesheets/app.sass +++ b/app/assets/stylesheets/app.sass @@ -27,3 +27,13 @@ margin: 0 auto input margin-bottom: 10px + +.form-signin .form-control + position: relative + height: auto + -webkit-box-sizing: border-box + -moz-box-sizing: border-box + box-sizing: border-box + padding: 10px + font-size: 16px + diff --git a/app/controllers/admin/api_users_controller.rb b/app/controllers/admin/api_users_controller.rb index 27bed6a80..c3c359e3c 100644 --- a/app/controllers/admin/api_users_controller.rb +++ b/app/controllers/admin/api_users_controller.rb @@ -54,6 +54,6 @@ class Admin::ApiUsersController < AdminController end def api_user_params - params.require(:api_user).permit(:username, :password, :active, :registrar_id, :registrar_typeahead) + params.require(:api_user).permit(:username, :password, :active, :registrar_id, :registrar_typeahead, :identity_code) end end diff --git a/app/controllers/admin/sessions_controller.rb b/app/controllers/admin/sessions_controller.rb index 866711dac..579e68776 100644 --- a/app/controllers/admin/sessions_controller.rb +++ b/app/controllers/admin/sessions_controller.rb @@ -7,4 +7,8 @@ class Admin::SessionsController < SessionsController def login end + + def find_user_by_idc(idc) + AdminUser.find_by(identity_code: idc) + end end diff --git a/app/controllers/registrar/sessions_controller.rb b/app/controllers/registrar/sessions_controller.rb index 286c5d1f9..cc92659b6 100644 --- a/app/controllers/registrar/sessions_controller.rb +++ b/app/controllers/registrar/sessions_controller.rb @@ -13,4 +13,54 @@ class Registrar::SessionsController < SessionsController def login end + + def login_mid + @user = User.new + end + + def mid + phone = params[:user][:phone] + client = Digidoc::Client.new + + country_codes = {'+372' => 'EST'} + + response = client.authenticate( + :phone => "+372#{phone}", + :message_to_display => 'Authenticating', + :service_name => 'Testing' + ) + + @user = find_user_by_idc(response.user_id_code) + + if @user.persisted? + session[:user_id_code] = response.user_id_code + session[:mid_session_code] = client.session_code + render json: { message: t('check_your_phone_for_confirmation_code') }, status: :ok + else + flash[:alert] = t('no_such_user') + flash.keep(:alert) + render js: "window.location = '#{registrar_login_mid_path}'" + end + + # client.authentication_status + end + + def mid_status + client = Digidoc::Client.new + client.session_code = session[:mid_session_code] + auth_status = client.authentication_status + + # binding.pry + # flash[:notice] = I18n.t('welcome') + # flash.keep(:notice) + + # sign_in @user + # render js: "window.location = '#{registrar_invoices_path}'" + render json: { message: t('not_ok') }, status: :request_timeout + end + + def find_user_by_idc(idc) + return User.new unless idc + ApiUser.find_by(identity_code: idc) || User.new + end end diff --git a/app/models/user.rb b/app/models/user.rb index db35a745a..0beb174f3 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,4 +1,6 @@ class User < ActiveRecord::Base include Versions # version/user_version.rb devise :trackable, :timeoutable + + attr_accessor :phone end diff --git a/app/views/admin/api_users/_form.haml b/app/views/admin/api_users/_form.haml index 29f8b1179..9d1a635a5 100644 --- a/app/views/admin/api_users/_form.haml +++ b/app/views/admin/api_users/_form.haml @@ -14,6 +14,9 @@ .form-group = f.label :password = f.text_field(:password, class: 'form-control') + .form-group + = f.label :identity_code + = f.text_field(:identity_code, class: 'form-control') .form-group .form-group.has-feedback.js-typeahead-container = f.label :registrar_typeahead, t('registrar') diff --git a/app/views/registrar/sessions/login.haml b/app/views/registrar/sessions/login.haml index 6dec84141..62611e87f 100644 --- a/app/views/registrar/sessions/login.haml +++ b/app/views/registrar/sessions/login.haml @@ -1,6 +1,7 @@ -.form-signin - / TODO: Refactor this when ID card login is done - = button_to 'ID card (user1)', 'sessions', - class: 'btn btn-lg btn-primary btn-block', name: 'user1' - = button_to 'ID card (user2)', 'sessions', - class: 'btn btn-lg btn-primary btn-block', name: 'user2' +.form-signin.text-center + %h2.form-signin-heading.text-center= t('log_in') + %hr + = link_to '/registrar/login/mid' do + = image_tag 'mid.gif' + = link_to '/registrar/login/id' do + = image_tag 'id_card.gif' diff --git a/app/views/registrar/sessions/login_mid.haml b/app/views/registrar/sessions/login_mid.haml new file mode 100644 index 000000000..27fba50c3 --- /dev/null +++ b/app/views/registrar/sessions/login_mid.haml @@ -0,0 +1,30 @@ +.form-signin.text-center + %h2.form-signin-heading.text-center= t('log_in_with_mid') + %hr + = link_to '/registrar/login/mid' do + = image_tag 'mid.gif' + = link_to '/registrar/login/id' do + = image_tag 'id_card.gif' + = form_for @user, url: registrar_mid_path, html: {class: 'form-signin'} do |f| + = f.text_field :phone, class: 'form-control', placeholder: t('phone_no'), autocomplete: 'off' + %button.btn.btn-lg.btn-primary.btn-block.js-login{:type => 'submit'}= t('log_in') + +:coffee + status_interval = null + mid_status = () -> + + status_interval = setInterval((-> + $.post('/registrar/login/mid_status').fail((data, bla, asd) -> + clearInterval(status_interval) + flash_alert(data.responseJSON.message) + ) + ), 1000) + + $('.js-login').on 'click', (e) -> + e.preventDefault(); + + $.post($('form').attr('action'), $('form').serialize()).done((data) -> + flash_notice(data.message) + mid_status() + ) + diff --git a/config/initializers/digidoc_logger.rb b/config/initializers/digidoc_logger.rb new file mode 100644 index 000000000..dc09ff5ed --- /dev/null +++ b/config/initializers/digidoc_logger.rb @@ -0,0 +1 @@ +Digidoc::Client.logger = Logger.new('log/webservices.log') diff --git a/config/locales/en.yml b/config/locales/en.yml index 2e6ab4b99..0803dac05 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -493,3 +493,8 @@ en: contact_org_error: 'Parameter value policy error. Org should be blank' contact_fax_error: 'Parameter value policy error. Fax should be blank' invoices: 'Invoices' + no_such_user: 'No such user' + log_in: 'Log in' + phone_no: 'Phone number' + log_in_with_mid: 'Log in with mobile-id' + check_your_phone_for_confirmation_code: 'Check your phone for confirmation code' diff --git a/config/routes.rb b/config/routes.rb index e4f28e7d7..4ddcd8a27 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -67,7 +67,11 @@ Rails.application.routes.draw do devise_scope :user do get 'login' => 'sessions#login' + # get 'login/mid' => 'sessions#login_mid' + # post 'login/mid' => 'sessions#mid' + post 'sessions' => 'sessions#create' + post 'mid' => 'sessions#mid' get 'logout' => '/devise/sessions#destroy' end @@ -79,7 +83,12 @@ Rails.application.routes.draw do devise_scope :user do get 'login' => 'sessions#login' + get 'login/mid' => 'sessions#login_mid' + post 'login/mid' => 'sessions#mid' + post 'login/mid_status' => 'sessions#mid_status' + post 'sessions' => 'sessions#create' + post 'mid' => 'sessions#mid' get 'logout' => '/devise/sessions#destroy' end