rex-core 0.1.20 → 0.1.24

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cacc2616718c8056c7ff5ecf2626562f71ac9efd0a6ae69c80cd21565824b666
4
- data.tar.gz: e6ed793586462b6cc826be77b533030e45a7bce1ae4fd0bdb2cbaf62ed6e17dd
3
+ metadata.gz: 879343c39c0c1769143a3d0b5c61ce102e26ac898a50e5eec9581bc2bee47c91
4
+ data.tar.gz: fca03a370a59dc3d03369fb29f47a0fb5e42dcb66db9d6e7b4f3b0824e9620f7
5
5
  SHA512:
6
- metadata.gz: a7367cb540a9638f4f64e5756f3c9761e3ebe05f15444ee2d4ae8e6f6af94888f50e2813cc89e7ef3bc7492335f20c31ccc98c8c3ba4b2a55e61995b174c8497
7
- data.tar.gz: 4dbd3f07ec237c23ca088bbbdc2f67e2a59bcf5167bcebe841550877fc99f1e81ef3a9c763ddb9c7d8478844676e08ee3f706188c721049be00fbe2b3350ef89
6
+ metadata.gz: fda24ae80de4cfda9e66f3bfe45b93bee23e4b35b57bb55f1fca0784721fa333154c8d6972a01594794a3b479e3a07c7809c0911a573b79315dfa8d01148faea
7
+ data.tar.gz: a6c8d8c2783a611b50f240e664ab2011da5e6ec5d46b3d7353e12cae0e56140f0ec33973fa7d25c0e10226a12b53815bc76fa3de6363678eb6b8e72cc2e7a569
checksums.yaml.gz.sig CHANGED
Binary file
@@ -0,0 +1,45 @@
1
+ name: Verify
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - '*'
7
+ pull_request:
8
+ branches:
9
+ - '*'
10
+
11
+ jobs:
12
+ test:
13
+ runs-on: ubuntu-18.04
14
+ timeout-minutes: 40
15
+
16
+ strategy:
17
+ fail-fast: true
18
+ matrix:
19
+ ruby:
20
+ - 2.6
21
+ - 2.7
22
+ - 3.0
23
+ test_cmd:
24
+ - bundle exec rspec
25
+
26
+ env:
27
+ RAILS_ENV: test
28
+
29
+ name: Ruby ${{ matrix.ruby }} - ${{ matrix.test_cmd }}
30
+ steps:
31
+ - name: Checkout code
32
+ uses: actions/checkout@v2
33
+
34
+ - name: Setup Ruby
35
+ uses: ruby/setup-ruby@v1
36
+ with:
37
+ ruby-version: ${{ matrix.ruby }}
38
+ bundler-cache: true
39
+
40
+ - name: ${{ matrix.test_cmd }}
41
+ run: |
42
+ echo "${CMD}"
43
+ bash -c "${CMD}"
44
+ env:
45
+ CMD: ${{ matrix.test_cmd }}
@@ -1,5 +1,5 @@
1
1
  module Rex
2
2
  module Core
3
- VERSION = "0.1.20"
3
+ VERSION = "0.1.24"
4
4
  end
5
5
  end
@@ -4,202 +4,192 @@ require 'socket'
4
4
  require 'fcntl'
5
5
 
6
6
  module Rex
7
- module IO
8
-
9
- ###
10
- #
11
- # This class provides an abstraction to a stream based
12
- # connection through the use of a streaming socketpair.
13
- #
14
- ###
15
- module SocketAbstraction
16
-
17
- ###
18
- #
19
- # Extension information for required Stream interface.
20
- #
21
- ###
22
- module Ext
23
-
24
- #
25
- # Initializes peer information.
7
+ module IO
8
+ ###
26
9
  #
27
- def initinfo(peer,local)
28
- @peer = peer
29
- @local = local
30
- end
31
-
10
+ # This class provides an abstraction to a stream based
11
+ # connection through the use of a streaming socketpair.
32
12
  #
33
- # Symbolic peer information.
34
- #
35
- def peerinfo
36
- (@peer || "Remote Pipe")
37
- end
13
+ ###
14
+ module SocketAbstraction
15
+ ###
16
+ #
17
+ # Extension information for required Stream interface.
18
+ #
19
+ ###
20
+ module Ext
21
+ #
22
+ # Initializes peer information.
23
+ #
24
+ def initinfo(peer, local)
25
+ @peer = peer
26
+ @local = local
27
+ end
38
28
 
39
- #
40
- # Symbolic local information.
41
- #
42
- def localinfo
43
- (@local || "Local Pipe")
44
- end
45
- end
46
-
47
- #
48
- # Override this method to init the abstraction
49
- #
50
- def initialize_abstraction
51
- self.lsock, self.rsock = Rex::Compat.pipe
52
- end
53
-
54
- #
55
- # This method cleans up the abstraction layer.
56
- #
57
- def cleanup_abstraction
58
- self.lsock.close if (self.lsock and !self.lsock.closed?)
59
- self.rsock.close if (self.rsock and !self.rsock.closed?)
60
-
61
- self.lsock = nil
62
- self.rsock = nil
63
- end
64
-
65
- #
66
- # Low-level write to the local side.
67
- #
68
- def syswrite(buffer)
69
- lsock.syswrite(buffer)
70
- end
71
-
72
- #
73
- # Low-level read from the local side.
74
- #
75
- def sysread(length)
76
- lsock.sysread(length)
77
- end
78
-
79
- #
80
- # Shuts down the local side of the stream abstraction.
81
- #
82
- def shutdown(how)
83
- lsock.shutdown(how)
84
- end
85
-
86
- #
87
- # Closes both sides of the stream abstraction.
88
- #
89
- def close
90
- cleanup_abstraction
91
- super
92
- end
93
-
94
- #
95
- # Symbolic peer information.
96
- #
97
- def peerinfo
98
- "Remote-side of Pipe"
99
- end
100
-
101
- #
102
- # Symbolic local information.
103
- #
104
- def localinfo
105
- "Local-side of Pipe"
106
- end
107
-
108
- #
109
- # The left side of the stream.
110
- #
111
- attr_reader :lsock
112
- #
113
- # The right side of the stream.
114
- #
115
- attr_reader :rsock
116
-
117
- protected
118
-
119
- def monitor_rsock(threadname = "SocketMonitorRemote")
120
- self.monitor_thread = Rex::ThreadFactory.spawn(threadname, false) {
121
- loop do
122
- closed = false
123
- buf = nil
124
-
125
- if not self.rsock
126
- wlog("monitor_rsock: the remote socket is nil, exiting loop")
127
- break
29
+ #
30
+ # Symbolic peer information.
31
+ #
32
+ def peerinfo
33
+ (@peer || 'Remote Pipe')
128
34
  end
129
35
 
130
- begin
131
- s = Rex::ThreadSafe.select( [ self.rsock ], nil, nil, 0.2 )
132
- if( s == nil || s[0] == nil )
133
- next
134
- end
135
- rescue Exception => e
136
- wlog("monitor_rsock: exception during select: #{e.class} #{e}")
137
- closed = true
36
+ #
37
+ # Symbolic local information.
38
+ #
39
+ def localinfo
40
+ (@local || 'Local Pipe')
138
41
  end
42
+ end
139
43
 
140
- if( closed == false )
141
- begin
142
- buf = self.rsock.sysread( 32768 )
143
- if buf == nil
144
- closed = true
145
- wlog("monitor_rsock: closed remote socket due to nil read")
44
+ #
45
+ # Override this method to init the abstraction
46
+ #
47
+ def initialize_abstraction
48
+ self.lsock, self.rsock = Rex::Compat.pipe
49
+ end
50
+
51
+ #
52
+ # This method cleans up the abstraction layer.
53
+ #
54
+ def cleanup_abstraction
55
+ lsock.close if lsock and !lsock.closed?
56
+ rsock.close if rsock and !rsock.closed?
57
+
58
+ self.lsock = nil
59
+ self.rsock = nil
60
+ end
61
+
62
+ #
63
+ # Low-level write to the local side.
64
+ #
65
+ def syswrite(buffer)
66
+ lsock.syswrite(buffer)
67
+ end
68
+
69
+ #
70
+ # Low-level read from the local side.
71
+ #
72
+ def sysread(length)
73
+ lsock.sysread(length)
74
+ end
75
+
76
+ #
77
+ # Shuts down the local side of the stream abstraction.
78
+ #
79
+ def shutdown(how)
80
+ lsock.shutdown(how)
81
+ end
82
+
83
+ #
84
+ # Closes both sides of the stream abstraction.
85
+ #
86
+ def close
87
+ cleanup_abstraction
88
+ super
89
+ end
90
+
91
+ #
92
+ # Symbolic peer information.
93
+ #
94
+ def peerinfo
95
+ 'Remote-side of Pipe'
96
+ end
97
+
98
+ #
99
+ # Symbolic local information.
100
+ #
101
+ def localinfo
102
+ 'Local-side of Pipe'
103
+ end
104
+
105
+ #
106
+ # The left side of the stream.
107
+ #
108
+ attr_reader :lsock
109
+ #
110
+ # The right side of the stream.
111
+ #
112
+ attr_reader :rsock
113
+
114
+ protected
115
+
116
+ def monitor_rsock(threadname = 'SocketMonitorRemote')
117
+ self.monitor_thread = Rex::ThreadFactory.spawn(threadname, false) do
118
+ loop do
119
+ closed = false
120
+ buf = nil
121
+
122
+ unless rsock
123
+ wlog('monitor_rsock: the remote socket is nil, exiting loop')
124
+ break
146
125
  end
147
- rescue EOFError => e
148
- closed = true
149
- dlog("monitor_rsock: EOF in rsock")
150
- rescue ::Exception => e
151
- closed = true
152
- wlog("monitor_rsock: exception during read: #{e.class} #{e}")
153
- end
154
- end
155
126
 
156
- if( closed == false )
157
- total_sent = 0
158
- total_length = buf.length
159
- while( total_sent < total_length )
160
127
  begin
161
- data = buf[total_sent, buf.length]
162
-
163
- # Note that this must be write() NOT syswrite() or put() or anything like it.
164
- # Using syswrite() breaks SSL streams.
165
- sent = self.write( data )
128
+ s = Rex::ThreadSafe.select([rsock], nil, nil, 0.2)
129
+ next if s.nil? || s[0].nil?
130
+ rescue Exception => e
131
+ wlog("monitor_rsock: exception during select: #{e.class} #{e}")
132
+ closed = true
133
+ end
166
134
 
167
- # sf: Only remove the data off the queue is write was successfull.
168
- # This way we naturally perform a resend if a failure occured.
169
- # Catches an edge case with meterpreter TCP channels where remote send
170
- # failes gracefully and a resend is required.
171
- if (sent.nil?)
135
+ unless closed
136
+ begin
137
+ buf = rsock.sysread(32_768)
138
+ if buf.nil?
139
+ closed = true
140
+ wlog('monitor_rsock: closed remote socket due to nil read')
141
+ end
142
+ rescue EOFError => e
172
143
  closed = true
173
- wlog("monitor_rsock: failed writing, socket must be dead")
174
- break
175
- elsif (sent > 0)
176
- total_sent += sent
144
+ dlog('monitor_rsock: EOF in rsock')
145
+ rescue ::Exception => e
146
+ closed = true
147
+ wlog("monitor_rsock: exception during read: #{e.class} #{e}")
177
148
  end
178
- rescue ::IOError, ::EOFError => e
179
- closed = true
180
- wlog("monitor_rsock: exception during write: #{e.class} #{e}")
181
- break
182
149
  end
183
- end
184
- end
185
150
 
186
- if( closed )
187
- begin
188
- self.close_write if self.respond_to?('close_write')
189
- rescue IOError
151
+ unless closed
152
+ total_sent = 0
153
+ total_length = buf.length
154
+ while total_sent < total_length
155
+ begin
156
+ data = buf[total_sent, buf.length]
157
+
158
+ # Note that this must be write() NOT syswrite() or put() or anything like it.
159
+ # Using syswrite() breaks SSL streams.
160
+ sent = write(data)
161
+
162
+ # sf: Only remove the data off the queue is write was successfull.
163
+ # This way we naturally perform a resend if a failure occured.
164
+ # Catches an edge case with meterpreter TCP channels where remote send
165
+ # failes gracefully and a resend is required.
166
+ if sent.nil?
167
+ closed = true
168
+ wlog('monitor_rsock: failed writing, socket must be dead')
169
+ break
170
+ elsif sent > 0
171
+ total_sent += sent
172
+ end
173
+ rescue ::IOError, ::EOFError => e
174
+ closed = true
175
+ wlog("monitor_rsock: exception during write: #{e.class} #{e}")
176
+ break
177
+ end
178
+ end
179
+ end
180
+
181
+ next unless closed
182
+
183
+ begin
184
+ close_write if respond_to?('close_write')
185
+ rescue IOError
186
+ end
187
+ break
190
188
  end
191
- break
192
189
  end
193
190
  end
194
- }
195
- end
196
-
197
- protected
198
- attr_accessor :monitor_thread
199
- attr_writer :lsock
200
- attr_writer :rsock
201
-
202
- end
203
-
204
- end; end
205
191
 
192
+ attr_accessor :monitor_thread
193
+ attr_writer :lsock, :rsock
194
+ end
195
+ end; end
@@ -1,228 +1,208 @@
1
1
  # -*- coding: binary -*-
2
- require 'thread'
3
2
 
4
3
  module Rex
5
- module IO
6
-
7
- ###
8
- #
9
- # This mixin provides the framework and interface for implementing a streaming
10
- # server that can listen for and accept stream client connections. Stream
11
- # servers extend this class and are required to implement the following
12
- # methods:
13
- #
14
- # accept
15
- # fd
16
- #
17
- ###
18
- module StreamServer
19
-
20
- ##
21
- #
22
- # Abstract methods
23
- #
24
- ##
25
-
26
- ##
27
- #
28
- # Default server monitoring and client management implementation follows
29
- # below.
30
- #
31
- ##
32
-
33
- #
34
- # This callback is notified when a client connects.
35
- #
36
- def on_client_connect(client)
37
- if (on_client_connect_proc)
38
- on_client_connect_proc.call(client)
39
- end
40
- end
41
-
42
- #
43
- # This callback is notified when a client connection has data that needs to
44
- # be processed.
45
- #
46
- def on_client_data(client)
47
- if (on_client_data_proc)
48
- on_client_data_proc.call(client)
49
- end
50
- end
51
-
52
- #
53
- # This callback is notified when a client connection has closed.
54
- #
55
- def on_client_close(client)
56
- if (on_client_close_proc)
57
- on_client_close_proc.call(client)
58
- end
59
- end
60
-
61
- #
62
- # Start monitoring the listener socket for connections and keep track of
63
- # all client connections.
64
- #
65
- def start
66
- self.clients = []
67
- self.client_waiter = ::Queue.new
68
-
69
- self.listener_thread = Rex::ThreadFactory.spawn("StreamServerListener", false) {
70
- monitor_listener
71
- }
72
- self.clients_thread = Rex::ThreadFactory.spawn("StreamServerClientMonitor", false) {
73
- monitor_clients
74
- }
75
- end
76
-
77
- #
78
- # Terminates the listener monitoring threads and closes all active clients.
79
- #
80
- def stop
81
- self.listener_thread.kill
82
- self.clients_thread.kill
83
-
84
- self.clients.each { |cli|
85
- close_client(cli)
86
- }
87
- end
4
+ module IO
5
+ ###
6
+ #
7
+ # This mixin provides the framework and interface for implementing a streaming
8
+ # server that can listen for and accept stream client connections. Stream
9
+ # servers extend this class and are required to implement the following
10
+ # methods:
11
+ #
12
+ # accept
13
+ # fd
14
+ #
15
+ ###
16
+ module StreamServer
17
+ ##
18
+ #
19
+ # Abstract methods
20
+ #
21
+ ##
22
+
23
+ ##
24
+ #
25
+ # Default server monitoring and client management implementation follows
26
+ # below.
27
+ #
28
+ ##
29
+
30
+ #
31
+ # This callback is notified when a client connects.
32
+ #
33
+ def on_client_connect(client)
34
+ on_client_connect_proc.call(client) if on_client_connect_proc
35
+ end
88
36
 
89
- #
90
- # This method closes a client connection and cleans up the resources
91
- # associated with it.
92
- #
93
- def close_client(client)
94
- if (client)
95
- detach_client(client)
96
-
97
- begin
98
- client.close
99
- rescue IOError
37
+ #
38
+ # This callback is notified when a client connection has data that needs to
39
+ # be processed.
40
+ #
41
+ def on_client_data(client)
42
+ on_client_data_proc.call(client) if on_client_data_proc
100
43
  end
101
- end
102
- end
103
44
 
104
- #
105
- # Detach a client. You are now responsible for it, not us
106
- #
107
- def detach_client(client)
108
- self.clients.delete(client)
109
- end
45
+ #
46
+ # This callback is notified when a client connection has closed.
47
+ #
48
+ def on_client_close(client)
49
+ on_client_close_proc.call(client) if on_client_close_proc
50
+ end
110
51
 
111
- #
112
- # This method waits on the server listener thread
113
- #
114
- def wait
115
- self.listener_thread.join if self.listener_thread
116
- end
52
+ #
53
+ # Start monitoring the listener socket for connections and keep track of
54
+ # all client connections.
55
+ #
56
+ def start
57
+ self.clients = []
58
+ self.client_waiter = ::Queue.new
117
59
 
118
- ##
119
- #
120
- # Callback procedures.
121
- #
122
- ##
123
-
124
- #
125
- # This callback procedure can be set and will be called when new clients
126
- # connect.
127
- #
128
- attr_accessor :on_client_connect_proc
129
- #
130
- # This callback procedure can be set and will be called when clients
131
- # have data to be processed.
132
- #
133
- attr_accessor :on_client_data_proc
134
- #
135
- # This callback procedure can be set and will be called when a client
136
- # disconnects from the server.
137
- #
138
- attr_accessor :on_client_close_proc
139
-
140
- attr_accessor :clients # :nodoc:
141
- attr_accessor :listener_thread, :clients_thread # :nodoc:
142
- attr_accessor :client_waiter
143
-
144
- protected
145
-
146
- #
147
- # This method monitors the listener socket for new connections and calls
148
- # the +on_client_connect+ callback routine.
149
- #
150
- def monitor_listener
151
-
152
- while true
153
- begin
154
- cli = accept
155
- if not cli
156
- elog("The accept() returned nil in stream server listener monitor: #{fd.inspect}")
157
- ::IO.select(nil, nil, nil, 0.10)
158
- next
60
+ self.listener_thread = Rex::ThreadFactory.spawn('StreamServerListener', false) do
61
+ monitor_listener
159
62
  end
63
+ self.clients_thread = Rex::ThreadFactory.spawn('StreamServerClientMonitor', false) do
64
+ monitor_clients
65
+ end
66
+ end
160
67
 
161
- # Append to the list of clients
162
- self.clients << cli
68
+ #
69
+ # Terminates the listener monitoring threads and closes all active clients.
70
+ #
71
+ def stop
72
+ listener_thread.kill
73
+ clients_thread.kill
163
74
 
164
- # Initialize the connection processing
165
- on_client_connect(cli)
75
+ clients.each do |cli|
76
+ close_client(cli)
77
+ end
78
+ end
166
79
 
167
- # Notify the client monitor
168
- self.client_waiter.push(cli)
80
+ #
81
+ # This method closes a client connection and cleans up the resources
82
+ # associated with it.
83
+ #
84
+ def close_client(client)
85
+ if client
86
+ detach_client(client)
87
+
88
+ begin
89
+ client.close
90
+ rescue IOError
91
+ end
92
+ end
93
+ end
169
94
 
170
- # Skip exceptions caused by accept() [ SSL ]
171
- rescue ::EOFError, ::Errno::ECONNRESET, ::Errno::ENOTCONN, ::Errno::ECONNABORTED
172
- rescue ::Interrupt
173
- raise $!
174
- rescue ::Exception
175
- elog("Error in stream server server monitor: #{$!}")
176
- rlog(ExceptionCallStack)
177
- break
95
+ #
96
+ # Detach a client. You are now responsible for it, not us
97
+ #
98
+ def detach_client(client)
99
+ clients.delete(client)
178
100
  end
179
- end
180
- end
181
101
 
182
- #
183
- # This method monitors client connections for data and calls the
184
- # +on_client_data+ routine when new data arrives.
185
- #
186
- def monitor_clients
187
- begin
188
-
189
- # Wait for a notify if our client list is empty
190
- if (clients.length == 0)
191
- self.client_waiter.pop
192
- next
102
+ #
103
+ # This method waits on the server listener thread
104
+ #
105
+ def wait
106
+ listener_thread.join if listener_thread
193
107
  end
194
108
 
195
- sd = Rex::ThreadSafe.select(clients, nil, nil, nil)
109
+ ##
110
+ #
111
+ # Callback procedures.
112
+ #
113
+ ##
114
+
115
+ #
116
+ # This callback procedure can be set and will be called when new clients
117
+ # connect.
118
+ #
119
+ attr_accessor :on_client_connect_proc
120
+ #
121
+ # This callback procedure can be set and will be called when clients
122
+ # have data to be processed.
123
+ #
124
+ attr_accessor :on_client_data_proc
125
+ #
126
+ # This callback procedure can be set and will be called when a client
127
+ # disconnects from the server.
128
+ #
129
+ attr_accessor :on_client_close_proc
130
+
131
+ attr_accessor :clients, :listener_thread, :clients_thread, :client_waiter # :nodoc: # :nodoc:
132
+
133
+ protected
134
+
135
+ #
136
+ # This method monitors the listener socket for new connections and calls
137
+ # the +on_client_connect+ callback routine.
138
+ #
139
+ def monitor_listener
140
+ while true
141
+ begin
142
+ cli = accept
143
+ unless cli
144
+ elog("The accept() returned nil in stream server listener monitor: #{fd.inspect}")
145
+ ::IO.select(nil, nil, nil, 0.10)
146
+ next
147
+ end
148
+
149
+ # Append to the list of clients
150
+ clients << cli
151
+
152
+ # Initialize the connection processing
153
+ on_client_connect(cli)
154
+
155
+ # Notify the client monitor
156
+ client_waiter.push(cli)
157
+
158
+ # Skip exceptions caused by accept() [ SSL ]
159
+ rescue ::EOFError, ::Errno::ECONNRESET, ::Errno::ENOTCONN, ::Errno::ECONNABORTED
160
+ rescue ::Interrupt
161
+ raise $!
162
+ rescue ::Exception
163
+ elog("Error in stream server server monitor: #{$!}")
164
+ rlog(ExceptionCallStack)
165
+ break
166
+ end
167
+ end
168
+ end
196
169
 
197
- sd[0].each { |cfd|
170
+ #
171
+ # This method monitors client connections for data and calls the
172
+ # +on_client_data+ routine when new data arrives.
173
+ #
174
+ def monitor_clients
198
175
  begin
199
- on_client_data(cfd) if clients.include? cfd
200
- rescue ::EOFError, ::Errno::ECONNRESET, ::Errno::ENOTCONN, ::Errno::ECONNABORTED
201
- on_client_close(cfd)
202
- close_client(cfd)
176
+ # Wait for a notify if our client list is empty
177
+ if clients.length == 0
178
+ client_waiter.pop
179
+ next
180
+ end
181
+
182
+ sd = Rex::ThreadSafe.select(clients, nil, nil, nil)
183
+
184
+ sd[0].each do |cfd|
185
+ on_client_data(cfd) if clients.include? cfd
186
+ rescue ::EOFError, ::Errno::ECONNRESET, ::Errno::ENOTCONN, ::Errno::ECONNABORTED
187
+ on_client_close(cfd)
188
+ close_client(cfd)
189
+ rescue ::Interrupt
190
+ raise $!
191
+ rescue ::Exception
192
+ close_client(cfd)
193
+ elog("Error in stream server client monitor: #{$!}")
194
+ rlog(ExceptionCallStack)
195
+ end
196
+ rescue ::Rex::StreamClosedError => e
197
+ # Remove the closed stream from the list
198
+ detach_client(e.stream)
203
199
  rescue ::Interrupt
204
200
  raise $!
205
201
  rescue ::Exception
206
- close_client(cfd)
207
202
  elog("Error in stream server client monitor: #{$!}")
208
203
  rlog(ExceptionCallStack)
209
-
210
- end
211
- }
212
-
213
- rescue ::Rex::StreamClosedError => e
214
- # Remove the closed stream from the list
215
- detach_client(e.stream)
216
- rescue ::Interrupt
217
- raise $!
218
- rescue ::Exception
219
- elog("Error in stream server client monitor: #{$!}")
220
- rlog(ExceptionCallStack)
221
- end while true
204
+ end while true
205
+ end
206
+ end
222
207
  end
223
-
224
208
  end
225
-
226
- end
227
- end
228
-
data.tar.gz.sig CHANGED
@@ -1 +1 @@
1
- ��.�bU��P"���Mjf�c`��aMہ��Z��]��ǒ mGOF���f���U^��
1
+ cc=�:,ۥq���<NS)�-�'����X)���ݥ��ߋb깋��]w\ܷ�IQ��lG�Z�����t��_ڑ�0�EY���<.y�\B n��
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rex-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.20
4
+ version: 0.1.24
5
5
  platform: ruby
6
6
  authors:
7
7
  - Metasploit Hackers
@@ -93,7 +93,7 @@ cert_chain:
93
93
  EknWpNgVhohbot1lfVAMmIhdtOVaRVcQQixWPwprDj/ydB8ryDMDosIMcw+fkoXU
94
94
  9GJsSaSRRYQ9UUkVL27b64okU8D48m8=
95
95
  -----END CERTIFICATE-----
96
- date: 2021-11-16 00:00:00.000000000 Z
96
+ date: 2022-01-26 00:00:00.000000000 Z
97
97
  dependencies:
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: rake
@@ -132,6 +132,7 @@ executables: []
132
132
  extensions: []
133
133
  extra_rdoc_files: []
134
134
  files:
135
+ - ".github/workflows/verify.yml"
135
136
  - ".gitignore"
136
137
  - ".rspec"
137
138
  - ".travis.yml"
metadata.gz.sig CHANGED
Binary file