bullion 0.2.0 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) 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 +133 -91
  9. data/README.md +1 -1
  10. data/Rakefile +57 -39
  11. data/bin/console +3 -3
  12. data/bullion.gemspec +39 -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 +21 -18
  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 +79 -31
  44. data/.travis.yml +0 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8733df57bd7abe9e12c46001165fad25429956ca243f4f0a91aea4a306b59d3d
4
- data.tar.gz: 91a0941eebf4e61c807301c16cfe0d9ebc1d965bfd573b8b89ad2e43a0a1206c
3
+ metadata.gz: 0627a65ca775cb70236a641f2192b7c82c7a5f558de349ab60a8c99f34148989
4
+ data.tar.gz: cbf48fc60fda06c1f399d34e834416effc02e2ef699b706498350830190a4fe1
5
5
  SHA512:
6
- metadata.gz: 1d61ea6623bf7c2ba97fa1e7b71712cdebaa8dc7580a6a4f7788eaf51fe92a9218e4b2f89a4a48425772f86f9e2e2af22f166b536c5d64756ccc3ed4c2db8f4d
7
- data.tar.gz: 496eb52624bc02f15ce0f51833d6435d4e157c3f8ba05052231d1e50b0eb14eade65d4eb6ccc7f870d7753cdc01bc0cafcfbc3d4dccb618aeee6d3e76355d2b9
6
+ metadata.gz: 1a63b00fd8d7d87e31b1c218f23da93ae98a79f90898355f94b2066abf1fb95396ed1634af7f8020c2bfc106928c01a0cd80a6ba253294d4fdfcc919f2fd34bf
7
+ data.tar.gz: f9ebb294647518eba29860d1304401cdc4561ced78682966fb438025361898e3e3803b6e86001cdf9f26545608080dbae75ebaa20a5f6e435ac863861d1d3d55
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,171 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bullion (0.2.0)
4
+ bullion (0.3.2)
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
+ backport (1.2.0)
35
+ benchmark (0.2.0)
36
+ byebug (11.1.3)
37
+ concurrent-ruby (1.1.10)
38
+ diff-lcs (1.5.0)
39
+ docile (1.4.0)
40
+ e2mmap (0.1.0)
41
+ faraday (2.3.0)
42
+ faraday-net_http (~> 2.0)
43
+ ruby2_keywords (>= 0.0.4)
44
+ faraday-net_http (2.0.3)
45
+ faraday-retry (1.0.3)
46
+ httparty (0.20.0)
44
47
  mime-types (~> 3.0)
45
48
  multi_xml (>= 0.5.2)
46
- i18n (1.8.7)
49
+ i18n (1.12.0)
47
50
  concurrent-ruby (~> 1.0)
48
- json (2.5.1)
49
- jwt (1.5.6)
50
- mime-types (3.3.1)
51
+ jaro_winkler (1.5.4)
52
+ json (2.6.2)
53
+ jwt (2.4.1)
54
+ kramdown (2.4.0)
55
+ rexml
56
+ kramdown-parser-gfm (1.1.0)
57
+ kramdown (~> 2.0)
58
+ mime-types (3.4.1)
51
59
  mime-types-data (~> 3.2015)
52
- mime-types-data (3.2020.1104)
53
- minitest (5.14.3)
60
+ mime-types-data (3.2022.0105)
61
+ mini_portile2 (2.8.0)
62
+ minitest (5.16.2)
54
63
  multi_json (1.15.0)
55
64
  multi_xml (0.6.0)
56
- multipart-post (2.1.1)
57
- mustermann (1.1.1)
65
+ mustermann (1.1.2)
58
66
  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)
67
+ mysql2 (0.5.4)
68
+ nio4r (2.5.8)
69
+ nokogiri (1.13.7)
70
+ mini_portile2 (~> 2.8.0)
71
+ racc (~> 1.4)
72
+ openssl (3.0.0)
73
+ parallel (1.22.1)
74
+ parser (3.1.2.0)
63
75
  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)
76
+ prometheus-client (4.0.0)
77
+ puma (5.6.4)
78
+ nio4r (~> 2.0)
79
+ racc (1.6.0)
80
+ rack (2.2.4)
81
+ rack-protection (2.2.1)
68
82
  rack
69
- rack-test (0.8.3)
70
- rack (>= 1.0, < 3)
71
- rainbow (3.0.0)
83
+ rack-test (2.0.2)
84
+ rack (>= 1.3)
85
+ rainbow (3.1.1)
72
86
  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)
87
+ regexp_parser (2.5.0)
88
+ reverse_markdown (2.1.1)
89
+ nokogiri
90
+ rexml (3.2.5)
91
+ rspec (3.11.0)
92
+ rspec-core (~> 3.11.0)
93
+ rspec-expectations (~> 3.11.0)
94
+ rspec-mocks (~> 3.11.0)
95
+ rspec-core (3.11.0)
96
+ rspec-support (~> 3.11.0)
97
+ rspec-expectations (3.11.0)
82
98
  diff-lcs (>= 1.2.0, < 2.0)
83
- rspec-support (~> 3.10.0)
84
- rspec-mocks (3.10.1)
99
+ rspec-support (~> 3.11.0)
100
+ rspec-mocks (3.11.1)
85
101
  diff-lcs (>= 1.2.0, < 2.0)
86
- rspec-support (~> 3.10.0)
87
- rspec-support (3.10.1)
88
- rubocop (0.93.1)
102
+ rspec-support (~> 3.11.0)
103
+ rspec-support (3.11.0)
104
+ rubocop (1.32.0)
105
+ json (~> 2.3)
89
106
  parallel (~> 1.10)
90
- parser (>= 2.7.1.5)
107
+ parser (>= 3.1.0.0)
91
108
  rainbow (>= 2.2.2, < 4.0)
92
- regexp_parser (>= 1.8)
93
- rexml
94
- rubocop-ast (>= 0.6.0)
109
+ regexp_parser (>= 1.8, < 3.0)
110
+ rexml (>= 3.2.5, < 4.0)
111
+ rubocop-ast (>= 1.19.1, < 2.0)
95
112
  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)
113
+ unicode-display_width (>= 1.4.0, < 3.0)
114
+ rubocop-ast (1.19.1)
115
+ parser (>= 3.1.1.0)
116
+ rubocop-rake (0.6.0)
117
+ rubocop (~> 1.0)
118
+ rubocop-rspec (2.12.1)
119
+ rubocop (~> 1.31)
99
120
  ruby-progressbar (1.11.0)
100
- ruby2_keywords (0.0.2)
121
+ ruby2_keywords (0.0.5)
101
122
  simplecov (0.21.2)
102
123
  docile (~> 1.1)
103
124
  simplecov-html (~> 0.11)
104
125
  simplecov_json_formatter (~> 0.1)
105
- simplecov-cobertura (1.4.2)
106
- simplecov (~> 0.8)
126
+ simplecov-cobertura (2.1.0)
127
+ rexml
128
+ simplecov (~> 0.19)
107
129
  simplecov-html (0.12.3)
108
- simplecov_json_formatter (0.1.2)
109
- sinatra (2.1.0)
130
+ simplecov_json_formatter (0.1.4)
131
+ sinatra (2.2.1)
110
132
  mustermann (~> 1.0)
111
133
  rack (~> 2.2)
112
- rack-protection (= 2.1.0)
134
+ rack-protection (= 2.2.1)
113
135
  tilt (~> 2.0)
114
- sinatra-activerecord (2.0.21)
136
+ sinatra-activerecord (2.0.25)
115
137
  activerecord (>= 4.1)
116
138
  sinatra (>= 1.0)
117
- sinatra-contrib (2.1.0)
139
+ sinatra-contrib (2.2.1)
118
140
  multi_json
119
141
  mustermann (~> 1.0)
120
- rack-protection (= 2.1.0)
121
- sinatra (= 2.1.0)
142
+ rack-protection (= 2.2.1)
143
+ sinatra (= 2.2.1)
144
+ tilt (~> 2.0)
145
+ solargraph (0.45.0)
146
+ backport (~> 1.2)
147
+ benchmark
148
+ bundler (>= 1.17.2)
149
+ diff-lcs (~> 1.4)
150
+ e2mmap
151
+ jaro_winkler (~> 1.5)
152
+ kramdown (~> 2.3)
153
+ kramdown-parser-gfm (~> 1.1)
154
+ parser (~> 3.0)
155
+ reverse_markdown (>= 1.0.5, < 3)
156
+ rubocop (>= 0.52)
157
+ thor (~> 1.0)
122
158
  tilt (~> 2.0)
123
- sqlite3 (1.4.2)
124
- tilt (2.0.10)
125
- tzinfo (2.0.4)
159
+ yard (~> 0.9, >= 0.9.24)
160
+ sqlite3 (1.4.4)
161
+ thor (1.2.1)
162
+ tilt (2.0.11)
163
+ tzinfo (2.0.5)
126
164
  concurrent-ruby (~> 1.0)
127
- unicode-display_width (1.7.0)
128
- yard (0.9.26)
129
- zeitwerk (2.4.2)
165
+ unicode-display_width (2.2.0)
166
+ webrick (1.7.0)
167
+ yard (0.9.28)
168
+ webrick (~> 1.7.0)
130
169
 
131
170
  PLATFORMS
132
171
  ruby
@@ -134,15 +173,18 @@ PLATFORMS
134
173
  DEPENDENCIES
135
174
  acme-client (~> 2.0)
136
175
  bullion!
137
- bundler (~> 2.0)
138
- byebug (~> 9)
139
- rack-test (~> 0.8)
176
+ bundler (~> 2.3)
177
+ byebug (~> 11)
178
+ rack-test (~> 2.0)
140
179
  rake (~> 12.3)
141
180
  rspec (~> 3.10)
142
- rubocop (~> 0.93)
143
- simplecov (~> 0.20)
144
- simplecov-cobertura (~> 1.4)
181
+ rubocop (~> 1.31)
182
+ rubocop-rake (~> 0.6)
183
+ rubocop-rspec (~> 2.11)
184
+ simplecov (~> 0.21)
185
+ simplecov-cobertura (~> 2.1)
186
+ solargraph (~> 0.45)
145
187
  yard (~> 0.9)
146
188
 
147
189
  BUNDLED WITH
148
- 2.1.4
190
+ 2.3.10
data/README.md CHANGED
@@ -36,7 +36,7 @@ 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_ | **(Required)** 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). |
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
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. |
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__)