diff --git a/Gemfile b/Gemfile index 576916b45..963a1e68f 100644 --- a/Gemfile +++ b/Gemfile @@ -51,6 +51,9 @@ gem 'kaminari', '~> 0.16.1' # for searching gem 'ransack', '~> 1.3.0' +# for rights +gem 'cancan', '~> 1.6.10' + group :assets do # See https://github.com/sstephenson/execjs#readme for more supported runtimes gem 'therubyracer', platforms: :ruby diff --git a/Gemfile.lock b/Gemfile.lock index 663979f79..16e18ef02 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -34,6 +34,7 @@ GEM bootstrap-sass (3.2.0.2) sass (~> 3.2) builder (3.2.2) + cancan (1.6.10) capybara (2.4.1) mime-types (>= 1.16) nokogiri (>= 1.3.3) @@ -253,6 +254,7 @@ PLATFORMS DEPENDENCIES bootstrap-sass (~> 3.2.0.1) + cancan (~> 1.6.10) capybara (~> 2.4.1) coffee-rails (~> 4.0.0) database_cleaner (~> 1.3.0) diff --git a/app/controllers/client/domain_transfers_controller.rb b/app/controllers/client/domain_transfers_controller.rb new file mode 100644 index 000000000..8bf62d840 --- /dev/null +++ b/app/controllers/client/domain_transfers_controller.rb @@ -0,0 +1,56 @@ +class Client::DomainTransfersController < ClientController + before_action :set_domain_transfer, only: :show + before_action :set_domain, only: [:create] + + def new + @domain_transfer = DomainTransfer.new + end + + def create + @domain_transfer = @domain.pending_transfer || @domain.domain_transfers.create(domain_transfer_params) + if can? :read, @domain_transfer + flash[:notice] = I18n.t('shared.domain_transfer_requested') + redirect_to [:client, @domain_transfer] + else + flash[:alert] = I18n.t('shared.other_registrar_has_already_requested_to_transfer_this_domain') + render 'new' + end + end + + private + + def set_domain_transfer + @domain_transfer = DomainTransfer.find(params[:id]) + end + + def domain_transfer_params + ret = { + status: DomainTransfer::PENDING, + transfer_requested_at: Time.zone.now, + transfer_to: current_user.registrar, + transfer_from: @domain.registrar + } + + wait_time = SettingGroup.domain_general.setting(:transfer_wait_time).value.to_i + + if wait_time == 0 + ret[:status] = DomainTransfer::SERVER_APPROVED + ret[:transferred_at] = Time.zone.now + end + + ret + end + + def set_domain + @domain_transfer = DomainTransfer.new + @domain = Domain.find_by(name: params[:domain_name]) + if @domain + return if @domain.auth_info == params[:domain_pw] + flash[:alert] = I18n.t('shared.password_invalid') + render 'new' + else + flash[:alert] = I18n.t('shared.domain_was_not_found') + render 'new' + end + end +end diff --git a/app/models/ability.rb b/app/models/ability.rb new file mode 100644 index 000000000..ab5c6eec5 --- /dev/null +++ b/app/models/ability.rb @@ -0,0 +1,36 @@ +class Ability + include CanCan::Ability + + def initialize(user) + + # user ||= EppUser.last + + can :read, DomainTransfer, transfer_to_id: user.registrar.id + # Define abilities for the passed in user here. For example: + # + # user ||= User.new # guest user (not logged in) + # if user.admin? + # can :manage, :all + # else + # can :read, :all + # end + # + # The first argument to `can` is the action you are giving the user + # permission to do. + # If you pass :manage it will apply to every action. Other common actions + # here are :read, :create, :update and :destroy. + # + # The second argument is the resource the user can perform the action on. + # If you pass :all it will apply to every resource. Otherwise pass a Ruby + # class of the resource. + # + # The third argument is an optional hash of conditions to further filter the + # objects. + # For example, here the user can only update published articles. + # + # can :update, Article, :published => true + # + # See the wiki for details: + # https://github.com/ryanb/cancan/wiki/Defining-Abilities + end +end diff --git a/app/models/registrar.rb b/app/models/registrar.rb index 3620c9a56..f70ea537c 100644 --- a/app/models/registrar.rb +++ b/app/models/registrar.rb @@ -3,6 +3,7 @@ class Registrar < ActiveRecord::Base has_many :domains has_many :ns_sets has_many :epp_users + has_many :domain_transfers, foreign_key: 'transfer_to_id' def to_s name diff --git a/app/views/client/domain_transfers/new.haml b/app/views/client/domain_transfers/new.haml new file mode 100644 index 000000000..b5099fa66 --- /dev/null +++ b/app/views/client/domain_transfers/new.haml @@ -0,0 +1,19 @@ +%h2= t('shared.transfer_domain') +%hr += form_for([:client, @domain_transfer]) do |f| + = render 'shared/errors', object: @domain_transfer + - if @domain_transfer.errors.any? + %hr + .row + .col-md-6 + .form-group + = label_tag :domain_name + = text_field_tag(:domain_name, params[:domain_name], class: 'form-control') + .row + .col-md-6 + .form-group + = label_tag :domain_pw + = text_field_tag(:domain_pw, params[:domain_pw], class: 'form-control') + .row + .col-md-12.text-right + = button_tag(t('shared.save'), class: 'btn btn-primary', name: 'request') diff --git a/app/views/client/domain_transfers/show.haml b/app/views/client/domain_transfers/show.haml new file mode 100644 index 000000000..87141feab --- /dev/null +++ b/app/views/client/domain_transfers/show.haml @@ -0,0 +1,32 @@ +.row + .col-sm-6 + %h2.text-center-xs + = "#{t('shared.domain_transfer')}" + .col-sm-6 + %h2.text-right.text-center-xs + +%hr +.row + .col-md-12 + %dl.dl-horizontal + %dt= t('shared.domain') + %dd= @domain_transfer.domain.name + + %dt= t('shared.status') + %dd= @domain_transfer.status + + %dt= t('shared.transfer_requested_at') + %dd= l(@domain_transfer.transfer_requested_at) + + %dt= t('shared.transfer_from') + %dd= @domain_transfer.transfer_from + + - if @domain_transfer.transferred_at + %dt= t('shared.transferred_at') + %dd= l(@domain_transfer.transferred_at) + - else + %dt= t('shared.transfer_confirm_time') + %dd= l(@domain_transfer.transfer_confirm_time) + + %dt= t('shared.domain_valid_to') + %dd= l(@domain_transfer.domain.valid_to) diff --git a/app/views/client/domains/index.haml b/app/views/client/domains/index.haml index 9ce971c05..f71b63108 100644 --- a/app/views/client/domains/index.haml +++ b/app/views/client/domains/index.haml @@ -3,6 +3,7 @@ %h2.text-center-xs= t('shared.domains') .col-sm-6 %h2.text-right.text-center-xs + = link_to(t('shared.request_domain_transfer'), new_client_domain_transfer_path, class: 'btn btn-primary') = link_to(t('shared.add'), new_client_domain_path, class: 'btn btn-primary') %hr .row diff --git a/app/views/client/domains/show.haml b/app/views/client/domains/show.haml index 789de85ef..0e33254a7 100644 --- a/app/views/client/domains/show.haml +++ b/app/views/client/domains/show.haml @@ -4,6 +4,7 @@ = "#{t('shared.domain_details')}" .col-sm-6 %h2.text-right.text-center-xs + = link_to(t('shared.transfer'), new_client_domain_domain_transfer_path(@domain), class: 'btn btn-primary') = link_to(t('shared.edit'), edit_client_domain_path(@domain), class: 'btn btn-primary') = link_to(t('shared.delete'), client_domain_path(@domain), method: :delete, data: { confirm: t('shared.are_you_sure') }, class: 'btn btn-danger') diff --git a/app/views/layouts/client.haml b/app/views/layouts/client.haml index a6614f25b..cac014a7a 100644 --- a/app/views/layouts/client.haml +++ b/app/views/layouts/client.haml @@ -42,6 +42,8 @@ = link_to t('shared.check'), '#' %li = link_to t('shared.register'), '#' + %li + = link_to 'Admin', '/' %ul.nav.navbar-nav.navbar-right %li= link_to t('shared.log_out'), '/logout' / /.nav-collapse diff --git a/config/locales/en.yml b/config/locales/en.yml index 7194554d1..46fbb224c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -109,6 +109,13 @@ en: domain: <<: *epp_domain_ar_attributes + domain_transfer: + attributes: + base: + transfer_can_be_approved_only_by_current_registrar: 'Transfer can be approved only by current domain registrar' + domain: + not_found: 'Domain was not found' + nameserver: attributes: hostname: @@ -272,4 +279,15 @@ en: failed_to_update_setting: 'Failed to update setting' status: 'Status' eedirekt: 'EEDirekt' - + domain_transfer_requested: 'Domain transfer requested!' + other_registrar_has_already_requested_to_transfer_this_domain: 'Other registrar has already requested to transfer this domain.' + transfer: 'Transfer' + transfer_domain: 'Transfer domain' + failed_to_request_domain_transfer: 'Failed to request domain transfer' + domain_transfer: 'Domain transfer' + domain_valid_to: 'Domain valid to' + transfer_requested_at: 'Transfer requested at' + transfer_from: 'Transfer from' + transferred_at: 'Transferred at' + transfer_confirm_time: 'Transfer confirm time' + request_domain_transfer: 'Request domain transfer' diff --git a/config/routes.rb b/config/routes.rb index 1964e11d5..8943466f5 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -23,6 +23,7 @@ Rails.application.routes.draw do namespace(:client) do resources :domains + resources :domain_transfers resources :contacts do collection do