bullion 0.3.0 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
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'