diamant 0.0.7 → 0.0.9
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 +4 -4
- data/lib/diamant/cert_generator.rb +4 -4
- data/lib/diamant/mimetype.rb +1 -0
- data/lib/diamant/response.rb +9 -3
- data/lib/diamant/version.rb +1 -1
- data/lib/diamant.rb +14 -10
- metadata +10 -132
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5f4a7116de355c0b04280914d27758f287116298d2cde5a36e311382352342b1
|
|
4
|
+
data.tar.gz: 04a5cd38b4596383a220bd553b6e6d1a9360310810156d009f8cad569db9bd01
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
26
|
+
File.write('key.rsa', @key.to_pem)
|
|
27
27
|
File.chmod(0o400, 'key.rsa')
|
|
28
|
-
|
|
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
|
|
data/lib/diamant/mimetype.rb
CHANGED
data/lib/diamant/response.rb
CHANGED
|
@@ -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::
|
|
29
|
+
r = Net::Gemini::Request.read_new(client)
|
|
26
30
|
[r.uri, route(r.path)]
|
|
27
|
-
rescue Net::
|
|
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 =
|
|
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!']
|
data/lib/diamant/version.rb
CHANGED
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
|
-
|
|
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.
|
|
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:
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|