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.

@@ -1,7 +1,7 @@
1
- require 'girl/custom_dns_query'
1
+ require 'girl/custom'
2
2
 
3
3
  module Girl
4
4
  class ResolvCustom
5
- include CustomDnsQuery
5
+ include Custom
6
6
  end
7
7
  end
@@ -5,7 +5,7 @@ module Girl
5
5
  # initialize
6
6
  #
7
7
  def initialize( resolvd_port, nameserver )
8
- @resolv_custom = Girl::ResolvCustom.new
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( 65535 )
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 = @resolv_custom.decode( 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 = @resolv_custom.encode( data )
190
+ data = @custom.encode( data )
191
191
  send_data( @resolvd, dst_info[ :src_addr ], data )
192
192
  close_dst( dst )
193
193
  end
@@ -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 ( now - last_recv_at >= expire_after ) && ( now - last_sent_at >= expire_after ) then
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 ].size < RESUME_BELOW then
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 ].size < RESUME_BELOW then
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 }, close src"
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( 65535 )
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.close
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( 65535 )
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( 65535 )
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
@@ -1,3 +1,3 @@
1
1
  module Girl
2
- VERSION = '4.1.0'.freeze
2
+ VERSION = '4.6.0'.freeze
3
3
  end
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.1.0
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-09 00:00:00.000000000 Z
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.15
58
+ rubygems_version: 3.2.3
60
59
  signing_key:
61
60
  specification_version: 4
62
61
  summary: 妹子
@@ -1,11 +0,0 @@
1
- module Girl
2
- module CustomDnsQuery
3
- def encode( data )
4
- data.reverse
5
- end
6
-
7
- def decode( data )
8
- data.reverse
9
- end
10
- end
11
- end