devise-2fa 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.circleci/config.yml +46 -0
- data/.gitignore +8 -0
- data/Gemfile +3 -22
- data/README.md +13 -14
- data/Rakefile +6 -28
- data/bin/rspec +10 -0
- data/bin/setup +12 -0
- data/{devise-2fa.gemspec → devise_2fa.gemspec} +15 -8
- data/lib/devise-2fa/version.rb +1 -1
- data/lib/devise_two_factorable/models/two_factorable.rb +5 -1
- data/{test → spec}/dummy/Rakefile +2 -3
- data/{test/dummy/app/mailers/.gitkeep → spec/dummy/app/assets/images/.keep} +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +3 -0
- data/{test/dummy/lib/assets/.gitkeep → spec/dummy/app/assets/javascripts/channels/.keep} +0 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/{test → spec}/dummy/app/controllers/application_controller.rb +4 -1
- data/{test/dummy/public/favicon.ico → spec/dummy/app/controllers/concerns/.keep} +0 -0
- data/{test → spec}/dummy/app/helpers/application_helper.rb +0 -0
- data/spec/dummy/app/models/application_record.rb +3 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/models/user.rb +6 -0
- data/spec/dummy/app/views/layouts/application.html.erb +19 -0
- data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +25 -0
- data/spec/dummy/bin/update +25 -0
- data/spec/dummy/bin/yarn +11 -0
- data/spec/dummy/config.ru +5 -0
- data/spec/dummy/config/application.rb +14 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/{test → spec}/dummy/config/database.yml +10 -10
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +61 -0
- data/{test → spec}/dummy/config/environments/test.rb +15 -5
- data/spec/dummy/config/initializers/assets.rb +4 -0
- data/{test → spec}/dummy/config/initializers/backtrace_silencers.rb +0 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/{test → spec}/dummy/config/initializers/devise.rb +134 -56
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/{test → spec}/dummy/config/initializers/inflections.rb +6 -5
- data/{test → spec}/dummy/config/initializers/mime_types.rb +0 -1
- data/{test → spec}/dummy/config/initializers/wrap_parameters.rb +5 -5
- data/spec/dummy/config/locales/devise.en.yml +68 -0
- data/spec/dummy/config/locales/devise.two_factor.en.yml +57 -0
- data/spec/dummy/config/locales/en.yml +2 -0
- data/spec/dummy/config/puma.rb +9 -0
- data/spec/dummy/config/routes.rb +4 -0
- data/spec/dummy/config/spring.rb +6 -0
- data/spec/dummy/config/storage.yml +8 -0
- data/spec/dummy/db/migrate/20190311184605_devise_create_users.rb +44 -0
- data/{test/dummy/db/migrate/20130131160351_devise_otp_add_to_users.rb → spec/dummy/db/migrate/20190312222952_devise_two_factor_add_to_users.rb} +4 -5
- data/spec/dummy/db/schema.rb +39 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/package.json +5 -0
- data/spec/dummy/public/404.html +1 -0
- data/spec/dummy/public/422.html +1 -0
- data/spec/dummy/public/500.html +19 -0
- data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
- data/spec/dummy/public/apple-touch-icon.png +0 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/storage/.keep +0 -0
- data/spec/models/user_spec.rb +33 -0
- data/spec/spec_helper.rb +69 -0
- data/spec/system/persistence_spec.rb +59 -0
- data/spec/system/refresh_spec.rb +100 -0
- data/spec/system/token_spec.rb +41 -0
- data/spec/system/users_spec.rb +98 -0
- metadata +213 -123
- data/.travis.yml +0 -28
- data/lib/devise_two_factorable/two_factorable.rb +0 -131
- data/test/dummy/README.rdoc +0 -261
- data/test/dummy/app/assets/javascripts/application.js +0 -13
- data/test/dummy/app/assets/stylesheets/application.css +0 -13
- data/test/dummy/app/controllers/posts_controller.rb +0 -83
- data/test/dummy/app/helpers/posts_helper.rb +0 -2
- data/test/dummy/app/models/post.rb +0 -2
- data/test/dummy/app/models/user.rb +0 -20
- data/test/dummy/app/views/layouts/application.html.erb +0 -14
- data/test/dummy/app/views/posts/_form.html.erb +0 -25
- data/test/dummy/app/views/posts/edit.html.erb +0 -6
- data/test/dummy/app/views/posts/index.html.erb +0 -25
- data/test/dummy/app/views/posts/new.html.erb +0 -5
- data/test/dummy/app/views/posts/show.html.erb +0 -15
- data/test/dummy/config.ru +0 -4
- data/test/dummy/config/application.rb +0 -67
- data/test/dummy/config/boot.rb +0 -10
- data/test/dummy/config/environment.rb +0 -5
- data/test/dummy/config/environments/development.rb +0 -37
- data/test/dummy/config/environments/production.rb +0 -73
- data/test/dummy/config/initializers/secret_token.rb +0 -8
- data/test/dummy/config/initializers/session_store.rb +0 -8
- data/test/dummy/config/locales/en.yml +0 -5
- data/test/dummy/config/routes.rb +0 -6
- data/test/dummy/db/migrate/20130125101430_create_users.rb +0 -9
- data/test/dummy/db/migrate/20130131092406_add_devise_to_users.rb +0 -52
- data/test/dummy/db/migrate/20130131142320_create_posts.rb +0 -10
- data/test/dummy/public/404.html +0 -26
- data/test/dummy/public/422.html +0 -26
- data/test/dummy/public/500.html +0 -25
- data/test/dummy/script/rails +0 -6
- data/test/integration/persistence_test.rb +0 -63
- data/test/integration/refresh_test.rb +0 -103
- data/test/integration/sign_in_test.rb +0 -85
- data/test/integration/token_test.rb +0 -30
- data/test/integration_tests_helper.rb +0 -64
- data/test/model_tests_helper.rb +0 -20
- data/test/models/two_factorable_test.rb +0 -120
- data/test/orm/active_record.rb +0 -4
- data/test/orm/mongoid.rb +0 -13
- data/test/support/mongoid.yml +0 -6
- data/test/support/symmetric_encryption.yml +0 -70
- data/test/test_helper.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 83df80ebf1e6b543d6ac9e53d8577e70d727323312ea8748d5709fc8cd6fb491
|
4
|
+
data.tar.gz: ee76f7c9922b69ba53fe2fd13b6409a241c4da93d6ec89b47f6b2384409a1ee7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0e799896dc4f81b392382af681bb1aa346bb1271a61c85c243231b2045a58674ac552ecce6dbefbaef9198f5bc5d967426fec3acc9ac64ced888c244c5895275
|
7
|
+
data.tar.gz: 88e4f90b42ea6447f90f6d3e0a96814ee161fd859266dcdca7a89418855eaf637d5420e1c2fb7982b95684f73d188bd49ff97c7b7d058eff1213d47b800ac948
|
@@ -0,0 +1,46 @@
|
|
1
|
+
version: 2
|
2
|
+
jobs:
|
3
|
+
build:
|
4
|
+
docker:
|
5
|
+
- image: circleci/ruby:2.4.1-node-browsers
|
6
|
+
|
7
|
+
working_directory: ~/repo
|
8
|
+
|
9
|
+
steps:
|
10
|
+
- checkout
|
11
|
+
|
12
|
+
- restore_cache:
|
13
|
+
keys:
|
14
|
+
- v1-dependencies-{{ checksum "Gemfile.lock" }}
|
15
|
+
- v1-dependencies-
|
16
|
+
|
17
|
+
- run:
|
18
|
+
name: install dependencies
|
19
|
+
command: |
|
20
|
+
bundle install --jobs=4 --retry=3 --path vendor/bundle
|
21
|
+
|
22
|
+
- save_cache:
|
23
|
+
paths:
|
24
|
+
- ./vendor/bundle
|
25
|
+
key: v1-dependencies-{{ checksum "Gemfile.lock" }}
|
26
|
+
|
27
|
+
- run: cd spec/dummy && bin/setup
|
28
|
+
|
29
|
+
- run:
|
30
|
+
name: run tests
|
31
|
+
command: |
|
32
|
+
mkdir /tmp/test-results
|
33
|
+
TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | \
|
34
|
+
circleci tests split --split-by=timings)"
|
35
|
+
|
36
|
+
bundle exec rspec \
|
37
|
+
--format progress \
|
38
|
+
--out /tmp/test-results/rspec.xml \
|
39
|
+
--format progress \
|
40
|
+
$TEST_FILES
|
41
|
+
|
42
|
+
- store_test_results:
|
43
|
+
path: /tmp/test-results
|
44
|
+
- store_artifacts:
|
45
|
+
path: /tmp/test-results
|
46
|
+
destination: test-results
|
data/.gitignore
CHANGED
@@ -34,3 +34,11 @@ build/
|
|
34
34
|
|
35
35
|
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
36
36
|
.rvmrc
|
37
|
+
|
38
|
+
# Rails
|
39
|
+
spec/dummy/db/development.sqlite3
|
40
|
+
spec/dummy/log/*
|
41
|
+
spec/dummy/db/test.sqlite3
|
42
|
+
*.cache
|
43
|
+
spec/dummy/tmp/development_secret.txt
|
44
|
+
spec/dummy/tmp/restart.txt
|
data/Gemfile
CHANGED
@@ -1,25 +1,6 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
source 'https://rubygems.org'
|
4
|
+
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
|
2
5
|
|
3
6
|
gemspec
|
4
|
-
|
5
|
-
gem 'rdoc'
|
6
|
-
|
7
|
-
group :test do
|
8
|
-
platforms :jruby do
|
9
|
-
gem 'activerecord-jdbcsqlite3-adapter', '>= 1.3.0.beta1'
|
10
|
-
end
|
11
|
-
|
12
|
-
platforms :ruby do
|
13
|
-
gem 'sqlite3', '~> 1.3.4'
|
14
|
-
end
|
15
|
-
|
16
|
-
gem 'devise', '~> 4.0'
|
17
|
-
gem 'activerecord', '~> 4.2.6'
|
18
|
-
gem 'mongo'
|
19
|
-
|
20
|
-
gem 'capybara'
|
21
|
-
gem 'shoulda'
|
22
|
-
gem 'selenium-webdriver'
|
23
|
-
|
24
|
-
gem 'minitest-reporters', '>= 0.5.0'
|
25
|
-
end
|
data/README.md
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
# Devise::TwoFactor
|
2
|
-
|
2
|
+
|
3
|
+
[](https://circleci.com/gh/williamatodd/devise-2fa)
|
3
4
|
|
4
5
|
Devise TwoFactor implements two-factor authentication for Devise, using an rfc6238 compatible Time-Based One-Time Password Algorithm.
|
5
|
-
* Uses [rotp
|
6
|
+
* Uses [rotp](https://github.com/mdp/rotp) for the generation and verification of codes.
|
6
7
|
* Uses [RQRCode](https://github.com/whomwah/rqrcode) to generate QR Code PNGs.
|
7
|
-
* Uses [SymmetricEncryption](https://github.com/rocketjob/symmetric-encryption) to
|
8
|
+
* Uses [SymmetricEncryption](https://github.com/rocketjob/symmetric-encryption) to encrypt secrets and recovery codes.
|
8
9
|
|
9
10
|
It currently has the following features:
|
10
11
|
|
@@ -19,17 +20,6 @@ Compatible token devices are:
|
|
19
20
|
* [Google Authenticator](https://code.google.com/p/google-authenticator/)
|
20
21
|
* [FreeOTP](https://fedorahosted.org/freeotp/)
|
21
22
|
|
22
|
-
## Quick overview of Two Factors Authentication, using OTPs.
|
23
|
-
|
24
|
-
* A shared secret is generated on the server, and stored both on the token device (eg: the phone) and the server itself.
|
25
|
-
* The secret is used to generate short numerical tokens that are either time or sequence based.
|
26
|
-
* Tokens can be generated on a phone without internet connectivity.
|
27
|
-
* The token provides an additional layer of security against password theft.
|
28
|
-
* OTP's should always be used as a second factor of authentication(if your phone is lost, you account is still secured with a password)
|
29
|
-
|
30
|
-
Although there's an adjustable drift window, it is important that both the server and the token device (phone) have their clocks set (eg: using NTP).
|
31
|
-
|
32
|
-
|
33
23
|
## Installation
|
34
24
|
|
35
25
|
Setup the symmetric-encryption gem by following the steps on the (configuration page)[http://rocketjob.github.io/symmetric-encryption/configuration.html]
|
@@ -98,6 +88,7 @@ With this extension enabled, the following is expected behavior:
|
|
98
88
|
* Users may go to _/MODEL/token_ and enable their OTP state, they might be asked to provide their password again (and OTP token, if it's enabled)
|
99
89
|
* Once enabled they're shown an alphanumeric code (for manual provisioning) and a QR code, for automatic provisioning of their authentication device (for instance, Google Authenticator)
|
100
90
|
* If config.otp_mandatory or model_instance.otp_mandatory, users will be required to enable, and provision, next time they successfully sign-in.
|
91
|
+
* Although there's an adjustable drift window, it is important that both the server and the token device (phone) have their clocks set (eg: using NTP).
|
101
92
|
|
102
93
|
|
103
94
|
### Configuration Options
|
@@ -112,6 +103,12 @@ The install generator adds some options to the end of your Devise config file (c
|
|
112
103
|
* `config.otp_trust_persistence` - The user is allowed to set his browser as "trusted", no more OTP challenges will be asked for that browser, for a limited time. (default: `1.month`, set to false to disable setting the browser as trusted)
|
113
104
|
* `config.otp_issuer` - The name of the token issuer, to be added to the provisioning url. Display will vary based on token application. (defaults to the Rails application class)
|
114
105
|
|
106
|
+
### Development
|
107
|
+
|
108
|
+
Set up the gem for development with `bin/setup`.
|
109
|
+
|
110
|
+
Run the test suite with `bin/rspec`.
|
111
|
+
|
115
112
|
## Contributing
|
116
113
|
|
117
114
|
1. Fork it
|
@@ -128,3 +125,5 @@ This extension is a hodgepodge of
|
|
128
125
|
## License
|
129
126
|
|
130
127
|
MIT Licensed
|
128
|
+
|
129
|
+
Copyright © 2015-2019 William A. Todd and contributors.
|
data/Rakefile
CHANGED
@@ -1,41 +1,19 @@
|
|
1
|
-
#!/usr/bin/env rake
|
2
1
|
begin
|
3
2
|
require 'bundler/setup'
|
4
3
|
rescue LoadError
|
5
4
|
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
5
|
end
|
7
|
-
|
8
|
-
|
9
|
-
rescue LoadError
|
10
|
-
require 'rdoc/rdoc'
|
11
|
-
require 'rake/rdoctask'
|
12
|
-
RDoc::Task = Rake::RDocTask
|
13
|
-
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
14
8
|
|
15
9
|
RDoc::Task.new(:rdoc) do |rdoc|
|
16
10
|
rdoc.rdoc_dir = 'rdoc'
|
17
|
-
rdoc.title = '
|
11
|
+
rdoc.title = 'Devise::TwoFactor'
|
18
12
|
rdoc.options << '--line-numbers'
|
19
|
-
rdoc.rdoc_files.include('README.
|
13
|
+
rdoc.rdoc_files.include('README.md')
|
20
14
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
21
15
|
end
|
22
16
|
|
23
|
-
|
24
|
-
|
25
|
-
require 'rake/testtask'
|
26
|
-
Rake::TestTask.new(:test) do |test|
|
27
|
-
test.libs << 'lib' << 'test'
|
28
|
-
test.pattern = 'test/**/*_test.rb'
|
29
|
-
test.verbose = true
|
30
|
-
end
|
31
|
-
|
32
|
-
desc 'Run Devise tests for all ORMs.'
|
33
|
-
task :tests do
|
34
|
-
Dir[File.join(File.dirname(__FILE__), 'test', 'orm', '*.rb')].each do |file|
|
35
|
-
orm = File.basename(file).split('.').first
|
36
|
-
system "rake test DEVISE_ORM=#{orm}"
|
37
|
-
end
|
38
|
-
end
|
17
|
+
require 'bundler/gem_tasks'
|
39
18
|
|
40
|
-
|
41
|
-
task default: :tests
|
19
|
+
task default: :rdoc
|
data/bin/rspec
ADDED
data/bin/setup
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
# Fail out, bail out
|
4
|
+
set -e
|
5
|
+
|
6
|
+
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
7
|
+
|
8
|
+
echo "Installing dependencies"
|
9
|
+
gem install bundler --conservative
|
10
|
+
bundle check || bundle install
|
11
|
+
|
12
|
+
$DIR/../spec/dummy/bin/setup
|
@@ -1,27 +1,34 @@
|
|
1
|
-
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'devise-2fa/version'
|
1
|
+
$:.push File.expand_path("lib", __dir__)
|
5
2
|
|
3
|
+
# Maintain your gem's version:
|
4
|
+
require "devise-2fa/version"
|
5
|
+
|
6
|
+
# Describe your gem and declare its dependencies:
|
6
7
|
Gem::Specification.new do |gem|
|
7
8
|
gem.name = 'devise-2fa'
|
8
9
|
gem.version = Devise::TwoFactor::VERSION
|
9
10
|
gem.authors = ['William A. Todd']
|
10
|
-
gem.email = ['info@
|
11
|
+
gem.email = ['info@rockcreek.io']
|
11
12
|
gem.description = 'Time Based OTP/rfc6238 authentication for Devise'
|
12
13
|
gem.summary = 'Includes ActiveRecord and Mongoid ORM support'
|
13
14
|
gem.homepage = 'http://www.github.com/williamatodd/devise-2fa'
|
14
15
|
gem.license = 'MIT'
|
15
16
|
|
16
17
|
gem.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
17
|
-
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
18
18
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
19
|
gem.require_paths = ['lib']
|
20
20
|
|
21
|
+
gem.add_dependency "rails", "~> 5.0"
|
22
|
+
|
21
23
|
gem.add_runtime_dependency 'devise', '~> 4.0'
|
22
24
|
gem.add_runtime_dependency 'rotp', '~> 3.0'
|
23
25
|
gem.add_runtime_dependency 'rqrcode', '~> 0.10.1'
|
24
|
-
gem.add_runtime_dependency 'symmetric-encryption', '~>
|
26
|
+
gem.add_runtime_dependency 'symmetric-encryption', '~> 4.2.0'
|
25
27
|
|
26
|
-
gem.add_development_dependency 'sqlite3', '~>
|
28
|
+
gem.add_development_dependency 'sqlite3', '~> 1.3.6'
|
29
|
+
gem.add_development_dependency 'selenium-webdriver'
|
30
|
+
gem.add_development_dependency 'rspec-rails'
|
31
|
+
gem.add_development_dependency 'capybara'
|
32
|
+
gem.add_development_dependency 'rspec'
|
33
|
+
gem.add_development_dependency 'pry'
|
27
34
|
end
|
data/lib/devise-2fa/version.rb
CHANGED
@@ -7,7 +7,11 @@ module Devise::Models
|
|
7
7
|
included do
|
8
8
|
before_validation :generate_otp_auth_secret, on: :create
|
9
9
|
before_validation :generate_otp_persistence_seed, on: :create
|
10
|
-
|
10
|
+
if defined?(ActiveRecord) && self < ActiveRecord::Base
|
11
|
+
scope :with_valid_otp_challenge, ->{ where(User.arel_table[:otp_challenge_expires].gt(Time.current)) }
|
12
|
+
else # Mongoid
|
13
|
+
scope :with_valid_otp_challenge, ->{ where(:otp_challenge_expires.gt => Time.current) }
|
14
|
+
end
|
11
15
|
end
|
12
16
|
|
13
17
|
module ClassMethods
|
@@ -1,7 +1,6 @@
|
|
1
|
-
#!/usr/bin/env rake
|
2
1
|
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
3
2
|
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
4
3
|
|
5
|
-
|
4
|
+
require_relative 'config/application'
|
6
5
|
|
7
|
-
|
6
|
+
Rails.application.load_tasks
|
File without changes
|
File without changes
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
|
10
|
+
* files in this directory. Styles in this file should be added after the last require_* statement.
|
11
|
+
* It is generally better to create a new file per style scope.
|
12
|
+
*
|
13
|
+
*= require_tree .
|
14
|
+
*= require_self
|
15
|
+
*/
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,6 @@
|
|
1
|
+
class User < ApplicationRecord
|
2
|
+
# Include default devise modules. Others available are:
|
3
|
+
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
|
4
|
+
devise :two_factorable, :database_authenticatable, :registerable,
|
5
|
+
:recoverable, :rememberable, :validatable
|
6
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<p class="notice"><%= notice %></p>
|
5
|
+
<p class="alert"><%= alert %></p>
|
6
|
+
|
7
|
+
<title>Dummy</title>
|
8
|
+
<%= csrf_meta_tags %>
|
9
|
+
<%= csp_meta_tag %>
|
10
|
+
|
11
|
+
<%= stylesheet_link_tag 'application', media: 'all' %>
|
12
|
+
<%= javascript_include_tag 'application' %>
|
13
|
+
</head>
|
14
|
+
|
15
|
+
<body>
|
16
|
+
<%= link_to('Logout', destroy_user_session_path, method: :delete) %>
|
17
|
+
<%= yield %>
|
18
|
+
</body>
|
19
|
+
</html>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= yield %>
|
data/spec/dummy/bin/rake
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'fileutils'
|
3
|
+
include FileUtils
|
4
|
+
|
5
|
+
# path to your application root.
|
6
|
+
APP_ROOT = File.expand_path('..', __dir__)
|
7
|
+
|
8
|
+
def system!(*args)
|
9
|
+
system(*args) || abort("\n== Command #{args} failed ==")
|
10
|
+
end
|
11
|
+
|
12
|
+
chdir APP_ROOT do
|
13
|
+
puts '== Installing dependencies =='
|
14
|
+
system! 'gem install bundler --conservative'
|
15
|
+
system('bundle check') || system!('bundle install')
|
16
|
+
|
17
|
+
puts "\n== Preparing database =="
|
18
|
+
system! 'bin/rails db:setup'
|
19
|
+
|
20
|
+
puts "\n== Removing old logs and tempfiles =="
|
21
|
+
system! 'bin/rails log:clear tmp:clear'
|
22
|
+
|
23
|
+
puts "\n== Restarting application server =="
|
24
|
+
system! 'bin/rails restart'
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'fileutils'
|
3
|
+
include FileUtils
|
4
|
+
|
5
|
+
# path to your application root.
|
6
|
+
APP_ROOT = File.expand_path('..', __dir__)
|
7
|
+
|
8
|
+
def system!(*args)
|
9
|
+
system(*args) || abort("\n== Command #{args} failed ==")
|
10
|
+
end
|
11
|
+
|
12
|
+
chdir APP_ROOT do
|
13
|
+
puts '== Installing dependencies =='
|
14
|
+
system! 'gem install bundler --conservative'
|
15
|
+
system('bundle check') || system!('bundle install')
|
16
|
+
|
17
|
+
puts "\n== Updating database =="
|
18
|
+
system! 'bin/rails db:migrate'
|
19
|
+
|
20
|
+
puts "\n== Removing old logs and tempfiles =="
|
21
|
+
system! 'bin/rails log:clear tmp:clear'
|
22
|
+
|
23
|
+
puts "\n== Restarting application server =="
|
24
|
+
system! 'bin/rails restart'
|
25
|
+
end
|