dry-stack 0.0.81 → 0.0.83

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: 758974f16669de0183b226fe54b60a63ff0f83dce670049922d86968b5d4d7ad
4
- data.tar.gz: afeaef4ec662565cda18cd38deef6b7e55977ab8b96838622665d2ac0e4c88f4
3
+ metadata.gz: 699b765bc2706a898f06c1ba3409d93723584e567865f9b21800a2f800700dad
4
+ data.tar.gz: 3a2ed784ad03723d09a19686a8f0204987a15876676e117596bbc5b24fa78419
5
5
  SHA512:
6
- metadata.gz: '09f0cbddbcc9ccc2465352bf5dd1365e0b0cb2a2f5788536b09e4018c7b4b5f9cb7677930540ab6e82c064724e1aa805c88c18a79e6a2e66bc27388f72b33ea0'
7
- data.tar.gz: 4d1a5fe073d29742e48a8d26eef50620f37ff4f7a3d42b9c899d303824f64e472900ae9545d6b76d733cc0521b95ec9386afb78375820af91d5727a89fc2a2e7
6
+ metadata.gz: 3f98d9d33f3cdc6616e484f62ba41026c1e88cdbb7d19095087412ba3bb788d5841d166f2a3a4874561eaf0a0c13303609a6abeef479d8852d855bb694162d76
7
+ data.tar.gz: 3fbd781699888422c806330c0bf3036e16a78017911bff5d46383b07834d7b6560d4b02073ce29c6813b4c841acf7689cd00dba89fdf555dd00f97ece7b26629
@@ -0,0 +1,76 @@
1
+ require 'digest/md5'
2
+
3
+ APR1_MAGIC = '$apr1$'
4
+ ITOA64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
5
+
6
+ def to64(value, length)
7
+ result = ''
8
+ length.times do
9
+ result << ITOA64[value & 0x3f]
10
+ value >>= 6
11
+ end
12
+ result
13
+ end
14
+
15
+ def apr1_crypt(password, salt)
16
+ salt = salt[0, 8]
17
+ ctx = Digest::MD5.new
18
+ ctx.update(password + APR1_MAGIC + salt)
19
+ final = Digest::MD5.digest(password + salt + password)
20
+
21
+ password.length.times { |i| ctx.update(final[i % 16].chr) }
22
+
23
+ length = password.length
24
+ while length > 0
25
+ ctx.update(length & 1 != 0 ? "\0" : password[0].chr)
26
+ length >>= 1
27
+ end
28
+
29
+ final = ctx.digest
30
+
31
+ 1000.times do |i|
32
+ ctx = Digest::MD5.new
33
+ ctx.update(i & 1 != 0 ? password : final)
34
+ ctx.update(salt) unless (i % 3).zero?
35
+ ctx.update(password) unless (i % 7).zero?
36
+ ctx.update(i & 1 != 0 ? final : password)
37
+ final = ctx.digest
38
+ end
39
+
40
+ hashed = final.bytes
41
+ result = [
42
+ to64((hashed[0] << 16) | (hashed[6] << 8) | hashed[12], 4),
43
+ to64((hashed[1] << 16) | (hashed[7] << 8) | hashed[13], 4),
44
+ to64((hashed[2] << 16) | (hashed[8] << 8) | hashed[14], 4),
45
+ to64((hashed[3] << 16) | (hashed[9] << 8) | hashed[15], 4),
46
+ to64((hashed[4] << 16) | (hashed[10] << 8) | hashed[5], 4),
47
+ to64(hashed[11], 2)
48
+ ].join
49
+
50
+ "#{APR1_MAGIC}#{salt}$#{result}"
51
+ end
52
+
53
+ def apr1_check(password, hashed_password)
54
+ parts = hashed_password.split('$')
55
+ return false if parts.length != 4 || parts[1] != 'apr1'
56
+
57
+ salt = parts[2]
58
+ apr1_crypt(password, salt) == hashed_password
59
+ end
60
+
61
+ # SELF TEST ============================================================================================================
62
+ if File.expand_path($0) == File.expand_path(__FILE__)
63
+ # openssl passwd -apr1 -salt 8sFt66rZ admin
64
+ password = "admin"
65
+ salt = "976CP"
66
+
67
+ hashed_password = apr1_crypt(password, salt)
68
+ puts "APR1 Hashed Password: #{hashed_password}"
69
+
70
+ hashed_password2 = '$apr1$pkcC6Tmo$4HpuLoFryypSnXeJ1e02n/'
71
+ hashed_password3 = '$apr1$976PimCP$PU7TWdOsyivf.u35yYGsv0'
72
+
73
+ p apr1_check(password, hashed_password)
74
+ p apr1_check(password, hashed_password2)
75
+ p apr1_check(password, hashed_password3)
76
+ end
@@ -3,7 +3,7 @@ require 'yaml'
3
3
  require 'json'
4
4
  require 'optparse'
5
5
  require 'digest'
6
- require 'bcrypt'
6
+ require_relative 'apache_specific_md5'
7
7
 
8
8
  # class TrueClass
9
9
  # def encode_with(coder) = coder.represent_scalar('tag:yaml.org,2002:str', 'true')
@@ -149,14 +149,6 @@ module Dry
149
149
  service[:deploy][:labels] ||= []
150
150
  service[:deploy][:labels] += @labels.map { "#{_1}=#{_2}" }
151
151
 
152
- if service[:basic_auth]
153
- ba_user, ba_password = service[:basic_auth].split ':'
154
- hashed_password = BCrypt::Password.create ba_password
155
- service[:deploy][:labels] << "traefik.http.middlewares.%{service-name}_auth.basicauth.users=#{ba_user}:#{hashed_password.gsub('$','$$')}"
156
- service[:deploy][:labels] << "traefik.http.routers.%{service-name}.middlewares=%{service-name}_auth"
157
- service.delete :basic_auth
158
- end
159
-
160
152
  if ingress[0] && (opts[:ingress] || opts[:traefik] || opts[:traefik_tls])
161
153
  service[:networks] ||= []
162
154
  service[:networks] << 'default' if service[:networks].empty?
@@ -177,6 +169,13 @@ module Dry
177
169
  ingress[0][:port] ||= service[:ports]&.first
178
170
 
179
171
  ingress.each_with_index do |ing, index|
172
+ if service[:basic_auth]
173
+ ba_user, ba_password, salt = service[:basic_auth].split ':'
174
+ hashed_password = apr1_crypt ba_password, (salt || rand(36**8).to_s(36))
175
+ service[:deploy][:labels] << "traefik.http.middlewares.#{service_name}-#{index}_auth.basicauth.users=#{ba_user}:#{hashed_password.gsub('$','$$')}"
176
+ service[:deploy][:labels] << "traefik.http.routers.#{service_name}-#{index}.middlewares=#{service_name}-#{index}_auth"
177
+ end
178
+
180
179
  ing[:port] ||= service[:ports]&.first
181
180
  service[:deploy][:labels] += [
182
181
  "traefik.http.routers.#{service_name}-#{index}.service=#{service_name}-#{index}",
@@ -210,6 +209,7 @@ module Dry
210
209
  end
211
210
  end
212
211
  end
212
+ service.delete :basic_auth
213
213
 
214
214
  service[:environment] = @environment[name].merge(service[:environment]) if @environment[name]
215
215
  service[:environment].merge! STACK_NAME: @name.to_s, STACK_SERVICE_NAME: name.to_s
data/lib/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Dry
2
2
  class Stack
3
- VERSION = '0.0.81'
3
+ VERSION = '0.0.83'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-stack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.81
4
+ version: 0.0.83
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artyom B
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-19 00:00:00.000000000 Z
11
+ date: 2024-06-20 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: bcrypt
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: rake
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -120,6 +106,7 @@ files:
120
106
  - bin/stack1.drs
121
107
  - bin/stack2.drs
122
108
  - lib/dry-stack.rb
109
+ - lib/dry-stack/apache_specific_md5.rb
123
110
  - lib/dry-stack/command_compose.rb
124
111
  - lib/dry-stack/command_line.rb
125
112
  - lib/dry-stack/command_swarm_deploy.rb