girl 4.1.0 → 4.6.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of girl might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/girl.gemspec +0 -1
- data/lib/girl/concurrent_hash.rb +26 -26
- data/lib/girl/head.rb +7 -3
- data/lib/girl/proxy.rb +4 -6
- data/lib/girl/proxy_custom.rb +16 -16
- data/lib/girl/proxy_worker.rb +101 -68
- data/lib/girl/proxyd_custom.rb +12 -12
- data/lib/girl/proxyd_worker.rb +80 -28
- data/lib/girl/relay.rb +1 -1
- data/lib/girl/relay_worker.rb +93 -65
- data/lib/girl/resolv_custom.rb +2 -2
- data/lib/girl/resolvd_worker.rb +4 -4
- data/lib/girl/ssl_worker.rb +50 -14
- data/lib/girl/version.rb +1 -1
- metadata +3 -4
- data/lib/girl/custom_dns_query.rb +0 -11
data/lib/girl/resolv_custom.rb
CHANGED
data/lib/girl/resolvd_worker.rb
CHANGED
@@ -5,7 +5,7 @@ module Girl
|
|
5
5
|
# initialize
|
6
6
|
#
|
7
7
|
def initialize( resolvd_port, nameserver )
|
8
|
-
@
|
8
|
+
@custom = Girl::ResolvCustom.new
|
9
9
|
@nameserver_addr = Socket.sockaddr_in( 53, nameserver )
|
10
10
|
@roles = ConcurrentHash.new # :resolvd / :dst
|
11
11
|
@reads = []
|
@@ -162,7 +162,7 @@ module Girl
|
|
162
162
|
# read dotr
|
163
163
|
#
|
164
164
|
def read_dotr( dotr )
|
165
|
-
dotr.read_nonblock(
|
165
|
+
dotr.read_nonblock( READ_SIZE )
|
166
166
|
|
167
167
|
if @closing_dsts.any? then
|
168
168
|
@closing_dsts.each { | dst | close_dst( dst ) }
|
@@ -176,7 +176,7 @@ module Girl
|
|
176
176
|
def read_resolvd( resolvd )
|
177
177
|
data, addrinfo, rflags, *controls = resolvd.recvmsg
|
178
178
|
# puts "debug1 resolvd recvmsg #{ addrinfo.ip_unpack.inspect } #{ data.inspect }"
|
179
|
-
data = @
|
179
|
+
data = @custom.decode( data )
|
180
180
|
new_a_dst( addrinfo.to_sockaddr, data )
|
181
181
|
end
|
182
182
|
|
@@ -187,7 +187,7 @@ module Girl
|
|
187
187
|
data, addrinfo, rflags, *controls = dst.recvmsg
|
188
188
|
# puts "debug1 dst recvmsg #{ addrinfo.ip_unpack.inspect } #{ data.inspect }"
|
189
189
|
dst_info = @dst_infos[ dst ]
|
190
|
-
data = @
|
190
|
+
data = @custom.encode( data )
|
191
191
|
send_data( @resolvd, dst_info[ :src_addr ], data )
|
192
192
|
close_dst( dst )
|
193
193
|
end
|
data/lib/girl/ssl_worker.rb
CHANGED
@@ -236,6 +236,17 @@ module Girl
|
|
236
236
|
end
|
237
237
|
end
|
238
238
|
|
239
|
+
##
|
240
|
+
# close redir
|
241
|
+
#
|
242
|
+
def close_redir( redir )
|
243
|
+
return if redir.closed?
|
244
|
+
redir.close
|
245
|
+
@roles.delete( redir )
|
246
|
+
@reads.delete( redir )
|
247
|
+
@src_infos.keys.each { | src | close_src( src ) }
|
248
|
+
end
|
249
|
+
|
239
250
|
##
|
240
251
|
# close sock
|
241
252
|
#
|
@@ -329,9 +340,21 @@ module Girl
|
|
329
340
|
@src_infos.each do | src, src_info |
|
330
341
|
last_recv_at = src_info[ :last_recv_at ] || src_info[ :created_at ]
|
331
342
|
last_sent_at = src_info[ :last_sent_at ] || src_info[ :created_at ]
|
332
|
-
expire_after = src_info[ :dst ] ? EXPIRE_AFTER : EXPIRE_NEW
|
333
343
|
|
334
|
-
if
|
344
|
+
if src_info[ :dst ] then
|
345
|
+
if src_info[ :dst_connected ] then
|
346
|
+
expire_after = EXPIRE_AFTER
|
347
|
+
is_expire = ( now - last_recv_at >= expire_after ) && ( now - last_sent_at >= expire_after )
|
348
|
+
else
|
349
|
+
expire_after = EXPIRE_CONNECTING
|
350
|
+
is_expire = ( now - src_info[ :dst_created_at ] >= expire_after )
|
351
|
+
end
|
352
|
+
else
|
353
|
+
expire_after = EXPIRE_NEW
|
354
|
+
is_expire = ( now - last_recv_at >= expire_after ) && ( now - last_sent_at >= expire_after )
|
355
|
+
end
|
356
|
+
|
357
|
+
if is_expire then
|
335
358
|
puts "p#{ Process.pid } #{ Time.new } expire src #{ expire_after } #{ src_info[ :id ] } #{ src_info[ :destination_domain ] }"
|
336
359
|
add_closing_src( src )
|
337
360
|
|
@@ -359,7 +382,7 @@ module Girl
|
|
359
382
|
if dst && !dst.closed? then
|
360
383
|
dst_info = @dst_infos[ dst ]
|
361
384
|
|
362
|
-
if dst_info[ :wbuff ].
|
385
|
+
if dst_info[ :wbuff ].bytesize < RESUME_BELOW then
|
363
386
|
puts "p#{ Process.pid } #{ Time.new } resume direct src #{ src_info[ :destination_domain ] }"
|
364
387
|
add_resume_src( src )
|
365
388
|
end
|
@@ -369,11 +392,11 @@ module Girl
|
|
369
392
|
@paused_dsts.each do | dst |
|
370
393
|
dst_info = @dst_infos[ dst ]
|
371
394
|
src = dst_info[ :src ]
|
372
|
-
|
395
|
+
|
373
396
|
if src && !src.closed? then
|
374
397
|
src_info = @src_infos[ src ]
|
375
398
|
|
376
|
-
if src_info[ :wbuff ].
|
399
|
+
if src_info[ :wbuff ].bytesize < RESUME_BELOW then
|
377
400
|
puts "p#{ Process.pid } #{ Time.new } resume dst #{ dst_info[ :domain ] }"
|
378
401
|
add_resume_dst( dst )
|
379
402
|
end
|
@@ -392,13 +415,14 @@ module Girl
|
|
392
415
|
domain = src_info[ :destination_domain ]
|
393
416
|
destination_addr = Socket.sockaddr_in( src_info[ :destination_port ], ip_info.ip_address )
|
394
417
|
dst = Socket.new( ip_info.ipv4? ? Socket::AF_INET : Socket::AF_INET6, Socket::SOCK_STREAM, 0 )
|
418
|
+
dst.setsockopt( Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1 )
|
395
419
|
|
396
420
|
begin
|
397
421
|
dst.connect_nonblock( destination_addr )
|
398
422
|
rescue IO::WaitWritable
|
399
423
|
# connect nonblock 必抛 wait writable
|
400
424
|
rescue Exception => e
|
401
|
-
puts "p#{ Process.pid } #{ Time.new } dst connect destination #{ domain } #{ src_info[ :destination_port ] } #{ ip_info.ip_address } #{ e.class }
|
425
|
+
puts "p#{ Process.pid } #{ Time.new } dst connect destination #{ domain } #{ src_info[ :destination_port ] } #{ ip_info.ip_address } #{ e.class }"
|
402
426
|
dst.close
|
403
427
|
add_closing_src( src )
|
404
428
|
return
|
@@ -413,10 +437,12 @@ module Girl
|
|
413
437
|
}
|
414
438
|
|
415
439
|
@dst_infos[ dst ] = dst_info
|
416
|
-
add_read( dst, :dst )
|
417
440
|
src_info[ :proxy_type ] = :direct
|
418
441
|
src_info[ :dst ] = dst
|
442
|
+
src_info[ :dst_created_at ] = Time.new
|
419
443
|
add_socks5_conn_reply( src )
|
444
|
+
add_read( dst, :dst )
|
445
|
+
add_write( dst )
|
420
446
|
end
|
421
447
|
|
422
448
|
##
|
@@ -424,6 +450,7 @@ module Girl
|
|
424
450
|
#
|
425
451
|
def new_a_redir
|
426
452
|
pre = Socket.new( Socket::AF_INET, Socket::SOCK_STREAM, 0 )
|
453
|
+
pre.setsockopt( Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1 )
|
427
454
|
pre.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1 )
|
428
455
|
pre.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEPORT, 1 )
|
429
456
|
pre.bind( Socket.sockaddr_in( @redir_port, '0.0.0.0' ) )
|
@@ -523,7 +550,7 @@ module Girl
|
|
523
550
|
# read dotr
|
524
551
|
#
|
525
552
|
def read_dotr( dotr )
|
526
|
-
dotr.read_nonblock(
|
553
|
+
dotr.read_nonblock( READ_SIZE )
|
527
554
|
|
528
555
|
if @closing_srcs.any? then
|
529
556
|
@closing_srcs.each { | src | close_src( src ) }
|
@@ -560,15 +587,17 @@ module Girl
|
|
560
587
|
|
561
588
|
unless accepted then
|
562
589
|
puts "p#{ Process.pid } #{ Time.new } accept timeout"
|
563
|
-
redir
|
564
|
-
@roles.delete( redir )
|
565
|
-
@reads.delete( redir )
|
590
|
+
close_redir( redir )
|
566
591
|
new_a_redir
|
567
592
|
end
|
568
593
|
end
|
569
594
|
|
570
595
|
begin
|
571
596
|
src = redir.accept
|
597
|
+
rescue SystemExit => e
|
598
|
+
puts "p#{ Process.pid } #{ Time.new } redir accept #{ e.class }"
|
599
|
+
close_redir( redir )
|
600
|
+
return
|
572
601
|
rescue Exception => e
|
573
602
|
puts "p#{ Process.pid } #{ Time.new } redir accept #{ e.class }"
|
574
603
|
puts e.full_message
|
@@ -586,6 +615,8 @@ module Girl
|
|
586
615
|
is_connect: true, # 代理协议是http的场合,是否是CONNECT
|
587
616
|
rbuff: '', # 读到的流量
|
588
617
|
dst: nil, # 对应的dst
|
618
|
+
dst_created_at: nil, # 对应的dst的创建时间
|
619
|
+
dst_connected: false, # 对应的dst是否已连接
|
589
620
|
wbuff: '', # 从dst读到的流量
|
590
621
|
created_at: Time.new, # 创建时间
|
591
622
|
last_recv_at: nil, # 上一次收到新流量(由dst收到)的时间
|
@@ -610,7 +641,7 @@ module Girl
|
|
610
641
|
src_info = @src_infos[ src ]
|
611
642
|
|
612
643
|
begin
|
613
|
-
data = src.read_nonblock(
|
644
|
+
data = src.read_nonblock( READ_SIZE )
|
614
645
|
rescue IO::WaitReadable
|
615
646
|
return
|
616
647
|
rescue Errno::EINTR => e
|
@@ -728,7 +759,7 @@ module Girl
|
|
728
759
|
src = dst_info[ :src ]
|
729
760
|
|
730
761
|
begin
|
731
|
-
data = dst.read_nonblock(
|
762
|
+
data = dst.read_nonblock( READ_SIZE )
|
732
763
|
rescue IO::WaitReadable, Errno::EINTR
|
733
764
|
print 'r'
|
734
765
|
return
|
@@ -799,6 +830,12 @@ module Girl
|
|
799
830
|
|
800
831
|
dst_info = @dst_infos[ dst ]
|
801
832
|
src = dst_info[ :src ]
|
833
|
+
src_info = @src_infos[ src ]
|
834
|
+
|
835
|
+
unless src.closed? then
|
836
|
+
src_info[ :dst_connected ] = true
|
837
|
+
end
|
838
|
+
|
802
839
|
data = dst_info[ :wbuff ]
|
803
840
|
|
804
841
|
# 写前为空,处理关闭写
|
@@ -829,7 +866,6 @@ module Girl
|
|
829
866
|
dst_info[ :wbuff ] = data
|
830
867
|
|
831
868
|
unless src.closed? then
|
832
|
-
src_info = @src_infos[ src ]
|
833
869
|
src_info[ :last_sent_at ] = Time.new
|
834
870
|
end
|
835
871
|
end
|
data/lib/girl/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: girl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- takafan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-04-
|
11
|
+
date: 2021-04-20 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: escape evil.
|
14
14
|
email:
|
@@ -21,7 +21,6 @@ files:
|
|
21
21
|
- lib/girl.rb
|
22
22
|
- lib/girl/concurrent_hash.rb
|
23
23
|
- lib/girl/custom.rb
|
24
|
-
- lib/girl/custom_dns_query.rb
|
25
24
|
- lib/girl/head.rb
|
26
25
|
- lib/girl/proxy.rb
|
27
26
|
- lib/girl/proxy_custom.rb
|
@@ -56,7 +55,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
56
55
|
- !ruby/object:Gem::Version
|
57
56
|
version: '0'
|
58
57
|
requirements: []
|
59
|
-
rubygems_version: 3.2.
|
58
|
+
rubygems_version: 3.2.3
|
60
59
|
signing_key:
|
61
60
|
specification_version: 4
|
62
61
|
summary: 妹子
|