diff --git a/.codeclimate.yml b/.codeclimate.yml index 9df308022..be8f1df7a 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -23,6 +23,7 @@ exclude_patterns: - "bin/" - "config/" - "db/" + - "lib/" - "vendor/" - "test/" - "spec/" diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fe8f891a..4e75d8157 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ +20.06.2018 +* Bulk change function for technical contact replacement [#662](https://github.com/internetee/registry/issues/662) +* Removed vatcode and totalvat elements from directo request in attempt to fix invoice sending issue [#844](https://github.com/internetee/registry/issues/844) +* Regsitrar: added credit card payment option - disabled at the moment due to contractual reaons [#419](https://github.com/internetee/registry/issues/419) +* Registrant: enabled WHOIS requests over RestWHOIS API [#852](https://github.com/internetee/registry/issues/852) +* Fixed rspec configuration that caused test failures [#858](https://github.com/internetee/registry/issues/858) +* Admin: refactored date selection in pricelist [#869](https://github.com/internetee/registry/issues/869) +* Added uglifier gem for es6 compression [#864](https://github.com/internetee/registry/issues/864) +* Removed lib folder from autoload path [#859](https://github.com/internetee/registry/issues/859) +* test environment config improvements [#860](https://github.com/internetee/registry/issues/860) +* translation fixes [#865](https://github.com/internetee/registry/issues/865) +* removed obsolete .agignore [#866](https://github.com/internetee/registry/issues/866) +* removed rubocop gem [#857](https://github.com/internetee/registry/issues/857) +* new invoice payment test fix [#863](https://github.com/internetee/registry/issues/863) +* get puma gem config from Rails 5 [#867](https://github.com/internetee/registry/issues/867) +* Rails5 API controller temporary backport [#868](https://github.com/internetee/registry/issues/868) + 25.05.2018 * GDPR: updated whois templates with configurable disclaimer [#795](https://github.com/internetee/registry/issues/795) * GDPR: email forwarding solution to contact private domain registrants without revealing their email addresses [#824](https://github.com/internetee/registry/issues/824) diff --git a/Dockerfile b/Dockerfile index 480231fc2..bd0cbc07b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,23 +1,9 @@ -FROM ruby:2.3 +FROM internetee/ruby:2.3 MAINTAINER maciej.szlosarczyk@internet.ee -RUN apt-get update > /dev/null && apt-get install -y > /dev/null \ - build-essential \ - nodejs \ - imagemagick \ - postgresql-client - -RUN apt-get install -y > /dev/null \ - qt5-default \ - libqt5webkit5-dev \ - gstreamer1.0-plugins-base \ - gstreamer1.0-tools \ - qtdeclarative5-dev \ - gstreamer1.0-x - RUN mkdir -p /opt/webapps/app/tmp/pids WORKDIR /opt/webapps/app - COPY Gemfile Gemfile.lock ./ RUN gem install bundler && bundle install --jobs 20 --retry 5 + EXPOSE 3000 diff --git a/Gemfile b/Gemfile index 4073bd1e5..7682cdc4e 100644 --- a/Gemfile +++ b/Gemfile @@ -102,9 +102,6 @@ gem 'jquery-ui-rails', '5.0.5' gem 'active_model-errors_details' # Backport from Rails 5, https://github.com/rails/rails/pull/18322 group :development do - gem 'spring' - gem 'spring-commands-rspec' - # deploy gem 'mina', '0.3.1' # for fast deployment gem 'puma' @@ -120,10 +117,6 @@ group :development, :test do gem 'pry', '0.10.1' gem 'bullet', '4.14.7' # for finding database optimizations - gem 'bundler-audit' - gem 'brakeman', '3.6.1', require: false # for security audit' - # tmp, otherwise conflics with breakman - # gem 'html2haml', github: 'haml/html2haml', ref: '6984f50bdbbd6291535027726a5697f28778ee8d' gem 'html2haml', '2.1.0' gem 'sdoc', '0.4.1' # bundle exec rake doc:rails generates the API under doc/api. gem 'railroady', '1.3.0' # to generate database diagrams diff --git a/Gemfile.lock b/Gemfile.lock index de4749bd0..e108bde8f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -122,14 +122,10 @@ GEM bootstrap-sass (3.3.5.1) autoprefixer-rails (>= 5.0.0.1) sass (>= 3.3.0) - brakeman (3.6.1) builder (3.2.3) bullet (4.14.7) activesupport (>= 3.0.0) uniform_notifier (~> 1.9.0) - bundler-audit (0.5.0) - bundler (~> 1.2) - thor (~> 0.18) cancancan (1.11.0) capybara (2.14.0) addressable @@ -408,10 +404,6 @@ GEM sixarm_ruby_unaccent (1.1.1) slop (3.6.0) socksify (1.7.1) - spring (2.0.2) - activesupport (>= 4.2) - spring-commands-rspec (1.0.4) - spring (>= 0.9.1) sprockets (3.7.1) concurrent-ruby (~> 1.0) rack (> 1, < 3) @@ -466,9 +458,7 @@ DEPENDENCIES airbrake autodoc bootstrap-sass (= 3.3.5.1) - brakeman (= 3.6.1) bullet (= 4.14.7) - bundler-audit cancancan (= 1.11.0) capybara coderay (= 1.1.0) @@ -519,8 +509,6 @@ DEPENDENCIES selectize-rails (= 0.12.1) simplecov simpleidn (= 0.0.7) - spring - spring-commands-rspec uglifier uuidtools (= 2.1.5) validates_email_format_of (= 1.6.3) @@ -528,4 +516,4 @@ DEPENDENCIES whenever (= 0.9.4) BUNDLED WITH - 1.16.1 + 1.16.2 diff --git a/README.md b/README.md index a8a85a3d8..5beca0a87 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ Domain Registry =============== [![Build Status](https://travis-ci.org/internetee/registry.svg?branch=master)](https://travis-ci.org/internetee/registry) [![Code Climate](https://codeclimate.com/github/internetee/registry/badges/gpa.svg)](https://codeclimate.com/github/internetee/registry) -[![Issue Count](https://codeclimate.com/github/internetee/registry/badges/issue_count.svg)](https://codeclimate.com/github/internetee/registry) [![Test Coverage](https://codeclimate.com/github/internetee/registry/badges/coverage.svg)](https://codeclimate.com/github/internetee/registry/coverage) [![Documentation Status](https://readthedocs.org/projects/eeregistry/badge/?version=latest)](http://docs.internet.ee/en/latest/?badge=latest) @@ -31,7 +30,7 @@ Documentation Installation ------------ -### Registry app +### Registry app Registry based on Rails 4 installation (rbenv install is under Debian build doc) @@ -57,7 +56,7 @@ Manual demo install and database setup: tar -xzvf mod_epp-1.10.tar.gz cd mod_epp-1.10 -Patch mod_epp for Rack. Beacause Rack multipart parser expects specifically +Patch mod_epp for Rack. Beacause Rack multipart parser expects specifically formatted content boundaries, the mod_epp needs to be modified before building: wget https://github.com/internetee/registry/raw/master/doc/patches/mod_epp_1.10-rack-friendly.patch @@ -136,7 +135,7 @@ For Apache, registry admin goes to port 443 in production, /etc/apache2/sites-en ``` -Registrar configuration (/etc/apache2/sites-enabled/registrar.conf) is as follows: +Registrar configuration (/etc/apache2/sites-enabled/registrar.conf) is as follows: ``` ServerName your-registrar-domain @@ -179,7 +178,7 @@ Registrar configuration (/etc/apache2/sites-enabled/registrar.conf) is as follow # for Apache verison 2.4 or newer # Require all granted - + Options -MultiViews @@ -220,7 +219,7 @@ Registrar configuration (/etc/apache2/sites-enabled/registrar.conf) is as follow ``` -Registrant configuration (/etc/apache2/sites-enabled/registrant.conf) is as follows: +Registrant configuration (/etc/apache2/sites-enabled/registrant.conf) is as follows: ``` ServerName your-registrant-domain @@ -263,7 +262,7 @@ Registrant configuration (/etc/apache2/sites-enabled/registrant.conf) is as foll # for Apache verison 2.4 or newer # Require all granted - + Options -MultiViews @@ -271,11 +270,11 @@ Registrant configuration (/etc/apache2/sites-enabled/registrant.conf) is as foll Allow from none Deny from all - + Allow from all - + Allow from all @@ -342,8 +341,8 @@ For Apache, REPP goes to port 443 in production, /etc/apache2/sites-enabled/repp ``` -For Apache, epp goes to port 700. -Be sure to update paths to match your system configuration. +For Apache, epp goes to port 700. +Be sure to update paths to match your system configuration. /etc/apache2/sites-enabled/epp.conf short example: ```apache @@ -405,7 +404,7 @@ Be sure to update paths to match your system configuration. EPPSessionRoot /proxy/session EPPErrorRoot /proxy/error EPPRawFrame raw_frame - + ProxyPass /proxy/ http://localhost:8080/epp/ EPPAuthURI implicit @@ -421,7 +420,7 @@ Enable epp_ssl and restart apache Now you should see registry admin at https://your-domain -All registry demo data can be found at: +All registry demo data can be found at: db/seeds.rb @@ -464,4 +463,3 @@ Please follow EPP web client readme: Please follow WHOIS server readme: https://github.com/internetee/whois - diff --git a/app/models/concerns/contact/transferable.rb b/app/models/concerns/contact/transferable.rb index 14c1cac3c..3f151251a 100644 --- a/app/models/concerns/contact/transferable.rb +++ b/app/models/concerns/contact/transferable.rb @@ -16,6 +16,7 @@ module Concerns::Contact::Transferable new_contact.regenerate_code new_contact.regenerate_auth_info new_contact.remove_address unless self.class.address_processing? + new_contact.uuid = nil new_contact.save(validate: false) new_contact end diff --git a/app/models/sorted_country.rb b/app/models/sorted_country.rb index 19ad5f4f3..7b27adacb 100644 --- a/app/models/sorted_country.rb +++ b/app/models/sorted_country.rb @@ -18,7 +18,7 @@ class SortedCountry def quick_list @quick_list ||= [ - %w[Estonia' EE], + %w[Estonia EE], %w[Finland FI], %w[Latvia LV], %w[Lithuania LT], diff --git a/bin/rails b/bin/rails index 284b01d72..5191e6927 100755 --- a/bin/rails +++ b/bin/rails @@ -1,9 +1,4 @@ #!/usr/bin/env ruby -begin - load File.expand_path('../spring', __FILE__) -rescue LoadError - 'no spring' -end -APP_PATH = File.expand_path('../../config/application', __FILE__) +APP_PATH = File.expand_path('../../config/application', __FILE__) require_relative '../config/boot' require 'rails/commands' diff --git a/bin/rake b/bin/rake index 7b36ecbff..17240489f 100755 --- a/bin/rake +++ b/bin/rake @@ -1,9 +1,4 @@ #!/usr/bin/env ruby -begin - load File.expand_path('../spring', __FILE__) -rescue LoadError - 'no spring' -end require_relative '../config/boot' require 'rake' Rake.application.run diff --git a/bin/rspec b/bin/rspec index 534d2bb5f..8bc84617e 100755 --- a/bin/rspec +++ b/bin/rspec @@ -1,8 +1,4 @@ #!/usr/bin/env ruby -begin - load File.expand_path("../spring", __FILE__) -rescue LoadError -end # # This file was generated by Bundler. # diff --git a/bin/setup b/bin/setup new file mode 100644 index 000000000..acdb2c138 --- /dev/null +++ b/bin/setup @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +require 'pathname' + +# path to your application root. +APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) + +Dir.chdir APP_ROOT do + # This script is a starting point to setup your application. + # Add necessary setup steps to this file: + + puts "== Installing dependencies ==" + system "gem install bundler --conservative" + system "bundle check || bundle install" + + # puts "\n== Copying sample files ==" + # unless File.exist?("config/database.yml") + # system "cp config/database.yml.sample config/database.yml" + # end + + puts "\n== Preparing database ==" + system "bin/rake db:setup" + + puts "\n== Removing old logs and tempfiles ==" + system "rm -f log/*" + system "rm -rf tmp/cache" + + puts "\n== Restarting application server ==" + system "touch tmp/restart.txt" +end diff --git a/bin/spring b/bin/spring deleted file mode 100755 index 7b45d374f..000000000 --- a/bin/spring +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env ruby - -# This file loads spring without using Bundler, in order to be fast. -# It gets overwritten when you run the `spring binstub` command. - -unless defined?(Spring) - require "rubygems" - require "bundler" - - if match = Bundler.default_lockfile.read.match(/^GEM$.*?^ (?: )*spring \((.*?)\)$.*?^$/m) - Gem.paths = { "GEM_PATH" => [Bundler.bundle_path.to_s, *Gem.path].uniq } - gem "spring", match[1] - require "spring/binstub" - end -end diff --git a/config/environments/test.rb b/config/environments/test.rb index 3b82ee748..544370369 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -2,7 +2,7 @@ Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. config.cache_classes = true - config.eager_load = true + config.eager_load = false config.serve_static_files = true config.static_cache_control = 'public, max-age=3600' @@ -25,4 +25,4 @@ Rails.application.configure do config.cache_store = :memory_store end -Que.mode = :sync \ No newline at end of file +Que.mode = :sync diff --git a/config/spring.rb b/config/spring.rb deleted file mode 100644 index 12c701147..000000000 --- a/config/spring.rb +++ /dev/null @@ -1 +0,0 @@ -Spring.watch 'config/application.yml' diff --git a/db/migrate/20180612042234_enable_pgcrypto_ext.rb b/db/migrate/20180612042234_enable_pgcrypto_ext.rb new file mode 100644 index 000000000..4e8df65bf --- /dev/null +++ b/db/migrate/20180612042234_enable_pgcrypto_ext.rb @@ -0,0 +1,5 @@ +class EnablePgcryptoExt < ActiveRecord::Migration + def change + enable_extension 'pgcrypto' + end +end diff --git a/db/migrate/20180612042625_add_uuid_to_contacts.rb b/db/migrate/20180612042625_add_uuid_to_contacts.rb new file mode 100644 index 000000000..c80d60e71 --- /dev/null +++ b/db/migrate/20180612042625_add_uuid_to_contacts.rb @@ -0,0 +1,5 @@ +class AddUuidToContacts < ActiveRecord::Migration + def change + add_column :contacts, :uuid, :uuid, default: 'gen_random_uuid()' + end +end diff --git a/db/migrate/20180612042953_add_uuid_to_domains.rb b/db/migrate/20180612042953_add_uuid_to_domains.rb new file mode 100644 index 000000000..6ca609de3 --- /dev/null +++ b/db/migrate/20180612042953_add_uuid_to_domains.rb @@ -0,0 +1,5 @@ +class AddUuidToDomains < ActiveRecord::Migration + def change + add_column :domains, :uuid, :uuid, default: 'gen_random_uuid()' + end +end diff --git a/db/migrate/20180613030330_change_contacts_and_domains_uuid_to_not_null.rb b/db/migrate/20180613030330_change_contacts_and_domains_uuid_to_not_null.rb new file mode 100644 index 000000000..9d7641082 --- /dev/null +++ b/db/migrate/20180613030330_change_contacts_and_domains_uuid_to_not_null.rb @@ -0,0 +1,6 @@ +class ChangeContactsAndDomainsUuidToNotNull < ActiveRecord::Migration + def change + change_column_null :contacts, :uuid, false + change_column_null :domains, :uuid, false + end +end diff --git a/db/migrate/20180613045614_add_contacts_and_domains_uuid_uniq_constraint.rb b/db/migrate/20180613045614_add_contacts_and_domains_uuid_uniq_constraint.rb new file mode 100644 index 000000000..32b8fb090 --- /dev/null +++ b/db/migrate/20180613045614_add_contacts_and_domains_uuid_uniq_constraint.rb @@ -0,0 +1,16 @@ +# Unique constraint is needed to prevent accidental duplicate values in fixtures to appear in DB +class AddContactsAndDomainsUuidUniqConstraint < ActiveRecord::Migration + def up + execute <<-SQL + ALTER TABLE contacts ADD CONSTRAINT uniq_contact_uuid UNIQUE (uuid); + ALTER TABLE domains ADD CONSTRAINT uniq_domain_uuid UNIQUE (uuid); + SQL + end + + def down + execute <<-SQL + ALTER TABLE contacts DROP CONSTRAINT uniq_contact_uuid; + ALTER TABLE domains DROP CONSTRAINT uniq_domain_uuid; + SQL + end +end diff --git a/db/structure.sql b/db/structure.sql index c319b8e28..a6f0355a4 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -51,6 +51,20 @@ CREATE EXTENSION IF NOT EXISTS hstore WITH SCHEMA public; COMMENT ON EXTENSION hstore IS 'data type for storing sets of (key, value) pairs'; +-- +-- Name: pgcrypto; Type: EXTENSION; Schema: -; Owner: - +-- + +CREATE EXTENSION IF NOT EXISTS pgcrypto WITH SCHEMA public; + + +-- +-- Name: EXTENSION pgcrypto; Type: COMMENT; Schema: -; Owner: - +-- + +COMMENT ON EXTENSION pgcrypto IS 'cryptographic functions'; + + SET search_path = public, pg_catalog; -- @@ -625,7 +639,8 @@ CREATE TABLE contacts ( original_id integer, ident_updated_at timestamp without time zone, upid integer, - up_date timestamp without time zone + up_date timestamp without time zone, + uuid uuid DEFAULT gen_random_uuid() NOT NULL ); @@ -897,7 +912,8 @@ CREATE TABLE domains ( status_notes hstore, statuses_before_force_delete character varying[] DEFAULT '{}'::character varying[], upid integer, - up_date timestamp without time zone + up_date timestamp without time zone, + uuid uuid DEFAULT gen_random_uuid() NOT NULL ); @@ -3242,6 +3258,22 @@ ALTER TABLE ONLY settings ADD CONSTRAINT settings_pkey PRIMARY KEY (id); +-- +-- Name: uniq_contact_uuid; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- + +ALTER TABLE ONLY contacts + ADD CONSTRAINT uniq_contact_uuid UNIQUE (uuid); + + +-- +-- Name: uniq_domain_uuid; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- + +ALTER TABLE ONLY domains + ADD CONSTRAINT uniq_domain_uuid UNIQUE (uuid); + + -- -- Name: unique_code; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- @@ -4718,3 +4750,13 @@ INSERT INTO schema_migrations (version) VALUES ('20180331200125'); INSERT INTO schema_migrations (version) VALUES ('20180422154642'); +INSERT INTO schema_migrations (version) VALUES ('20180612042234'); + +INSERT INTO schema_migrations (version) VALUES ('20180612042625'); + +INSERT INTO schema_migrations (version) VALUES ('20180612042953'); + +INSERT INTO schema_migrations (version) VALUES ('20180613030330'); + +INSERT INTO schema_migrations (version) VALUES ('20180613045614'); + diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 5c5f523de..000000000 --- a/docker-compose.yml +++ /dev/null @@ -1,33 +0,0 @@ -version: "3.2" - -services: - app: - tty: true - stdin_open: true - build: - context: . - dockerfile: Dockerfile - links: - - db - environment: - - APP_DBHOST=db - volumes: - - .:/opt/webapps/app - ports: - - "3000:3000" - command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails server -p 3000 -b '0.0.0.0'" - - web: - image: nginx - volumes: - - ./docker/nginx.template:/etc/nginx/conf.d/nginx.template - ports: - - "80:80" - links: - - app - environment: - APP: 'app' - command: /bin/bash -c "envsubst '$$APP' < /etc/nginx/conf.d/nginx.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'" - - db: - image: postgres:9.4 diff --git a/docker/docker_dev.sh b/docker/docker_dev.sh deleted file mode 100755 index f5592517f..000000000 --- a/docker/docker_dev.sh +++ /dev/null @@ -1,6 +0,0 @@ -# /bin/sh -docker-compose down -docker-compose build -docker-compose run app rake db:setup:all -docker-compose run app rake db:migrate -docker-compose run app rake dev:prime diff --git a/docker/docker_test.sh b/docker/docker_test.sh deleted file mode 100755 index 7239f78a9..000000000 --- a/docker/docker_test.sh +++ /dev/null @@ -1,8 +0,0 @@ -# /bin/sh -docker-compose down -docker-compose build - -# Setup test database -docker-compose run app rake db:setup:all test -# Finally run tests to check if everything is in order -docker-compose run app rspec diff --git a/docker/nginx.template b/docker/nginx.template deleted file mode 100644 index 50f6e8548..000000000 --- a/docker/nginx.template +++ /dev/null @@ -1,29 +0,0 @@ -log_format le_json '{ "time": "$time_iso8601", ' - '"remote_addr": "$remote_addr", ' - '"remote_user": "$remote_user", ' - '"body_bytes_sent": "$body_bytes_sent", ' - '"request_time": "$request_time", ' - '"status": "$status", ' - '"request": "$request", ' - '"request_method": "$request_method", ' - '"http_referrer": "$http_referer", ' - '"http_user_agent": "$http_user_agent" }'; - -upstream app { - server ${APP}:3000; -} - -server { - listen 80; - - access_log /var/log/nginx/access.log le_json; - - location / { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header Host $http_host; - proxy_redirect off; - proxy_pass http://app; - break; - } -} diff --git a/lib/action_controller/api.rb b/lib/action_controller/api.rb new file mode 100644 index 000000000..5a9fd4512 --- /dev/null +++ b/lib/action_controller/api.rb @@ -0,0 +1,149 @@ +# frozen_string_literal: true + +require "action_view" +require "action_controller" +require "action_controller/log_subscriber" + +module ActionController + # API Controller is a lightweight version of ActionController::Base, + # created for applications that don't require all functionalities that a complete + # \Rails controller provides, allowing you to create controllers with just the + # features that you need for API only applications. + # + # An API Controller is different from a normal controller in the sense that + # by default it doesn't include a number of features that are usually required + # by browser access only: layouts and templates rendering, cookies, sessions, + # flash, assets, and so on. This makes the entire controller stack thinner, + # suitable for API applications. It doesn't mean you won't have such + # features if you need them: they're all available for you to include in + # your application, they're just not part of the default API controller stack. + # + # Normally, +ApplicationController+ is the only controller that inherits from + # ActionController::API. All other controllers in turn inherit from + # +ApplicationController+. + # + # A sample controller could look like this: + # + # class PostsController < ApplicationController + # def index + # posts = Post.all + # render json: posts + # end + # end + # + # Request, response, and parameters objects all work the exact same way as + # ActionController::Base. + # + # == Renders + # + # The default API Controller stack includes all renderers, which means you + # can use render :json and brothers freely in your controllers. Keep + # in mind that templates are not going to be rendered, so you need to ensure + # your controller is calling either render or redirect_to in + # all actions, otherwise it will return 204 No Content. + # + # def show + # post = Post.find(params[:id]) + # render json: post + # end + # + # == Redirects + # + # Redirects are used to move from one action to another. You can use the + # redirect_to method in your controllers in the same way as in + # ActionController::Base. For example: + # + # def create + # redirect_to root_url and return if not_authorized? + # # do stuff here + # end + # + # == Adding New Behavior + # + # In some scenarios you may want to add back some functionality provided by + # ActionController::Base that is not present by default in + # ActionController::API, for instance MimeResponds. This + # module gives you the respond_to method. Adding it is quite simple, + # you just need to include the module in a specific controller or in + # +ApplicationController+ in case you want it available in your entire + # application: + # + # class ApplicationController < ActionController::API + # include ActionController::MimeResponds + # end + # + # class PostsController < ApplicationController + # def index + # posts = Post.all + # + # respond_to do |format| + # format.json { render json: posts } + # format.xml { render xml: posts } + # end + # end + # end + # + # Make sure to check the modules included in ActionController::Base + # if you want to use any other functionality that is not provided + # by ActionController::API out of the box. + class API < Metal + abstract! + + # Shortcut helper that returns all the ActionController::API modules except + # the ones passed as arguments: + # + # class MyAPIBaseController < ActionController::Metal + # ActionController::API.without_modules(:ForceSSL, :UrlFor).each do |left| + # include left + # end + # end + # + # This gives better control over what you want to exclude and makes it easier + # to create an API controller class, instead of listing the modules required + # manually. + def self.without_modules(*modules) + modules = modules.map do |m| + m.is_a?(Symbol) ? ActionController.const_get(m) : m + end + + MODULES - modules + end + + MODULES = [ + AbstractController::Rendering, + + UrlFor, + Redirecting, + ApiRendering, + Renderers::All, + ConditionalGet, + BasicImplicitRender, + StrongParameters, + + ForceSSL, + DataStreaming, + + # Before callbacks should also be executed as early as possible, so + # also include them at the bottom. + AbstractController::Callbacks, + + # Append rescue at the bottom to wrap as much as possible. + Rescue, + + # Add instrumentations hooks at the bottom, to ensure they instrument + # all the methods properly. + Instrumentation, + + # Params wrapper should come before instrumentation so they are + # properly showed in logs + ParamsWrapper + ] + + MODULES.each do |mod| + include mod + end + + ActiveSupport.run_load_hooks(:action_controller_api, self) + ActiveSupport.run_load_hooks(:action_controller, self) + end +end diff --git a/lib/action_controller/api/api_rendering.rb b/lib/action_controller/api/api_rendering.rb new file mode 100644 index 000000000..52e9f60fc --- /dev/null +++ b/lib/action_controller/api/api_rendering.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +module ActionController + module ApiRendering + extend ActiveSupport::Concern + + included do + include Rendering + end + + def render_to_body(options = {}) + _process_options(options) + super + end + end +end \ No newline at end of file diff --git a/lib/action_controller/metal/basic_implicit_render.rb b/lib/action_controller/metal/basic_implicit_render.rb new file mode 100644 index 000000000..9030ea585 --- /dev/null +++ b/lib/action_controller/metal/basic_implicit_render.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module ActionController + module BasicImplicitRender # :nodoc: + def send_action(method, *args) + super.tap { default_render unless performed? } + end + + def default_render(*args) + head :no_content + end + end +end \ No newline at end of file diff --git a/lib/gem_ext/paper_trail.rb b/lib/gem_ext/paper_trail.rb index 200e71d48..c8454e550 100644 --- a/lib/gem_ext/paper_trail.rb +++ b/lib/gem_ext/paper_trail.rb @@ -6,7 +6,7 @@ PaperTrail::Version.module_eval do end # Store console and rake changes in versions -if defined?(::Rails::Console) || File.basename($PROGRAM_NAME).split(' ').first == 'spring' +if defined?(::Rails::Console) PaperTrail.whodunnit = "console-#{`whoami`.strip}" elsif File.basename($PROGRAM_NAME) == 'rake' # rake username does not work when spring enabled diff --git a/lib/rails5_api_controller_backport.rb b/lib/rails5_api_controller_backport.rb new file mode 100644 index 000000000..252332488 --- /dev/null +++ b/lib/rails5_api_controller_backport.rb @@ -0,0 +1,3 @@ +require_relative 'action_controller/metal/basic_implicit_render' +require_relative 'action_controller/api/api_rendering' +require_relative 'action_controller/api' \ No newline at end of file diff --git a/lib/tasks/dev.rake b/lib/tasks/dev.rake deleted file mode 100644 index 163e3ad1f..000000000 --- a/lib/tasks/dev.rake +++ /dev/null @@ -1,181 +0,0 @@ -namespace :dev do - desc 'Generates dummy data in development environment' \ - ' (options: [random] for random data generation - slowest)' - - task :prime, [:random] => :environment do |t, args| - abort 'Production environment is not supported' if Rails.env.production? - - include FactoryBot::Syntax::Methods - - PaperTrail.enabled = false - Domain.paper_trail_on! - Contact.paper_trail_on! - - with_random_data = args[:random].present? - - def create_domain(name:, registrar:, registrant:, account:, price:, reg_time:) - duration = price.duration.sub('mons', 'months').split("\s") - period = duration.first.to_i - period_unit = duration.second[0] - - create(:domain, - name: name, - period: period, - period_unit: period_unit, - registered_at: reg_time, - expire_time: reg_time + period.send(duration.second.to_sym), - created_at: reg_time, - updated_at: reg_time, - registrar: registrar, - registrant: registrant) - - create(:account_activity, - account: account, - sum: -price.price.amount, - activity_type: AccountActivity::CREATE, - created_at: reg_time, - updated_at: reg_time, - price: price) - end - - def generate_default_data - create(:admin_user, username: 'test', password: 'testtest', password_confirmation: 'testtest') - - zone = create(:zone, origin: 'test') - registrar = create(:registrar, name: 'test') - registrant = create(:registrant, name: 'test', registrar: registrar) - - account = create(:account, registrar: registrar, balance: 1_000_000) - api_user = create(:api_user, username: 'test', password: 'testtest', registrar: registrar) - - epp_session = EppSession.new - epp_session.session_id = 'test' - epp_session.user = api_user - epp_session.save! - - domain_counter = 1.step - - Billing::Price.durations.each do |duration| - Billing::Price.operation_categories.each do |operation_category| - price = create(:price, - price: Money.from_amount(duration.to_i * 10), - valid_from: Time.zone.now - rand(1).months, - valid_to: Time.zone.now + rand(1).months, - duration: duration, - operation_category: operation_category, - zone: zone) - - next if operation_category == 'renew' - - (rand(3) + 1).times do - create_domain(name: "test#{domain_counter.next}.test", - registrar: registrar, - registrant: registrant, - account: account, - price: price, - reg_time: 1.month.ago) - end - - (rand(3) + 1).times do - create_domain(name: "test#{domain_counter.next}.test", - registrar: registrar, - registrant: registrant, - account: account, - price: price, - reg_time: Time.zone.now) - end - end - end - - create_domain(name: 'test.test', - registrar: registrar, - registrant: registrant, - account: account, - price: Billing::Price.first, - reg_time: Time.zone.now) - end - - def generate_random_data - zone_count = 10 - admin_user_count = 5 - registrar_count = 50 - api_user_count = 10 - registrant_count = 50 - domain_count = 50 - registrars = [] - registrants = [] - zones = [] - registrant_names = [ - 'John Doe', - 'John Roe', - 'Jane Doe', - 'Jane Roe', - 'John Smith', - ] - - zone_count.times do - origin = SecureRandom.hex[0..(rand(5) + 1)] - zones << create(:zone, origin: origin) - end - - zone_origins = zones.collect { |zone| zone.origin } - - admin_user_count.times do - uid = SecureRandom.hex[0..(rand(5) + 1)] - create(:admin_user, username: "test#{uid}", password: 'testtest', password_confirmation: 'testtest') - end - - registrar_count.times do - uid = SecureRandom.hex[0..(rand(5) + 1)] - registrars << create(:registrar, name: "Acme Ltd. #{uid}") - end - - registrars.each do |registrar| - create(:account, registrar: registrar, balance: rand(99999)) - - api_user_count.times do |i| - create(:api_user, username: "test#{registrar.id}#{i}", password: 'testtest', registrar: registrar) - end - - registrant_count.times do |i| - registrants << create(:registrant, name: registrant_names.sample, registrar: registrar) - end - - domain_count.times do |i| - name = "test#{registrar.id}#{i}#{rand(99999)}.#{zone_origins.sample}" - period = rand(3) + 1 - - create(:domain, - name: name, - period: period, - period_unit: 'y', - registered_at: Time.zone.now, - expire_time: Time.zone.now + period.years, - registrar: registrar, - registrant: registrants.sample) - end - end - - zones.each do |zone| - Billing::Price.durations.each do |duration| - Billing::Price.operation_categories.each do |operation_category| - create(:price, - price: Money.from_amount(rand(10) + 1), - valid_from: Time.zone.now.beginning_of_day, - valid_to: Time.zone.now + (rand(10) + 1).years, - duration: duration, - operation_category: operation_category, - zone: zone) - end - end - end - end - - Setting.address_processing = false - - ActiveRecord::Base.transaction do - generate_default_data - generate_random_data if with_random_data - end - end -end diff --git a/test/fixtures/contacts.yml b/test/fixtures/contacts.yml index b64dce039..1f2e4b8da 100644 --- a/test/fixtures/contacts.yml +++ b/test/fixtures/contacts.yml @@ -8,6 +8,7 @@ john: registrar: bestnames code: john-001 auth_info: cacb5b + uuid: eb2f2766-b44c-4e14-9f16-32ab1a7cb957 william: &william name: William @@ -27,6 +28,7 @@ william: &william country_code: US statuses: - ok + uuid: 0aa54704-d6f7-4ca9-b8ca-2827d9a4e4eb jane: name: Jane @@ -38,6 +40,7 @@ jane: registrar: bestnames code: jane-001 auth_info: 0aa09f + uuid: 9db3de62-2414-4487-bee2-d5c155567768 acme_ltd: name: Acme Ltd @@ -49,6 +52,7 @@ acme_ltd: ident_country_code: US code: acme-ltd-001 auth_info: 720b3c + uuid: f1dd365c-5be9-4b3d-a44e-3fa002465e4d jack: name: Jack @@ -60,12 +64,14 @@ jack: ident_country_code: US code: jack-001 auth_info: e2c440 + uuid: 28b65455-6f1a-49fd-961c-0758886dbd75 identical_to_william: <<: *william registrar: goodnames code: william-002 auth_info: 5ab865 + uuid: c0a191d5-3793-4f0b-8f85-491612d0293e not_in_use: name: Useless @@ -73,6 +79,7 @@ not_in_use: registrar: bestnames code: useless-001 auth_info: e75a2a + uuid: ca613cc5-a8dc-48c1-8d32-d3c6a0b6c952 invalid: name: any @@ -80,3 +87,4 @@ invalid: email: invalid@invalid.test auth_info: any registrar: bestnames + uuid: bd80c0f9-26ee-49e0-a2cb-2311d931c433 \ No newline at end of file diff --git a/test/fixtures/domains.yml b/test/fixtures/domains.yml index 53de2837b..59a1b8ea5 100644 --- a/test/fixtures/domains.yml +++ b/test/fixtures/domains.yml @@ -7,6 +7,7 @@ shop: valid_to: 2010-07-05 period: 1 period_unit: m + uuid: 1b3ee442-e8fe-4922-9492-8fcb9dccc69c airport: name: airport.test @@ -17,6 +18,7 @@ airport: valid_to: 2010-07-05 period: 1 period_unit: m + uuid: 2df2c1a1-8f6a-490a-81be-8bdf29866880 library: name: library.test @@ -27,6 +29,7 @@ library: valid_to: 2010-07-05 period: 1 period_unit: m + uuid: 647bcc48-8d5e-4a04-8ce5-2a3cd17b6eab metro: name: metro.test @@ -37,6 +40,7 @@ metro: valid_to: 2010-07-05 period: 1 period_unit: m + uuid: ef97cb80-333b-4893-b9df-163f2b452798 invalid: name: invalid.test @@ -44,3 +48,4 @@ invalid: valid_to: <%= Time.zone.parse('2010-07-05').utc.to_s(:db) %> registrar: bestnames registrant: invalid + uuid: 3c430ead-bb17-4b5b-aaa1-caa7dde7e138 \ No newline at end of file