bullion 0.1.3 → 0.3.1

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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.roxanne.yml +14 -0
  3. data/.rspec +0 -1
  4. data/.rubocop.yml +25 -6
  5. data/.ruby-version +1 -0
  6. data/Dockerfile +6 -16
  7. data/Gemfile +1 -1
  8. data/Gemfile.lock +99 -89
  9. data/README.md +2 -2
  10. data/Rakefile +57 -39
  11. data/bin/console +3 -3
  12. data/bullion.gemspec +38 -36
  13. data/config/puma.rb +1 -1
  14. data/config.ru +5 -5
  15. data/db/migrate/20210104060422_create_certificates.rb +1 -1
  16. data/db/migrate/20210105060406_create_orders.rb +1 -1
  17. data/db/migrate/20210106052306_create_authorizations.rb +1 -1
  18. data/db/schema.rb +20 -21
  19. data/lib/bullion/acme/error.rb +9 -9
  20. data/lib/bullion/challenge_client.rb +4 -4
  21. data/lib/bullion/challenge_clients/dns.rb +34 -22
  22. data/lib/bullion/challenge_clients/http.rb +12 -8
  23. data/lib/bullion/helpers/acme.rb +30 -40
  24. data/lib/bullion/helpers/service.rb +2 -2
  25. data/lib/bullion/helpers/ssl.rb +50 -42
  26. data/lib/bullion/models/account.rb +3 -3
  27. data/lib/bullion/models/authorization.rb +1 -1
  28. data/lib/bullion/models/certificate.rb +3 -3
  29. data/lib/bullion/models/challenge.rb +12 -5
  30. data/lib/bullion/models/nonce.rb +1 -1
  31. data/lib/bullion/models/order.rb +1 -1
  32. data/lib/bullion/models.rb +6 -6
  33. data/lib/bullion/rspec/challenge_clients/dns.rb +22 -0
  34. data/lib/bullion/rspec/challenge_clients/http.rb +16 -0
  35. data/lib/bullion/service.rb +3 -2
  36. data/lib/bullion/services/ca.rb +107 -91
  37. data/lib/bullion/services/ping.rb +6 -6
  38. data/lib/bullion/version.rb +3 -3
  39. data/lib/bullion.rb +58 -45
  40. data/scripts/build.sh +3 -0
  41. data/scripts/release.sh +9 -0
  42. data/scripts/test.sh +6 -0
  43. metadata +65 -30
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 593707ee0875636704bc97eb1a384705165b91df8df9603f579f3ec0520604a4
4
- data.tar.gz: f4605392c33a44eb1a39e06ec1a1bfb72b1746a8120eadfd9064cdf1dfb554a4
3
+ metadata.gz: f1897a626efbdecba9680874c7c3266b74bcfdbbe75e6b9646876cdac0951166
4
+ data.tar.gz: 9615ce0ee849c308eb6c0e19ca265e08f2794decb0b204fe1d3b4ed0896e7705
5
5
  SHA512:
6
- metadata.gz: 77a51b885d00586cf3550aad568687652b84c8072904144ccf2fe185ed0c04126036337c06f5f8a6719e19a6a62159ea496133af4c9894fe0327ab4cbcb2eb04
7
- data.tar.gz: 9d393200ce899d507489b76c0a0093b9547230958ea3a0bebf7be33e88ada915f9a76a5f232416095fc1acae77cd45bb6863248a523942d49f9c380f539002ac
6
+ metadata.gz: f78395c368c1b52af2cf043615c89925697f48faf40d7fa5623198b44b14eece6085d7a49d00bbaff53c7e4d24dafe2fb8fb65fc7f788a872de98c3a75e6aa2a
7
+ data.tar.gz: d89899a9513543bbba121496a4c214f96ee327e98d7993c5806b436a32e2c16256dc9296f82fa74ab3a558ddaba8755dd895c8534a07e77580f5b964efbad118
data/.roxanne.yml ADDED
@@ -0,0 +1,14 @@
1
+ version: 1.0
2
+ stages:
3
+ build:
4
+ image: docker:latest
5
+ scripts:
6
+ - ./scripts/build.sh
7
+ test:
8
+ image: ruby:3.1
9
+ scripts:
10
+ - ./scripts/test.sh
11
+ release:
12
+ image: ruby:3.1
13
+ only:
14
+ - main
data/.rspec CHANGED
@@ -1,3 +1,2 @@
1
1
  --format documentation
2
2
  --color
3
- --require spec_helper
data/.rubocop.yml CHANGED
@@ -3,18 +3,18 @@ Layout/LineLength:
3
3
 
4
4
  AllCops:
5
5
  Exclude:
6
- - 'spec/**/*_spec.rb'
7
- - 'db/schema.rb'
8
- - 'vendor/**/*'
9
- TargetRubyVersion: 2.6
6
+ - 'db/schema.rb'
7
+ - 'vendor/**/*'
8
+ TargetRubyVersion: 3.1
10
9
  NewCops: enable
11
10
 
12
11
  Metrics/AbcSize:
13
12
  Max: 21
14
13
 
15
14
  Metrics/BlockLength:
16
- Max: 30
15
+ Max: 35
17
16
  Exclude:
17
+ - 'spec/**/*_spec.rb'
18
18
  - 'Rakefile'
19
19
  - '*.gemspec'
20
20
 
@@ -22,10 +22,29 @@ Metrics/MethodLength:
22
22
  Max: 20
23
23
 
24
24
  Metrics/ModuleLength:
25
- Max: 150
25
+ Max: 160
26
+ Exclude:
27
+ - 'spec/**/*_spec.rb'
26
28
 
27
29
  Metrics/ClassLength:
28
30
  Max: 300
31
+ Exclude:
32
+ - 'spec/**/*_spec.rb'
33
+
34
+ Gemspec/RequireMFA:
35
+ Enabled: false
36
+
37
+ Style/MixinUsage:
38
+ Exclude:
39
+ - "bin/console"
40
+
41
+ Style/StringLiterals:
42
+ Enabled: true
43
+ EnforcedStyle: double_quotes
44
+
45
+ Style/StringLiteralsInInterpolation:
46
+ Enabled: true
47
+ EnforcedStyle: double_quotes
29
48
 
30
49
  Style/StringConcatenation:
31
50
  Exclude:
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.1.2
data/Dockerfile CHANGED
@@ -1,34 +1,25 @@
1
- FROM ruby:2.6-alpine AS build
1
+ FROM ruby:3.1 AS build
2
2
 
3
3
  ENV RACK_ENV=development
4
4
 
5
5
  COPY . /build
6
6
 
7
- RUN apk --no-cache upgrade \
8
- && apk --no-cache add git mariadb-client mariadb-connector-c \
9
- runit sqlite-dev \
10
- && apk --no-cache add --virtual build-dependencies \
11
- build-base mariadb-dev
7
+ RUN apt-get update && apt-get upgrade -y && apt-get install -y libsqlite3-dev sqlite3 curl libsodium-dev
12
8
 
13
- RUN apk add build-base \
14
- && cd /build \
9
+ RUN cd /build \
15
10
  && gem build bullion.gemspec \
16
11
  && mv bullion*.gem /bullion.gem
17
12
 
18
13
  WORKDIR /build
19
14
 
20
- FROM ruby:2.6-alpine
15
+ FROM ruby:3.1
21
16
  LABEL maintainer="Jonathan Gnagy <jonathan.gnagy@gmail.com>"
22
17
 
23
18
  ENV BULLION_PORT=9292
24
19
  ENV BULLION_ENVIRONMENT=development
25
20
  ENV DATABASE_URL=sqlite3:///tmp/bullion.db
26
21
 
27
- RUN apk --no-cache upgrade \
28
- && apk --no-cache add git mariadb-client mariadb-connector-c \
29
- runit sqlite-dev \
30
- && apk --no-cache add --virtual build-dependencies \
31
- build-base mariadb-dev
22
+ RUN apt-get update && apt-get upgrade -y && apt-get -y install libsqlite3-dev sqlite3 curl libsodium-dev
32
23
 
33
24
  RUN mkdir /app
34
25
 
@@ -47,8 +38,7 @@ RUN chmod +x /entrypoint.sh \
47
38
 
48
39
  WORKDIR /app
49
40
 
50
- RUN gem install bullion.gem \
51
- && apk del build-dependencies
41
+ RUN gem install bullion.gem
52
42
 
53
43
  USER nobody
54
44
 
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- source 'https://rubygems.org'
3
+ source "https://rubygems.org"
4
4
 
5
5
  git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
6
6
 
data/Gemfile.lock CHANGED
@@ -1,132 +1,140 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bullion (0.1.3)
4
+ bullion (0.3.1)
5
5
  httparty (~> 0.18)
6
- json (~> 2.5)
7
- jwt (~> 1.5)
6
+ json (~> 2.6)
7
+ jwt (~> 2.4)
8
8
  mysql2 (~> 0.5)
9
- openssl (~> 2.2)
10
- prometheus-client (~> 2.1)
11
- puma (~> 3.12)
12
- sinatra (~> 2.1)
9
+ openssl (~> 3.0)
10
+ prometheus-client (~> 4.0)
11
+ puma (~> 5.6)
12
+ sinatra (~> 2.2)
13
13
  sinatra-activerecord (~> 2.0)
14
- sinatra-contrib (~> 2.1)
14
+ sinatra-contrib (~> 2.2)
15
15
  sqlite3 (~> 1.4)
16
16
 
17
17
  GEM
18
18
  remote: https://rubygems.org/
19
19
  specs:
20
- acme-client (2.0.7)
21
- faraday (>= 0.17, < 2.0.0)
22
- activemodel (6.1.1)
23
- activesupport (= 6.1.1)
24
- activerecord (6.1.1)
25
- activemodel (= 6.1.1)
26
- activesupport (= 6.1.1)
27
- activesupport (6.1.1)
20
+ acme-client (2.0.11)
21
+ faraday (>= 1.0, < 3.0.0)
22
+ faraday-retry (~> 1.0)
23
+ activemodel (7.0.3.1)
24
+ activesupport (= 7.0.3.1)
25
+ activerecord (7.0.3.1)
26
+ activemodel (= 7.0.3.1)
27
+ activesupport (= 7.0.3.1)
28
+ activesupport (7.0.3.1)
28
29
  concurrent-ruby (~> 1.0, >= 1.0.2)
29
30
  i18n (>= 1.6, < 2)
30
31
  minitest (>= 5.1)
31
32
  tzinfo (~> 2.0)
32
- zeitwerk (~> 2.3)
33
- ast (2.4.1)
34
- byebug (9.1.0)
35
- concurrent-ruby (1.1.7)
36
- diff-lcs (1.4.4)
37
- docile (1.3.5)
38
- faraday (1.3.0)
39
- faraday-net_http (~> 1.0)
40
- multipart-post (>= 1.2, < 3)
41
- ruby2_keywords
42
- faraday-net_http (1.0.1)
43
- httparty (0.18.1)
33
+ ast (2.4.2)
34
+ byebug (11.1.3)
35
+ concurrent-ruby (1.1.10)
36
+ diff-lcs (1.5.0)
37
+ docile (1.4.0)
38
+ faraday (2.3.0)
39
+ faraday-net_http (~> 2.0)
40
+ ruby2_keywords (>= 0.0.4)
41
+ faraday-net_http (2.0.3)
42
+ faraday-retry (1.0.3)
43
+ httparty (0.20.0)
44
44
  mime-types (~> 3.0)
45
45
  multi_xml (>= 0.5.2)
46
- i18n (1.8.7)
46
+ i18n (1.12.0)
47
47
  concurrent-ruby (~> 1.0)
48
- json (2.5.1)
49
- jwt (1.5.6)
50
- mime-types (3.3.1)
48
+ json (2.6.2)
49
+ jwt (2.4.1)
50
+ mime-types (3.4.1)
51
51
  mime-types-data (~> 3.2015)
52
- mime-types-data (3.2020.1104)
53
- minitest (5.14.3)
52
+ mime-types-data (3.2022.0105)
53
+ minitest (5.16.2)
54
54
  multi_json (1.15.0)
55
55
  multi_xml (0.6.0)
56
- multipart-post (2.1.1)
57
- mustermann (1.1.1)
56
+ mustermann (1.1.2)
58
57
  ruby2_keywords (~> 0.0.1)
59
- mysql2 (0.5.3)
60
- openssl (2.2.0)
61
- parallel (1.20.1)
62
- parser (3.0.0.0)
58
+ mysql2 (0.5.4)
59
+ nio4r (2.5.8)
60
+ openssl (3.0.0)
61
+ parallel (1.22.1)
62
+ parser (3.1.2.0)
63
63
  ast (~> 2.4.1)
64
- prometheus-client (2.1.0)
65
- puma (3.12.6)
66
- rack (2.2.3)
67
- rack-protection (2.1.0)
64
+ prometheus-client (4.0.0)
65
+ puma (5.6.4)
66
+ nio4r (~> 2.0)
67
+ rack (2.2.4)
68
+ rack-protection (2.2.1)
68
69
  rack
69
- rack-test (0.8.3)
70
- rack (>= 1.0, < 3)
71
- rainbow (3.0.0)
70
+ rack-test (2.0.2)
71
+ rack (>= 1.3)
72
+ rainbow (3.1.1)
72
73
  rake (12.3.3)
73
- regexp_parser (2.0.3)
74
- rexml (3.2.4)
75
- rspec (3.10.0)
76
- rspec-core (~> 3.10.0)
77
- rspec-expectations (~> 3.10.0)
78
- rspec-mocks (~> 3.10.0)
79
- rspec-core (3.10.1)
80
- rspec-support (~> 3.10.0)
81
- rspec-expectations (3.10.1)
74
+ regexp_parser (2.5.0)
75
+ rexml (3.2.5)
76
+ rspec (3.11.0)
77
+ rspec-core (~> 3.11.0)
78
+ rspec-expectations (~> 3.11.0)
79
+ rspec-mocks (~> 3.11.0)
80
+ rspec-core (3.11.0)
81
+ rspec-support (~> 3.11.0)
82
+ rspec-expectations (3.11.0)
82
83
  diff-lcs (>= 1.2.0, < 2.0)
83
- rspec-support (~> 3.10.0)
84
- rspec-mocks (3.10.1)
84
+ rspec-support (~> 3.11.0)
85
+ rspec-mocks (3.11.1)
85
86
  diff-lcs (>= 1.2.0, < 2.0)
86
- rspec-support (~> 3.10.0)
87
- rspec-support (3.10.1)
88
- rubocop (0.93.1)
87
+ rspec-support (~> 3.11.0)
88
+ rspec-support (3.11.0)
89
+ rubocop (1.31.2)
90
+ json (~> 2.3)
89
91
  parallel (~> 1.10)
90
- parser (>= 2.7.1.5)
92
+ parser (>= 3.1.0.0)
91
93
  rainbow (>= 2.2.2, < 4.0)
92
- regexp_parser (>= 1.8)
93
- rexml
94
- rubocop-ast (>= 0.6.0)
94
+ regexp_parser (>= 1.8, < 3.0)
95
+ rexml (>= 3.2.5, < 4.0)
96
+ rubocop-ast (>= 1.18.0, < 2.0)
95
97
  ruby-progressbar (~> 1.7)
96
- unicode-display_width (>= 1.4.0, < 2.0)
97
- rubocop-ast (1.4.0)
98
- parser (>= 2.7.1.5)
98
+ unicode-display_width (>= 1.4.0, < 3.0)
99
+ rubocop-ast (1.19.1)
100
+ parser (>= 3.1.1.0)
101
+ rubocop-rake (0.6.0)
102
+ rubocop (~> 1.0)
103
+ rubocop-rspec (2.11.1)
104
+ rubocop (~> 1.19)
99
105
  ruby-progressbar (1.11.0)
100
- ruby2_keywords (0.0.2)
106
+ ruby2_keywords (0.0.5)
101
107
  simplecov (0.21.2)
102
108
  docile (~> 1.1)
103
109
  simplecov-html (~> 0.11)
104
110
  simplecov_json_formatter (~> 0.1)
105
- simplecov-cobertura (1.4.2)
106
- simplecov (~> 0.8)
111
+ simplecov-cobertura (2.1.0)
112
+ rexml
113
+ simplecov (~> 0.19)
107
114
  simplecov-html (0.12.3)
108
- simplecov_json_formatter (0.1.2)
109
- sinatra (2.1.0)
115
+ simplecov_json_formatter (0.1.4)
116
+ sinatra (2.2.1)
110
117
  mustermann (~> 1.0)
111
118
  rack (~> 2.2)
112
- rack-protection (= 2.1.0)
119
+ rack-protection (= 2.2.1)
113
120
  tilt (~> 2.0)
114
- sinatra-activerecord (2.0.21)
121
+ sinatra-activerecord (2.0.25)
115
122
  activerecord (>= 4.1)
116
123
  sinatra (>= 1.0)
117
- sinatra-contrib (2.1.0)
124
+ sinatra-contrib (2.2.1)
118
125
  multi_json
119
126
  mustermann (~> 1.0)
120
- rack-protection (= 2.1.0)
121
- sinatra (= 2.1.0)
127
+ rack-protection (= 2.2.1)
128
+ sinatra (= 2.2.1)
122
129
  tilt (~> 2.0)
123
- sqlite3 (1.4.2)
130
+ sqlite3 (1.4.4)
124
131
  tilt (2.0.10)
125
132
  tzinfo (2.0.4)
126
133
  concurrent-ruby (~> 1.0)
127
- unicode-display_width (1.7.0)
128
- yard (0.9.26)
129
- zeitwerk (2.4.2)
134
+ unicode-display_width (2.2.0)
135
+ webrick (1.7.0)
136
+ yard (0.9.28)
137
+ webrick (~> 1.7.0)
130
138
 
131
139
  PLATFORMS
132
140
  ruby
@@ -134,15 +142,17 @@ PLATFORMS
134
142
  DEPENDENCIES
135
143
  acme-client (~> 2.0)
136
144
  bullion!
137
- bundler (~> 2.0)
138
- byebug (~> 9)
139
- rack-test (~> 0.8)
145
+ bundler (~> 2.3)
146
+ byebug (~> 11)
147
+ rack-test (~> 2.0)
140
148
  rake (~> 12.3)
141
149
  rspec (~> 3.10)
142
- rubocop (~> 0.93)
143
- simplecov (~> 0.20)
144
- simplecov-cobertura (~> 1.4)
150
+ rubocop (~> 1.31)
151
+ rubocop-rake (~> 0.6)
152
+ rubocop-rspec (~> 2.11)
153
+ simplecov (~> 0.21)
154
+ simplecov-cobertura (~> 2.1)
145
155
  yard (~> 0.9)
146
156
 
147
157
  BUNDLED WITH
148
- 2.1.4
158
+ 2.3.10
data/README.md CHANGED
@@ -36,8 +36,8 @@ Whether run locally or via Docker, the following environment variables configure
36
36
  | `CA_CERT_PATH` | `$CA_DIR/tls.crt` | Public cert for Bullion. If Bullion is an intermediate CA, you'll want to include the root CA's public cert in this file as well the signed cert for Bullion. |
37
37
  | `CA_DOMAINS` | `example.com` | A comma-delimited list of domains for which Bullion will sign certificate requests. Subdomains are automatically allowed. Certificates containing other domains will be rejected. |
38
38
  | `CERT_VALIDITY_DURATION` | `7776000` | How long should issued certs be valid (in seconds)? Default is 90 days. |
39
- | `DATABASE_URL` | _None_ | A shorthand for telling Bullion how to connect to a database. Acceptable URLs will either being with `sqlite3:` or [`mysql2://`](https://github.com/brianmario/mysql2#using-active-records-database_url). |
40
- | `DNS01_NAMESERVERS` | `8.8.8.8` | A comma-delimited list of nameservers to use for resolving [DNS-01](https://letsencrypt.org/docs/challenge-types/#dns-01-challenge) challenges. Usually you'll want this to be set to your _internal_ nameservers so internal names resolve correctly. |
39
+ | `DATABASE_URL` | _None_ | **(Required)** A shorthand for telling Bullion how to connect to a database. Acceptable URLs will either begin with `sqlite3:` or [`mysql2://`](https://github.com/brianmario/mysql2#using-active-records-database_url). |
40
+ | `DNS01_NAMESERVERS` | _None_ | A comma-delimited list of nameservers to use for resolving [DNS-01](https://letsencrypt.org/docs/challenge-types/#dns-01-challenge) challenges. Usually you'll want this to be set to your _internal_ nameservers so internal names resolve correctly. When not set, it'll use the host's DNS. |
41
41
  | `LOG_LEVEL` | `warn` | Log level for Bullion. Supported levels (starting with the noisiest) are debug, info, warn, error, and fatal. |
42
42
  | `BULLION_PORT` | `9292` | TCP port Bullion will listen on. |
43
43
  | `MIN_THREADS` | `2` | Minimum number of [Puma](https://puma.io/) threads for processing requests. |
data/Rakefile CHANGED
@@ -1,91 +1,109 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- if %w[development test].include? ENV['RACK_ENV']
4
- ENV['DATABASE_URL'] = "sqlite3:#{File.expand_path('.')}/tmp/db/#{ENV['RACK_ENV']}.sqlite3"
3
+ ENV["RACK_ENV"] ||= "development"
4
+
5
+ if %w[development test].include? ENV["RACK_ENV"]
6
+ ENV["DATABASE_URL"] = "sqlite3:#{File.expand_path(".")}/tmp/db/#{ENV["RACK_ENV"]}.sqlite3"
5
7
  end
6
8
 
7
- require 'bundler/gem_tasks'
8
- require 'rspec/core/rake_task'
9
- require 'rubocop/rake_task'
10
- require 'yard'
11
- require 'openssl'
12
- require 'sqlite3'
13
- require 'sinatra/activerecord/rake'
9
+ require "bundler/gem_tasks"
10
+ require "rspec/core/rake_task"
11
+ require "rubocop/rake_task"
12
+ require "yard"
13
+ require "openssl"
14
+ require "sqlite3"
15
+ require "sinatra/activerecord/rake"
14
16
 
15
17
  namespace :db do
16
18
  task :load_config do
17
- ActiveRecord::Base.establish_connection(ENV['DATABASE_URL'])
19
+ ActiveRecord::Base.establish_connection(url: ENV.fetch("DATABASE_URL", nil))
18
20
  end
19
21
  end
20
22
 
21
- RSpec::Core::RakeTask.new(:spec)
23
+ RSpec::Core::RakeTask.new(:spec) do |t|
24
+ t.exclude_pattern = "spec/integration/**{,/*/**}/*_spec.rb"
25
+ t.rspec_opts = "--require spec_helper"
26
+ end
27
+ RSpec::Core::RakeTask.new(:integration_testing) do |t|
28
+ t.pattern = "spec/integration/**{,/*/**}/*_spec.rb"
29
+ t.rspec_opts = "--require integration_helper"
30
+ end
22
31
  RuboCop::RakeTask.new(:rubocop)
23
32
  YARD::Rake::YardocTask.new
24
33
 
25
34
  task :prep do
26
- FileUtils.mkdir_p(File.join(File.expand_path('.'), 'tmp'))
27
- ENV['CA_DIR'] = File.join(File.expand_path('.'), 'tmp').to_s
28
- ENV['CA_SECRET'] = 'SomeS3cret'
29
- ENV['CA_DOMAINS'] = 'test.domain'
35
+ FileUtils.mkdir_p(File.join(File.expand_path("."), "tmp"))
36
+ ENV["CA_DIR"] = File.join(File.expand_path("."), "tmp").to_s
37
+ ENV["CA_SECRET"] = "SomeS3cret"
38
+ ENV["CA_DOMAINS"] = "test.domain"
30
39
 
31
40
  key = OpenSSL::PKey::RSA.new(4096)
32
- File.open(File.join(File.expand_path('.'), 'tmp', 'tls.key'), 'w') do |f|
33
- f.write key.to_pem(OpenSSL::Cipher.new('aes-128-cbc'), ENV['CA_SECRET'])
34
- end
41
+ File.write(File.join(File.expand_path("."), "tmp", "tls.key"),
42
+ key.to_pem(OpenSSL::Cipher.new("aes-128-cbc"), ENV.fetch("CA_SECRET", nil)))
35
43
 
36
44
  root_ca = OpenSSL::X509::Certificate.new
37
45
  root_ca.version = 2
38
46
  root_ca.serial = (2**rand(10..20)) - 1
39
47
  root_ca.subject = OpenSSL::X509::Name.parse(
40
- %w[test domain].reverse.map { |piece| "DC=#{piece}" }.join('/') + '/CN=bullion'
48
+ %w[test domain].reverse.map { |piece| "DC=#{piece}" }.join("/") + "/CN=bullion"
41
49
  )
42
50
  root_ca.issuer = root_ca.subject # root CA's are "self-signed"
43
51
  root_ca.public_key = key.public_key
44
52
  root_ca.not_before = Time.now
45
- root_ca.not_after = root_ca.not_before + 5 * 365 * 24 * 60 * 60 # 5 years validity
53
+ root_ca.not_after = root_ca.not_before + (5 * 365 * 24 * 60 * 60) # 5 years validity
46
54
  ef = OpenSSL::X509::ExtensionFactory.new
47
55
  ef.subject_certificate = root_ca
48
56
  ef.issuer_certificate = root_ca
49
57
  root_ca.add_extension(
50
- ef.create_extension('basicConstraints', 'CA:TRUE', true)
58
+ ef.create_extension("basicConstraints", "CA:TRUE", true)
51
59
  )
52
60
  root_ca.add_extension(
53
- ef.create_extension('keyUsage', 'keyCertSign, cRLSign', true)
61
+ ef.create_extension("keyUsage", "keyCertSign, cRLSign", true)
54
62
  )
55
63
  root_ca.add_extension(
56
- ef.create_extension('subjectKeyIdentifier', 'hash', false)
64
+ ef.create_extension("subjectKeyIdentifier", "hash", false)
57
65
  )
58
66
  root_ca.add_extension(
59
- ef.create_extension('authorityKeyIdentifier', 'keyid:always', false)
67
+ ef.create_extension("authorityKeyIdentifier", "keyid:always", false)
60
68
  )
61
- root_ca.sign(key, OpenSSL::Digest.new('SHA256'))
62
- File.open(File.join(File.expand_path('.'), 'tmp', 'tls.crt'), 'w') do |f|
63
- f.write root_ca.to_pem
64
- end
69
+ root_ca.sign(key, OpenSSL::Digest.new("SHA256"))
70
+ File.write(File.join(File.expand_path("."), "tmp", "tls.crt"), root_ca.to_pem)
65
71
  end
66
72
 
67
73
  task :demo do
68
- system("rackup -D -P #{File.expand_path('.')}/tmp/daemon.pid")
74
+ rack_env = "test"
75
+ database_url = "sqlite3:#{File.expand_path(".")}/tmp/db/#{rack_env}.sqlite3"
76
+ system("RACK_ENV=\"#{rack_env}\" DATABASE_URL=\"#{database_url}\" bundle exec rake db:migrate")
77
+ system(
78
+ "RACK_ENV=\"#{rack_env}\" DATABASE_URL=\"#{database_url}\" " \
79
+ "LOG_LEVEL='#{ENV.fetch("LOG_LEVEL", "info")}' " \
80
+ "rackup -D -P #{File.expand_path(".")}/tmp/daemon.pid"
81
+ )
69
82
  end
70
83
 
71
84
  task :foreground_demo do
72
- system("rackup -P #{File.expand_path('.')}/tmp/daemon.pid")
85
+ system("rackup -P #{File.expand_path(".")}/tmp/daemon.pid")
73
86
  end
74
87
 
75
88
  task :cleanup do
76
89
  at_exit do
77
- system("kill $(cat #{File.expand_path('.')}/tmp/daemon.pid)")
78
- FileUtils.rm_f(File.join(File.expand_path('.'), 'tmp', 'tls.crt'))
79
- FileUtils.rm_f(File.join(File.expand_path('.'), 'tmp', 'tls.key'))
80
- FileUtils.rm_rf(File.join(File.expand_path('.'), 'tmp', 'db'))
81
- ENV['CA_DIR'] = nil
82
- ENV['CA_SECRET'] = nil
83
- ENV['CA_DOMAINS'] = nil
90
+ if File.exist?("#{File.expand_path(".")}/tmp/daemon.pid")
91
+ system("kill $(cat #{File.expand_path(".")}/tmp/daemon.pid)")
92
+ end
93
+ FileUtils.rm_f(File.join(File.expand_path("."), "tmp", "tls.crt"))
94
+ FileUtils.rm_f(File.join(File.expand_path("."), "tmp", "tls.key"))
95
+ FileUtils.rm_rf(File.join(File.expand_path("."), "tmp", "db"))
96
+ ENV["CA_DIR"] = nil
97
+ ENV["CA_SECRET"] = nil
98
+ ENV["CA_DOMAINS"] = nil
84
99
  end
85
100
  end
86
101
 
87
- Rake::Task['spec'].enhance(['cleanup'])
102
+ Rake::Task["integration_testing"].enhance(["cleanup"])
103
+
104
+ task test: %i[prep db:migrate spec demo integration_testing]
105
+ task unit: %i[prep db:migrate spec]
88
106
 
89
- task default: %i[prep db:migrate demo spec rubocop]
107
+ task default: %i[test rubocop yard]
90
108
 
91
109
  task local_demo: %i[prep db:migrate foreground_demo]
data/bin/console CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require 'bundler/setup'
5
- require 'bullion'
4
+ require "bundler/setup"
5
+ require "bullion"
6
6
 
7
7
  # You can add fixtures and/or initialization code here to make experimenting
8
8
  # with your gem easier. You can also use a different console, if you like.
@@ -11,5 +11,5 @@ require 'bullion'
11
11
  # require "pry"
12
12
  # Pry.start
13
13
 
14
- require 'irb'
14
+ require "irb"
15
15
  IRB.start(__FILE__)