bullion 0.3.0 → 0.3.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f7e5e7935b8ed90f7e8e6695215b039507272a2db3ab1ed8919b0ae9abef1823
4
- data.tar.gz: 81e4de3cc1fe7e876c487c7edb0fd3e775125d841e16ff3948fafd5e1d5adec2
3
+ metadata.gz: eeb140b2f96dc4b7a1b90dd67def6ea51aa6cafe95d539802ff08d5051215944
4
+ data.tar.gz: ebadc84892a2cd895d1d5c89491df517b2a5e71a59aa245211a0e603d43a3fb5
5
5
  SHA512:
6
- metadata.gz: e8d9a743a1b81df4ee26858d7ece2b43c77070568f01298d35c4b2eef78f6cac6a1ecab89e232d18e5321f81b4382ac331a3242d11771bd954de64b5a9a16961
7
- data.tar.gz: 628f70c629f53e09424c59a5553c81dbb172d3d57fa117e76c74d861e8cd1ad9a0a47d52db52609d17d2da78b6c50d7fc533007966a532d2e4acc9f04dab79d6
6
+ metadata.gz: 37844c15c8c40d311f1dd8bbc31661b8810af1af7641ff799509a27b9bf325780a7c8c15f307efc59de9065c9c430e674f198bd67b5a8cf54e0a2a096ac4cb4f
7
+ data.tar.gz: 88bb5cb35c0cdf2c857538a631fa8ac681a70b56df56ec7d6bf6843597c778ddc07fa3cae54dc90a6585727b87a32bc76bad3942b850f2544b86feff03d1b91e
data/.rspec CHANGED
@@ -1,3 +1,2 @@
1
1
  --format documentation
2
2
  --color
3
- --require spec_helper
data/Dockerfile CHANGED
@@ -1,34 +1,25 @@
1
- FROM ruby:3.1-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:3.1-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.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bullion (0.3.0)
4
+ bullion (0.3.3)
5
5
  httparty (~> 0.18)
6
6
  json (~> 2.6)
7
7
  jwt (~> 2.4)
@@ -31,10 +31,13 @@ GEM
31
31
  minitest (>= 5.1)
32
32
  tzinfo (~> 2.0)
33
33
  ast (2.4.2)
34
+ backport (1.2.0)
35
+ benchmark (0.2.0)
34
36
  byebug (11.1.3)
35
37
  concurrent-ruby (1.1.10)
36
38
  diff-lcs (1.5.0)
37
39
  docile (1.4.0)
40
+ e2mmap (0.1.0)
38
41
  faraday (2.3.0)
39
42
  faraday-net_http (~> 2.0)
40
43
  ruby2_keywords (>= 0.0.4)
@@ -45,11 +48,17 @@ GEM
45
48
  multi_xml (>= 0.5.2)
46
49
  i18n (1.12.0)
47
50
  concurrent-ruby (~> 1.0)
51
+ jaro_winkler (1.5.4)
48
52
  json (2.6.2)
49
53
  jwt (2.4.1)
54
+ kramdown (2.4.0)
55
+ rexml
56
+ kramdown-parser-gfm (1.1.0)
57
+ kramdown (~> 2.0)
50
58
  mime-types (3.4.1)
51
59
  mime-types-data (~> 3.2015)
52
60
  mime-types-data (3.2022.0105)
61
+ mini_portile2 (2.8.0)
53
62
  minitest (5.16.2)
54
63
  multi_json (1.15.0)
55
64
  multi_xml (0.6.0)
@@ -57,6 +66,9 @@ GEM
57
66
  ruby2_keywords (~> 0.0.1)
58
67
  mysql2 (0.5.4)
59
68
  nio4r (2.5.8)
69
+ nokogiri (1.13.7)
70
+ mini_portile2 (~> 2.8.0)
71
+ racc (~> 1.4)
60
72
  openssl (3.0.0)
61
73
  parallel (1.22.1)
62
74
  parser (3.1.2.0)
@@ -64,6 +76,7 @@ GEM
64
76
  prometheus-client (4.0.0)
65
77
  puma (5.6.4)
66
78
  nio4r (~> 2.0)
79
+ racc (1.6.0)
67
80
  rack (2.2.4)
68
81
  rack-protection (2.2.1)
69
82
  rack
@@ -72,6 +85,8 @@ GEM
72
85
  rainbow (3.1.1)
73
86
  rake (12.3.3)
74
87
  regexp_parser (2.5.0)
88
+ reverse_markdown (2.1.1)
89
+ nokogiri
75
90
  rexml (3.2.5)
76
91
  rspec (3.11.0)
77
92
  rspec-core (~> 3.11.0)
@@ -86,22 +101,22 @@ GEM
86
101
  diff-lcs (>= 1.2.0, < 2.0)
87
102
  rspec-support (~> 3.11.0)
88
103
  rspec-support (3.11.0)
89
- rubocop (1.31.2)
104
+ rubocop (1.32.0)
90
105
  json (~> 2.3)
91
106
  parallel (~> 1.10)
92
107
  parser (>= 3.1.0.0)
93
108
  rainbow (>= 2.2.2, < 4.0)
94
109
  regexp_parser (>= 1.8, < 3.0)
95
110
  rexml (>= 3.2.5, < 4.0)
96
- rubocop-ast (>= 1.18.0, < 2.0)
111
+ rubocop-ast (>= 1.19.1, < 2.0)
97
112
  ruby-progressbar (~> 1.7)
98
113
  unicode-display_width (>= 1.4.0, < 3.0)
99
114
  rubocop-ast (1.19.1)
100
115
  parser (>= 3.1.1.0)
101
116
  rubocop-rake (0.6.0)
102
117
  rubocop (~> 1.0)
103
- rubocop-rspec (2.11.1)
104
- rubocop (~> 1.19)
118
+ rubocop-rspec (2.12.1)
119
+ rubocop (~> 1.31)
105
120
  ruby-progressbar (1.11.0)
106
121
  ruby2_keywords (0.0.5)
107
122
  simplecov (0.21.2)
@@ -127,9 +142,25 @@ GEM
127
142
  rack-protection (= 2.2.1)
128
143
  sinatra (= 2.2.1)
129
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)
158
+ tilt (~> 2.0)
159
+ yard (~> 0.9, >= 0.9.24)
130
160
  sqlite3 (1.4.4)
131
- tilt (2.0.10)
132
- tzinfo (2.0.4)
161
+ thor (1.2.1)
162
+ tilt (2.0.11)
163
+ tzinfo (2.0.5)
133
164
  concurrent-ruby (~> 1.0)
134
165
  unicode-display_width (2.2.0)
135
166
  webrick (1.7.0)
@@ -152,6 +183,7 @@ DEPENDENCIES
152
183
  rubocop-rspec (~> 2.11)
153
184
  simplecov (~> 0.21)
154
185
  simplecov-cobertura (~> 2.1)
186
+ solargraph (~> 0.45)
155
187
  yard (~> 0.9)
156
188
 
157
189
  BUNDLED WITH
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
@@ -20,7 +20,14 @@ namespace :db do
20
20
  end
21
21
  end
22
22
 
23
- 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
24
31
  RuboCop::RakeTask.new(:rubocop)
25
32
  YARD::Rake::YardocTask.new
26
33
 
@@ -64,7 +71,14 @@ task :prep do
64
71
  end
65
72
 
66
73
  task :demo do
67
- 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
+ )
68
82
  end
69
83
 
70
84
  task :foreground_demo do
@@ -85,10 +99,11 @@ task :cleanup do
85
99
  end
86
100
  end
87
101
 
88
- Rake::Task["spec"].enhance(["cleanup"])
102
+ Rake::Task["integration_testing"].enhance(["cleanup"])
89
103
 
90
- task default: %i[prep db:migrate demo spec rubocop]
104
+ task test: %i[prep db:migrate spec demo integration_testing]
105
+ task unit: %i[prep db:migrate spec]
91
106
 
92
- task test: %i[prep db:migrate demo spec]
107
+ task default: %i[test rubocop yard]
93
108
 
94
109
  task local_demo: %i[prep db:migrate foreground_demo]
data/bullion.gemspec CHANGED
@@ -49,5 +49,6 @@ Gem::Specification.new do |spec|
49
49
  spec.add_development_dependency "rubocop-rspec", "~> 2.11"
50
50
  spec.add_development_dependency "simplecov", "~> 0.21"
51
51
  spec.add_development_dependency "simplecov-cobertura", "~> 2.1"
52
+ spec.add_development_dependency "solargraph", "~> 0.45"
52
53
  spec.add_development_dependency "yard", "~> 0.9"
53
54
  end
@@ -53,7 +53,7 @@ module Bullion
53
53
  # rubocop:enable Metrics/MethodLength
54
54
 
55
55
  def identifier
56
- challenge.authorization.identifier["value"]
56
+ challenge.identifier
57
57
  end
58
58
  end
59
59
  end
@@ -23,29 +23,26 @@ module Bullion
23
23
  Base64.urlsafe_encode64(digest).sub(/[\s=]*\z/, "")
24
24
  end
25
25
 
26
- def dns_value
27
- name = "_acme-challenge.#{identifier}"
26
+ def dns_name
27
+ "_acme-challenge.#{identifier}"
28
+ end
28
29
 
30
+ def dns_value
29
31
  # Randomly select a nameserver to pull the TXT record
30
32
  nameserver = NAMESERVERS.sample
31
33
 
32
- LOGGER.debug "Looking up #{name}"
33
- records = records_for(name, nameserver)
34
- raise "Failed to find records for #{name}" unless records
34
+ LOGGER.debug "Looking up #{dns_name}"
35
+ records = records_for(dns_name, nameserver)
36
+ raise "Failed to find records for #{dns_name}" unless records
35
37
 
36
38
  record = records.map(&:strings).flatten.first
37
- LOGGER.debug "Resolved #{name} to value #{record}"
39
+ LOGGER.debug "Resolved #{dns_name} to value #{record}"
38
40
  record
39
- rescue Resolv::ResolvError
40
- msg = ["Resolution error for #{name}"]
41
+ rescue StandardError => e
42
+ msg = ["Resolution error '#{e.message}' for #{dns_name}"]
41
43
  msg << "via #{nameserver}" if nameserver
42
44
  LOGGER.info msg.join(" ")
43
45
  false
44
- rescue StandardError => e
45
- msg = ["Error '#{e.message}' for #{name}"]
46
- msg << "with #{nameserver}" if nameserver
47
- LOGGER.warn msg.join(" ")
48
- false
49
46
  end
50
47
 
51
48
  def records_for(name, nameserver = nil)
@@ -4,8 +4,8 @@ module Bullion
4
4
  module Models
5
5
  # ACMEv2 Account model
6
6
  class Account < ActiveRecord::Base
7
- serialize :contacts, Array
8
- serialize :public_key, Hash
7
+ serialize :contacts, JSON
8
+ serialize :public_key, JSON
9
9
 
10
10
  validates_uniqueness_of :public_key
11
11
 
@@ -4,7 +4,7 @@ module Bullion
4
4
  module Models
5
5
  # ACMEv2 Authorization model
6
6
  class Authorization < ActiveRecord::Base
7
- serialize :identifier, Hash
7
+ serialize :identifier, JSON
8
8
 
9
9
  after_initialize :init_values, unless: :persisted?
10
10
 
@@ -4,7 +4,7 @@ module Bullion
4
4
  module Models
5
5
  # SSL Certificate model
6
6
  class Certificate < ActiveRecord::Base
7
- serialize :alternate_names
7
+ serialize :alternate_names, JSON
8
8
 
9
9
  after_initialize :init_values, unless: :persisted?
10
10
 
@@ -11,6 +11,13 @@ module Bullion
11
11
  validates :acme_type, inclusion: { in: %w[http-01 dns-01] }
12
12
  validates :status, inclusion: { in: %w[invalid pending processing valid] }
13
13
 
14
+ scope :dns01, -> { where(acme_type: "dns-01") }
15
+ scope :http01, -> { where(acme_type: "http-01") }
16
+
17
+ def identifier
18
+ authorization.identifier["value"]
19
+ end
20
+
14
21
  def init_values
15
22
  self.expires ||= Time.now + (60 * 60)
16
23
  self.token ||= SecureRandom.alphanumeric(48)
@@ -4,7 +4,7 @@ module Bullion
4
4
  module Models
5
5
  # ACMEv2 Order model
6
6
  class Order < ActiveRecord::Base
7
- serialize :identifiers, Array
7
+ serialize :identifiers, JSON
8
8
 
9
9
  after_initialize :init_values, unless: :persisted?
10
10
 
@@ -11,17 +11,26 @@ module Bullion
11
11
  set :logging, true
12
12
  set :logger, Bullion::LOGGER
13
13
  set :database, DB_CONNECTION_SETTINGS
14
+ set :show_exceptions, false
14
15
  end
15
16
 
16
17
  before do
17
18
  # Sets up a useful variable (@json_body) for accessing a parsed request body
18
19
  if request.content_type&.include?("json") && !request.body.read.empty?
19
- p request.body
20
20
  request.body.rewind
21
21
  @json_body = JSON.parse(request.body.read, symbolize_names: true)
22
22
  end
23
23
  rescue StandardError => e
24
24
  halt(400, { error: "Request must be JSON: #{e.message}}" }.to_json)
25
25
  end
26
+
27
+ error do
28
+ content_type :json
29
+
30
+ e = env["sinatra.error"]
31
+ resp = { result: "error", message: e.message }
32
+ resp[:trace] = e.full_message if settings.environment.to_s != "production"
33
+ resp.to_json
34
+ end
26
35
  end
27
36
  end
@@ -4,6 +4,6 @@ module Bullion
4
4
  VERSION = [
5
5
  0, # major
6
6
  3, # minor
7
- 0 # patch
7
+ 3 # patch
8
8
  ].join(".")
9
9
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bullion
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Gnagy
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-07-18 00:00:00.000000000 Z
11
+ date: 2022-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -318,6 +318,20 @@ dependencies:
318
318
  - - "~>"
319
319
  - !ruby/object:Gem::Version
320
320
  version: '2.1'
321
+ - !ruby/object:Gem::Dependency
322
+ name: solargraph
323
+ requirement: !ruby/object:Gem::Requirement
324
+ requirements:
325
+ - - "~>"
326
+ - !ruby/object:Gem::Version
327
+ version: '0.45'
328
+ type: :development
329
+ prerelease: false
330
+ version_requirements: !ruby/object:Gem::Requirement
331
+ requirements:
332
+ - - "~>"
333
+ - !ruby/object:Gem::Version
334
+ version: '0.45'
321
335
  - !ruby/object:Gem::Dependency
322
336
  name: yard
323
337
  requirement: !ruby/object:Gem::Requirement
@@ -345,7 +359,6 @@ files:
345
359
  - ".rspec"
346
360
  - ".rubocop.yml"
347
361
  - ".ruby-version"
348
- - ".travis.yml"
349
362
  - CODE_OF_CONDUCT.md
350
363
  - Dockerfile
351
364
  - Gemfile
data/.travis.yml DELETED
@@ -1,16 +0,0 @@
1
- language: ruby
2
- cache: bundler
3
- rvm:
4
- - 2.6
5
- - 2.7
6
- before_install: gem install bundler -v 2.1.4
7
- deploy:
8
- provider: rubygems
9
- api_key:
10
- secure: jCGp7gsBcWZhEXQfFkcJKh+6zsAbsAkzyf0rS/IYuJ/IltrZzVm8KXugYMAhL8ZgvKl7ecFhjOmXOMC4q+YPh0ax5ozzbwipR9JoMiACh24RDB302Ye66eyO8xMAQK/KYqyy5ym9mT6ZpP/kKwvIEYJOBjypQ4+Rk+OZJize6L0MAmAtwfRNo9ah7czCQ2wdl18Ss7nfCs9jFrL6aTdZTHi0uolfz2lXHE5kgxSaQoF+xRIYkb4WLrUwypMt9oYimp4LGP+a5BwWIEyz+Kw1i3XXl9cdusKrkGH1no+eNoiK1pAFy6DC6tR1Dtw95EoMCnRhgJ99f5pf2J/3FrJYyUFk0Fph3SWsO8x6EJ05YAnuql+jcuzsXYn3/TCDilS6kbP2NY4anTZLxOha2VesIqtWsT6skKac+zVa9YCG+DVSqaUig93fNxyw+c27giY4oDAOvRBo10m/r4QFJ1oiK+PTHf4phuUtjhVWAzRasSk2Q+nNIK8XHNgtp/GY8RYkxzANsotwg3aZ2FsCh3+9KwZYyEh+pD+n7Ev4d+Lqr5hw2VhIzaY/RbzGkADFuXxz5BVOE42iKdtO1MSycFDGmegQancyt1XDT0dVYhXI8gnw9BvixVmgPMVqTVdodLpjZFLyFbIB93l7zO07gSQ1sVmwhEUL0rbTEBfPPwNX78w=
11
- gem: bullion
12
- on:
13
- tags: true
14
- rvm: 2.6
15
- repo: jgnagy/bullion
16
- skip_cleanup: 'true'