zyre 0.6.0 → 0.7.0
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
- checksums.yaml.gz.sig +0 -0
- data/History.md +11 -0
- data/ext/zyre_ext/node.c +1 -0
- data/ext/zyre_ext/zyre_ext.c +179 -7
- data/lib/zyre.rb +1 -1
- data/spec/zyre/cert_spec.rb +4 -2
- data/spec/zyre/node_spec.rb +10 -2
- data/spec/zyre_spec.rb +113 -0
- data.tar.gz.sig +0 -0
- metadata +27 -28
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b5427b9f8cbdcbec3727b0a998a82b60b70cf7a82e36f6e3a0a86e6d9aba74a
|
4
|
+
data.tar.gz: 898dcb7df592fc24617fedc60d8f54b9f22f421ae04459215ee3c48adc581ff0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 774f4c450b24db21b8db0d52bde9334b80edf4d196b51e5f3be468b20cba83469418862b0ad862c617d2366b39cbe003d2e6e5d518c59c8b6f09ccbf2e8253da
|
7
|
+
data.tar.gz: f53e49334e7b4a5dd308080addafc65a6d3dd222463651b8c038ddd2de12cf6ba2b30a3d959649ab001e44d41fbf2d41c9ac969800fdbe10d25238cfa653e24d
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/History.md
CHANGED
@@ -2,6 +2,17 @@
|
|
2
2
|
|
3
3
|
---
|
4
4
|
|
5
|
+
## v0.7.0 [2025-08-05] Michael Granger <ged@faeriemud.org>
|
6
|
+
|
7
|
+
Improvements:
|
8
|
+
|
9
|
+
- Add ZAUTH
|
10
|
+
|
11
|
+
Fixes:
|
12
|
+
|
13
|
+
- Move the interface method setting to the Zyre toplevel since it's actually global
|
14
|
+
|
15
|
+
|
5
16
|
## v0.6.0 [2023-08-08] Michael Granger <ged@faeriemud.org>
|
6
17
|
|
7
18
|
Improvements:
|
data/ext/zyre_ext/node.c
CHANGED
@@ -286,6 +286,7 @@ rzyre_node_interface_eq( VALUE self, VALUE interface )
|
|
286
286
|
zyre_t *ptr = rzyre_get_node( self );
|
287
287
|
const char *interface_str = StringValueCStr( interface );
|
288
288
|
|
289
|
+
rb_warn( "Setting #interface on a Node sets it globally." );
|
289
290
|
zyre_set_interface( ptr, interface_str );
|
290
291
|
|
291
292
|
return Qtrue;
|
data/ext/zyre_ext/zyre_ext.c
CHANGED
@@ -17,6 +17,8 @@
|
|
17
17
|
|
18
18
|
VALUE rzyre_mZyre;
|
19
19
|
|
20
|
+
static zactor_t *auth;
|
21
|
+
|
20
22
|
|
21
23
|
/* --------------------------------------------------------------
|
22
24
|
* Logging Functions
|
@@ -148,7 +150,7 @@ rzyre_make_zmsg_from( VALUE messages )
|
|
148
150
|
*
|
149
151
|
*/
|
150
152
|
static VALUE
|
151
|
-
rzyre_s_zyre_version()
|
153
|
+
rzyre_s_zyre_version( VALUE _mod )
|
152
154
|
{
|
153
155
|
static uint64_t version;
|
154
156
|
|
@@ -293,10 +295,172 @@ rzyre_s_z85_decode( VALUE module, VALUE string )
|
|
293
295
|
}
|
294
296
|
|
295
297
|
|
298
|
+
|
299
|
+
/*
|
300
|
+
* call-seq:
|
301
|
+
* Zyre.start_authenticator -> true
|
302
|
+
*
|
303
|
+
* Start the ZAUTH authenticator actor. If it's already running, this
|
304
|
+
* call is silently ignored.
|
305
|
+
*
|
306
|
+
*/
|
296
307
|
static VALUE
|
297
308
|
rzyre_s_start_authenticator( VALUE module )
|
298
309
|
{
|
299
|
-
|
310
|
+
if ( !auth ) {
|
311
|
+
rzyre_log_obj( rzyre_mZyre, "info", "starting up the ZAUTH actor." );
|
312
|
+
auth = zactor_new( zauth, NULL );
|
313
|
+
assert( auth );
|
314
|
+
}
|
315
|
+
|
316
|
+
return Qtrue;
|
317
|
+
}
|
318
|
+
|
319
|
+
|
320
|
+
/*
|
321
|
+
* call-seq:
|
322
|
+
* Zyre.authenticator_started? -> true or false
|
323
|
+
*
|
324
|
+
* Returns `true` if the ZAUTH authenticator actor is running.
|
325
|
+
*
|
326
|
+
*/
|
327
|
+
static VALUE
|
328
|
+
rzyre_s_authenticator_started_p( VALUE module )
|
329
|
+
{
|
330
|
+
if ( auth ) {
|
331
|
+
return Qtrue;
|
332
|
+
} else {
|
333
|
+
return Qfalse;
|
334
|
+
}
|
335
|
+
}
|
336
|
+
|
337
|
+
|
338
|
+
/*
|
339
|
+
* call-seq:
|
340
|
+
* Zyre.stop_authenticator -> true
|
341
|
+
*
|
342
|
+
* Stop the ZAUTH authenticator actor if it is running. If it's not running, this
|
343
|
+
* call is silently ignored.
|
344
|
+
*
|
345
|
+
*/
|
346
|
+
static VALUE
|
347
|
+
rzyre_s_stop_authenticator( VALUE module )
|
348
|
+
{
|
349
|
+
if ( auth ) {
|
350
|
+
rzyre_log_obj( rzyre_mZyre, "info", "shutting down the ZAUTH actor." );
|
351
|
+
zactor_destroy( &auth );
|
352
|
+
}
|
353
|
+
|
354
|
+
return Qtrue;
|
355
|
+
}
|
356
|
+
|
357
|
+
|
358
|
+
/*
|
359
|
+
* Async wait function; called without the GVL.
|
360
|
+
*/
|
361
|
+
static void *
|
362
|
+
rzyre_wait_for_auth_without_gvl( void *_unused )
|
363
|
+
{
|
364
|
+
zsock_wait( auth );
|
365
|
+
return NULL;
|
366
|
+
}
|
367
|
+
|
368
|
+
|
369
|
+
/*
|
370
|
+
* call-seq:
|
371
|
+
* Zyre.verbose_auth!
|
372
|
+
*
|
373
|
+
* Enable the ZAUTH actor's verbose logging.
|
374
|
+
*
|
375
|
+
*/
|
376
|
+
static VALUE
|
377
|
+
rzyre_s_verbose_auth_bang( VALUE module )
|
378
|
+
{
|
379
|
+
if ( auth ) {
|
380
|
+
zstr_sendx( auth, "VERBOSE", NULL );
|
381
|
+
rb_thread_call_without_gvl2( rzyre_wait_for_auth_without_gvl, 0, RUBY_UBF_IO, 0 );
|
382
|
+
} else {
|
383
|
+
rb_raise( rb_eRuntimeError, "can't enable verbose auth: authenticator is not started." );
|
384
|
+
}
|
385
|
+
|
386
|
+
return Qtrue;
|
387
|
+
}
|
388
|
+
|
389
|
+
|
390
|
+
/*
|
391
|
+
* call-seq:
|
392
|
+
* Zyre.enable_curve_auth( cert_dir=nil )
|
393
|
+
*
|
394
|
+
* Enable CURVE authentication, using the specified +cert_dir+ for allowed
|
395
|
+
* public certificates. If no +cert_dir+ is given, any connection presenting a valid CURVE
|
396
|
+
* certificate will be allowed.
|
397
|
+
*
|
398
|
+
*/
|
399
|
+
static VALUE
|
400
|
+
rzyre_s_enable_curve_auth( int argc, VALUE *argv, VALUE module )
|
401
|
+
{
|
402
|
+
VALUE cert_dir = Qnil;
|
403
|
+
char *cert_dir_s;
|
404
|
+
|
405
|
+
rb_scan_args( argc, argv, "01", &cert_dir );
|
406
|
+
|
407
|
+
if ( argc ) {
|
408
|
+
cert_dir_s = StringValueCStr( cert_dir );
|
409
|
+
zstr_sendx( auth, "CURVE", cert_dir_s, NULL );
|
410
|
+
} else {
|
411
|
+
zstr_sendx( auth, "CURVE", CURVE_ALLOW_ANY, NULL );
|
412
|
+
}
|
413
|
+
|
414
|
+
rb_thread_call_without_gvl2( rzyre_wait_for_auth_without_gvl, 0, RUBY_UBF_IO, 0 );
|
415
|
+
|
416
|
+
return Qtrue;
|
417
|
+
}
|
418
|
+
|
419
|
+
|
420
|
+
/*
|
421
|
+
* call-seq:
|
422
|
+
* Zyre.interface -> string
|
423
|
+
*
|
424
|
+
* Return network interface to use for broadcasts, or nil if none was set.
|
425
|
+
*
|
426
|
+
*/
|
427
|
+
static VALUE
|
428
|
+
rzyre_s_interface( VALUE module )
|
429
|
+
{
|
430
|
+
const char *interface = zsys_interface();
|
431
|
+
|
432
|
+
if ( strnlen(interface, 1) == 0 ) {
|
433
|
+
return Qnil;
|
434
|
+
}
|
435
|
+
|
436
|
+
return rb_utf8_str_new_cstr( interface );
|
437
|
+
}
|
438
|
+
|
439
|
+
|
440
|
+
/*
|
441
|
+
* call-seq:
|
442
|
+
* Zyre.interface = string
|
443
|
+
*
|
444
|
+
* Set network interface name to use for broadcasts.
|
445
|
+
*
|
446
|
+
* This lets the interface be configured for test environments where required.
|
447
|
+
* For example, on Mac OS X, zbeacon cannot bind to 255.255.255.255 which is
|
448
|
+
* the default when there is no specified interface. If the environment
|
449
|
+
* variable ZSYS_INTERFACE is set, use that as the default interface name.
|
450
|
+
* Setting the interface to "*" means "use all available interfaces".
|
451
|
+
*
|
452
|
+
*/
|
453
|
+
static VALUE
|
454
|
+
rzyre_s_interface_eq( VALUE module, VALUE new_interface )
|
455
|
+
{
|
456
|
+
if ( NIL_P(new_interface) ) {
|
457
|
+
zsys_set_interface( "" );
|
458
|
+
} else {
|
459
|
+
const char *new_interface_s = StringValueCStr( new_interface );
|
460
|
+
zsys_set_interface( new_interface_s );
|
461
|
+
}
|
462
|
+
|
463
|
+
return Qtrue;
|
300
464
|
}
|
301
465
|
|
302
466
|
|
@@ -326,15 +490,23 @@ Init_zyre_ext()
|
|
326
490
|
|
327
491
|
rb_define_singleton_method( rzyre_mZyre, "zyre_version", rzyre_s_zyre_version, 0 );
|
328
492
|
rb_define_singleton_method( rzyre_mZyre, "interfaces", rzyre_s_interfaces, 0 );
|
329
|
-
rb_define_singleton_method( rzyre_mZyre, "disable_zsys_handler",
|
493
|
+
rb_define_singleton_method( rzyre_mZyre, "disable_zsys_handler",
|
494
|
+
rzyre_s_disable_zsys_handler, 0 );
|
330
495
|
|
331
496
|
rb_define_singleton_method( rzyre_mZyre, "z85_encode", rzyre_s_z85_encode, 1 );
|
332
497
|
rb_define_singleton_method( rzyre_mZyre, "z85_decode", rzyre_s_z85_decode, 1 );
|
333
498
|
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
499
|
+
rb_define_singleton_method( rzyre_mZyre, "start_authenticator",
|
500
|
+
rzyre_s_start_authenticator, 0 );
|
501
|
+
rb_define_singleton_method( rzyre_mZyre, "authenticator_started?",
|
502
|
+
rzyre_s_authenticator_started_p, 0 );
|
503
|
+
rb_define_singleton_method( rzyre_mZyre, "stop_authenticator", rzyre_s_stop_authenticator, 0 );
|
504
|
+
|
505
|
+
rb_define_singleton_method( rzyre_mZyre, "verbose_auth!", rzyre_s_verbose_auth_bang, 0 );
|
506
|
+
rb_define_singleton_method( rzyre_mZyre, "enable_curve_auth", rzyre_s_enable_curve_auth, -1 );
|
507
|
+
|
508
|
+
rb_define_singleton_method( rzyre_mZyre, "interface", rzyre_s_interface, 0 );
|
509
|
+
rb_define_singleton_method( rzyre_mZyre, "interface=", rzyre_s_interface_eq, 1 );
|
338
510
|
|
339
511
|
// :TODO: set up zsys_set_logsender()
|
340
512
|
|
data/lib/zyre.rb
CHANGED
data/spec/zyre/cert_spec.rb
CHANGED
@@ -46,7 +46,7 @@ RSpec.describe( Zyre::Cert ) do
|
|
46
46
|
|
47
47
|
expect( result ).to be_a( described_class )
|
48
48
|
expect( result.public_key ).to eq( cert.public_key )
|
49
|
-
expect( result.secret_key ).to eq(
|
49
|
+
expect( result.secret_key ).to eq( described_class::EMPTY_KEY )
|
50
50
|
end
|
51
51
|
|
52
52
|
|
@@ -197,7 +197,7 @@ RSpec.describe( Zyre::Cert ) do
|
|
197
197
|
|
198
198
|
it "can be applied to a Zyre node", :draft_apis do
|
199
199
|
node = instance_double( Zyre::Node )
|
200
|
-
cert =
|
200
|
+
cert = described_class.new
|
201
201
|
|
202
202
|
expect( node ).to receive( :zcert= ).with( cert )
|
203
203
|
cert.apply( node )
|
@@ -212,6 +212,8 @@ RSpec.describe( Zyre::Cert ) do
|
|
212
212
|
other = cert.dup
|
213
213
|
|
214
214
|
expect( other.object_id ).not_to eq( cert.object_id )
|
215
|
+
expect( other[:node_id] ).to eq( cert[:node_id] )
|
216
|
+
expect( other[:node_order] ).to eq( cert[:node_order] )
|
215
217
|
end
|
216
218
|
|
217
219
|
|
data/spec/zyre/node_spec.rb
CHANGED
@@ -26,6 +26,14 @@ RSpec.describe( Zyre::Node ) do
|
|
26
26
|
TEST_BINARY_STRING = TEST_BINARY_STRING_PARTS.join( '' )
|
27
27
|
|
28
28
|
|
29
|
+
before( :each ) do
|
30
|
+
@interface = Zyre.interface
|
31
|
+
end
|
32
|
+
after( :each ) do
|
33
|
+
Zyre.interface = @interface
|
34
|
+
end
|
35
|
+
|
36
|
+
|
29
37
|
it "can be created anonymously" do
|
30
38
|
node = described_class.new
|
31
39
|
|
@@ -108,11 +116,11 @@ RSpec.describe( Zyre::Node ) do
|
|
108
116
|
end
|
109
117
|
|
110
118
|
|
111
|
-
it "
|
119
|
+
it "has a backward-compatible method for setting the interface on a Node" do
|
112
120
|
node = described_class.new
|
113
121
|
expect {
|
114
122
|
node.interface = 'lo0'
|
115
|
-
}.
|
123
|
+
}.to change { Zyre.interface }.to( 'lo0' )
|
116
124
|
end
|
117
125
|
|
118
126
|
|
data/spec/zyre_spec.rb
CHANGED
@@ -7,6 +7,14 @@ require 'zyre'
|
|
7
7
|
|
8
8
|
RSpec.describe( Zyre ) do
|
9
9
|
|
10
|
+
before( :each ) do
|
11
|
+
@interface = described_class.interface
|
12
|
+
end
|
13
|
+
after( :each ) do
|
14
|
+
described_class.interface = @interface
|
15
|
+
described_class.stop_authenticator
|
16
|
+
end
|
17
|
+
|
10
18
|
|
11
19
|
# Pattern for matching IPv4 addresses
|
12
20
|
IPV4_ADDRESS = /^((?:(?:^|\.)(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){4})$/
|
@@ -64,6 +72,21 @@ RSpec.describe( Zyre ) do
|
|
64
72
|
end
|
65
73
|
|
66
74
|
|
75
|
+
it "can set the interface used by all nodes" do
|
76
|
+
expect {
|
77
|
+
described_class.interface = 'LENNY'
|
78
|
+
}.to change { described_class.interface }.to( 'LENNY' )
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
it "clears the interface setting if set to `nil`" do
|
83
|
+
described_class.interface = "eth0"
|
84
|
+
expect {
|
85
|
+
described_class.interface = nil
|
86
|
+
}.to change { described_class.interface }.to( nil )
|
87
|
+
end
|
88
|
+
|
89
|
+
|
67
90
|
describe "Z85 encoding/decoding" do
|
68
91
|
|
69
92
|
# From the 32/Z85 reference code:
|
@@ -126,5 +149,95 @@ RSpec.describe( Zyre ) do
|
|
126
149
|
|
127
150
|
end
|
128
151
|
|
152
|
+
|
153
|
+
describe "ZAUTH authenticator" do
|
154
|
+
|
155
|
+
it "can be started" do
|
156
|
+
expect {
|
157
|
+
described_class.start_authenticator
|
158
|
+
}.to change { described_class.authenticator_started? }.to( true )
|
159
|
+
end
|
160
|
+
|
161
|
+
|
162
|
+
it "ignores call to start if it's already started" do
|
163
|
+
described_class.start_authenticator
|
164
|
+
|
165
|
+
expect {
|
166
|
+
described_class.start_authenticator
|
167
|
+
}.not_to raise_error
|
168
|
+
end
|
169
|
+
|
170
|
+
|
171
|
+
it "can be stopped" do
|
172
|
+
described_class.start_authenticator
|
173
|
+
|
174
|
+
expect {
|
175
|
+
described_class.stop_authenticator
|
176
|
+
}.to change { described_class.authenticator_started? }.to( false )
|
177
|
+
end
|
178
|
+
|
179
|
+
|
180
|
+
it "ignores calls to stop if it's not started" do
|
181
|
+
expect {
|
182
|
+
described_class.stop_authenticator
|
183
|
+
}.not_to raise_error
|
184
|
+
end
|
185
|
+
|
186
|
+
|
187
|
+
it "can enable verbose auth logging" do
|
188
|
+
described_class.start_authenticator
|
189
|
+
expect {
|
190
|
+
described_class.verbose_auth!
|
191
|
+
}.not_to raise_error
|
192
|
+
end
|
193
|
+
|
194
|
+
|
195
|
+
it "raises an error if verbose auth logging is enabled before the authenticator is started" do
|
196
|
+
expect {
|
197
|
+
described_class.verbose_auth!
|
198
|
+
}.to raise_error( /authenticator is not started/i )
|
199
|
+
end
|
200
|
+
|
201
|
+
|
202
|
+
it "supports any-cert style authentication" do
|
203
|
+
described_class.start_authenticator
|
204
|
+
# described_class.verbose_auth!
|
205
|
+
described_class.enable_curve_auth
|
206
|
+
|
207
|
+
server_cert = Zyre::Cert.new
|
208
|
+
server = Zyre::Node.new( 'server' )
|
209
|
+
# server.verbose!
|
210
|
+
server.zap_domain = 'TEST'
|
211
|
+
server.zcert = server_cert
|
212
|
+
server.set_header( 'X-PUBLICKEY', server_cert.public_txt )
|
213
|
+
server.join( 'TEST' )
|
214
|
+
server.start
|
215
|
+
|
216
|
+
client_cert = Zyre::Cert.new
|
217
|
+
authed_client = Zyre::Node.new( 'authed_client' )
|
218
|
+
# authed_client.verbose!
|
219
|
+
authed_client.zap_domain = 'TEST'
|
220
|
+
authed_client.zcert = client_cert
|
221
|
+
authed_client.set_header( 'X-PUBLICKEY', client_cert.public_txt )
|
222
|
+
authed_client.join( 'TEST' )
|
223
|
+
authed_client.start
|
224
|
+
authed_client.shout( 'TEST', 'authed_client hello' )
|
225
|
+
|
226
|
+
result = server.wait_for( :JOIN, timeout: 0.2 )
|
227
|
+
expect( result ).to be_a( Zyre::Event::Join )
|
228
|
+
|
229
|
+
noauth_client = Zyre::Node.new( 'noauth_client' )
|
230
|
+
# noauth_client.verbose!
|
231
|
+
noauth_client.zap_domain = 'TEST'
|
232
|
+
noauth_client.join( 'TEST' )
|
233
|
+
noauth_client.start
|
234
|
+
noauth_client.shout( 'TEST', 'noauth_client hello' )
|
235
|
+
|
236
|
+
result = server.wait_for( :JOIN, timeout: 0.2 )
|
237
|
+
expect( result ).to be_nil
|
238
|
+
end
|
239
|
+
|
240
|
+
end
|
241
|
+
|
129
242
|
end
|
130
243
|
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,39 +1,40 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zyre
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Granger
|
8
|
-
autorequire:
|
9
8
|
bindir: bin
|
10
9
|
cert_chain:
|
11
10
|
- |
|
12
11
|
-----BEGIN CERTIFICATE-----
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
12
|
+
MIIEbDCCAtSgAwIBAgIBATANBgkqhkiG9w0BAQsFADA+MQwwCgYDVQQDDANnZWQx
|
13
|
+
GTAXBgoJkiaJk/IsZAEZFglGYWVyaWVNVUQxEzARBgoJkiaJk/IsZAEZFgNvcmcw
|
14
|
+
HhcNMjUwMTAxMDMzMTA5WhcNMjYwMTAxMDMzMTA5WjA+MQwwCgYDVQQDDANnZWQx
|
15
|
+
GTAXBgoJkiaJk/IsZAEZFglGYWVyaWVNVUQxEzARBgoJkiaJk/IsZAEZFgNvcmcw
|
16
|
+
ggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC/JWGRHO+USzR97vXjkFgt
|
17
|
+
83qeNf2KHkcvrRTSnR64i6um/ziin0I0oX23H7VYrDJC9A/uoUa5nGRJS5Zw/+wW
|
18
|
+
ENcvWVZS4iUzi4dsYJGY6yEOsXh2CcF46+QevV8iE+UmbkU75V7Dy1JCaUOyizEt
|
19
|
+
TH5UHsOtUU7k9TYARt/TgYZKuaoAMZZd5qyVqhF1vV+7/Qzmp89NGflXf2xYP26a
|
20
|
+
4MAX2qqKX/FKXqmFO+AGsbwYTEds1mksBF3fGsFgsQWxftG8GfZQ9+Cyu2+l1eOw
|
21
|
+
cZ+lPcg834G9DrqW2zhqUoLr1MTly4pqxYGb7XoDhoR7dd1kFE2a067+DzWC/ADt
|
22
|
+
+QkcqWUm5oh1fN0eqr7NsZlVJDulFgdiiYPQiIN7UNsii4Wc9aZqBoGcYfBeQNPZ
|
23
|
+
soo/6za/bWajOKUmDhpqvaiRv9EDpVLzuj53uDoukMMwxCMfgb04+ckQ0t2G7wqc
|
24
|
+
/D+K9JW9DDs3Yjgv9k4h7YMhW5gftosd+NkNC/+Y2CkCAwEAAaN1MHMwCQYDVR0T
|
25
|
+
BAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFHKN/nkRusdqCJEuq3lgB3fJvyTg
|
26
|
+
MBwGA1UdEQQVMBOBEWdlZEBGYWVyaWVNVUQub3JnMBwGA1UdEgQVMBOBEWdlZEBG
|
27
|
+
YWVyaWVNVUQub3JnMA0GCSqGSIb3DQEBCwUAA4IBgQBjrBzCKWzXFigswYSPzGO8
|
28
|
+
9atBtY/eQdcN6KCL+PTzQBD9yePGF7H/xsww3awRauP+D1VUjCFbiiC3Qb0Ww0Qd
|
29
|
+
OVA0s10T9KpZ8nb2XyKocSK7TfgDhcyr0V4H2MPxwK9SWYjGGh8z9z9HmT0i3PyX
|
30
|
+
fXOSzzEoG6u26HIOg0nxSpitEjiAHBekQxy9ka5NuQbxoxMg+eIHU4rU9IUhu0Rf
|
31
|
+
wl4wuvPVE3UQK0v0uqT6rJukEKQ1iNgK5R8klgEIv79XhQPgTkMt31FGfrwOp6HB
|
32
|
+
OE0HMwOwY9B0w3aOxxdMQyyRxaZVv3eWE5RimQI7T0TUaxPngtS33ByMZjTeidxi
|
33
|
+
ESIUEPVXoBCkFgLW1EVlBb+rG7WLYod4eVll4tKA42Bi2Ju90tqiJ1YQiyuRfCnp
|
34
|
+
8qAqdfV+4u6Huu1KzAuDQCheyEyISsLST37sU/irV3czV6BiFipWag1XiJciRT3A
|
35
|
+
wZqCfTNVHTdtsCbfdA1DsA3RdG2iEH3TOHzv1Rqzqh4=
|
35
36
|
-----END CERTIFICATE-----
|
36
|
-
date:
|
37
|
+
date: 2025-08-05 00:00:00.000000000 Z
|
37
38
|
dependencies:
|
38
39
|
- !ruby/object:Gem::Dependency
|
39
40
|
name: loggability
|
@@ -207,7 +208,6 @@ metadata:
|
|
207
208
|
documentation_uri: https://deveiate.org/code/zyre
|
208
209
|
changelog_uri: https://deveiate.org/code/zyre/History_md.html
|
209
210
|
source_uri: https://gitlab.com/ravngroup/open-source/ruby-zyre/-/tree/master
|
210
|
-
post_install_message:
|
211
211
|
rdoc_options: []
|
212
212
|
require_paths:
|
213
213
|
- lib
|
@@ -222,8 +222,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
222
222
|
- !ruby/object:Gem::Version
|
223
223
|
version: '0'
|
224
224
|
requirements: []
|
225
|
-
rubygems_version: 3.
|
226
|
-
signing_key:
|
225
|
+
rubygems_version: 3.6.9
|
227
226
|
specification_version: 4
|
228
227
|
summary: A ZRE library for Ruby.
|
229
228
|
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|