diamant 0.0.7 → 0.0.9

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: 124c00db017955325f9d1c854693310303e9871fd1ce2e64b5fa26280db74f4e
4
- data.tar.gz: e50d53f1b57a562c39dbfc1a98599c4d52f09c84aeab8ba207fec32693d0d75a
3
+ metadata.gz: 5f4a7116de355c0b04280914d27758f287116298d2cde5a36e311382352342b1
4
+ data.tar.gz: 04a5cd38b4596383a220bd553b6e6d1a9360310810156d009f8cad569db9bd01
5
5
  SHA512:
6
- metadata.gz: a5933c8f275cc1835af909c6e271e71468b26898e58b851fa67f500e51ef9a0b9841b0db8f3ae318e5b59927adc1bb966aa39ae946440779e25b8a044489e2ac
7
- data.tar.gz: 276b5ff6c7ecc14b1b6d7fc74b187eccca41b46fd7dbffee98f61c8aee5e8a5854f9dbc9d88c54239860870edc24f56a6f3e838ba0dd478ca1fbd01cf77510f8
6
+ metadata.gz: e948fce49088c1b5483a18dd4c4dfccfbaefb7b160d4a9ce0fc880a0bf4487c6ded0eda9a3b58de9ad74fe5a05f3922c790716d26789db0a18621381fe6acefe
7
+ data.tar.gz: 1113f9c27f505edcc445b116a3d9dbb900c681a5305b48655d72faee52714a1ca7c4b3b71a7123b80e8f93468ecfcfa88afd5f455e2fc4222adef6e73070fa61
@@ -23,15 +23,15 @@ module Diamant
23
23
  end
24
24
 
25
25
  def write
26
- IO.write('key.rsa', @key.to_pem)
26
+ File.write('key.rsa', @key.to_pem)
27
27
  File.chmod(0o400, 'key.rsa')
28
- IO.write('cert.pem', @cert.to_pem)
28
+ File.write('cert.pem', @cert.to_pem)
29
29
  File.chmod(0o644, 'cert.pem')
30
30
  end
31
31
 
32
32
  private
33
33
 
34
- def init_cert
34
+ def init_cert # rubocop:disable Metrics/AbcSize
35
35
  @cert = OpenSSL::X509::Certificate.new
36
36
  @cert.version = 3
37
37
  @cert.serial = 0x0
@@ -40,7 +40,7 @@ module Diamant
40
40
  @cert.public_key = @key.public_key
41
41
  @cert.not_before = Time.now
42
42
  # 1 years validity
43
- @cert.not_after = @cert.not_before + 1 * 365 * 24 * 60 * 60
43
+ @cert.not_after = @cert.not_before + (1 * 365 * 24 * 60 * 60)
44
44
  @cert
45
45
  end
46
46
 
@@ -34,6 +34,7 @@ module Diamant
34
34
  def extract_info
35
35
  @extension = File.extname @path
36
36
  raise MimeError, "#{@path} format is not supported!" unless supported?
37
+
37
38
  # Any other supported extension
38
39
  @content_type = MIMETYPES[@extension]
39
40
  end
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'net/gemini/request'
4
+ require 'uri/gemini'
5
+
3
6
  module Diamant
4
7
  # Methods to generate requests responses
5
8
  module Response
@@ -10,6 +13,7 @@ module Diamant
10
13
  return false if current_load < 11
11
14
  # Seppuku
12
15
  raise 'Server is under heavy load' if current_load > 1965
16
+
13
17
  if current_load > 42
14
18
  @logger.warn '41 - Too much threads...'
15
19
  sock.puts "41 See you soon...\r\n"
@@ -22,9 +26,10 @@ module Diamant
22
26
  end
23
27
 
24
28
  def read_file(client)
25
- r = Net::GeminiRequest.read_new(client)
29
+ r = Net::Gemini::Request.read_new(client)
26
30
  [r.uri, route(r.path)]
27
- rescue Net::GeminiBadRequest, URI::InvalidURIError
31
+ rescue Net::Gemini::BadRequest, URI::InvalidURIError => e
32
+ @logger.error "59 - #{e}"
28
33
  [nil, ["59\r\n"]]
29
34
  end
30
35
 
@@ -38,12 +43,13 @@ module Diamant
38
43
  end
39
44
  route << '/index.gmi' if File.directory?(route)
40
45
  return ['51 Not found!'] unless File.exist?(route)
46
+
41
47
  build_response route
42
48
  end
43
49
 
44
50
  def build_response(route)
45
51
  info = Diamant::MimeType.new(route)
46
- answer = IO.readlines route, chomp: true
52
+ answer = File.readlines route, chomp: true
47
53
  answer.prepend "20 #{info.content_type}"
48
54
  rescue Diamant::MimeError
49
55
  ['50 Not a supported file!']
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Diamant
4
- VERSION = '0.0.7'
4
+ VERSION = '0.0.9'
5
5
  end
data/lib/diamant.rb CHANGED
@@ -6,9 +6,6 @@ require 'English'
6
6
  require 'openssl'
7
7
  require 'fileutils'
8
8
 
9
- require 'net/gemini/request'
10
- require 'uri/gemini'
11
-
12
9
  require 'diamant/version'
13
10
  require 'diamant/mimetype'
14
11
  require 'diamant/response'
@@ -37,13 +34,7 @@ module Diamant
37
34
 
38
35
  def main_loop(ssl_serv)
39
36
  loop do
40
- Thread.new(ssl_serv.accept) do |client|
41
- handle_client(client)
42
- rescue Errno::ECONNRESET, Errno::ENOTCONN => e
43
- @logger.error(e.message)
44
- ensure
45
- client.close
46
- end
37
+ main_loop_tick ssl_serv.accept
47
38
  rescue OpenSSL::SSL::SSLError => e
48
39
  # Do not even try to answer anything as the socket cannot be
49
40
  # built. This will abruptly interrupt the connection from a client
@@ -59,9 +50,21 @@ module Diamant
59
50
  end
60
51
  end
61
52
 
53
+ # Might raises some errors
54
+ def main_loop_tick(connection)
55
+ Thread.new(connection) do |client|
56
+ handle_client(client)
57
+ rescue Errno::ECONNRESET, Errno::ENOTCONN, Errno::ETIMEDOUT => e
58
+ @logger.error(e.message)
59
+ ensure
60
+ client.close
61
+ end
62
+ end
63
+
62
64
  def handle_client(client)
63
65
  current_load = Thread.list.length - 1
64
66
  return if reject_request?(client, current_load)
67
+
65
68
  uri, answer = read_file(client)
66
69
  log_line = [current_load, client.peeraddr[3], answer[0]]
67
70
  log_line << uri if uri
@@ -90,6 +93,7 @@ module Diamant
90
93
  def check_option_path_exist(option, default)
91
94
  path = File.expand_path(option || default)
92
95
  return path if File.exist?(path)
96
+
93
97
  raise ArgumentError, "#{path} does not exist!"
94
98
  end
95
99
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: diamant
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Étienne Deparis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-18 00:00:00.000000000 Z
11
+ date: 2024-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby-net-text
@@ -16,140 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.0.5
19
+ version: '0.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.0.5
27
- - !ruby/object:Gem::Dependency
28
- name: byebug
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '11.1'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '11.1'
41
- - !ruby/object:Gem::Dependency
42
- name: pry
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '0.14'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '0.14'
55
- - !ruby/object:Gem::Dependency
56
- name: pry-doc
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '1.1'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '1.1'
69
- - !ruby/object:Gem::Dependency
70
- name: rspec
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '3.10'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '3.10'
83
- - !ruby/object:Gem::Dependency
84
- name: rubocop
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '1.18'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '1.18'
97
- - !ruby/object:Gem::Dependency
98
- name: rubocop-performance
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '1.11'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '1.11'
111
- - !ruby/object:Gem::Dependency
112
- name: rubocop-rspec
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: '2.4'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
123
- - !ruby/object:Gem::Version
124
- version: '2.4'
125
- - !ruby/object:Gem::Dependency
126
- name: simplecov
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: '0.21'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: '0.21'
139
- - !ruby/object:Gem::Dependency
140
- name: yard
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - "~>"
144
- - !ruby/object:Gem::Version
145
- version: '0.9'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - "~>"
151
- - !ruby/object:Gem::Version
152
- version: '0.9'
26
+ version: '0.1'
153
27
  description: |
154
28
  Diamant is a server for the Gemini network protocol. It can only serve
155
29
  static files. Internally, it uses the OpenSSL library to handle the TLS
@@ -170,7 +44,11 @@ files:
170
44
  homepage: https://git.umaneti.net/diamant/about/
171
45
  licenses:
172
46
  - WTFPL
173
- metadata: {}
47
+ metadata:
48
+ rubygems_mfa_required: 'true'
49
+ source_code_uri: https://git.umaneti.net/fronde
50
+ homepage_uri: https://etienne.depar.is/fronde/
51
+ funding_uri: https://liberapay.com/milouse
174
52
  post_install_message:
175
53
  rdoc_options: []
176
54
  require_paths:
@@ -186,7 +64,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
64
  - !ruby/object:Gem::Version
187
65
  version: '0'
188
66
  requirements: []
189
- rubygems_version: 3.4.10
67
+ rubygems_version: 3.5.15
190
68
  signing_key:
191
69
  specification_version: 4
192
70
  summary: A simple Gemini server for static files.