Skip to content

Commit

Permalink
Merge pull request #290 from WinRb/cork-fix_unicode_parsing
Browse files Browse the repository at this point in the history
Use pack('S*') instead of .chr so full utf-16 can be supported
  • Loading branch information
mwrock authored Oct 16, 2018
2 parents a2e7b12 + 6162be0 commit 91739a3
Showing 1 changed file with 48 additions and 52 deletions.
100 changes: 48 additions & 52 deletions lib/winrm/psrp/message_data/pipeline_output.rb
Original file line number Diff line number Diff line change
@@ -1,52 +1,48 @@
# Copyright 2016 Matt Wrock <[email protected]>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

require 'rexml/document'

module WinRM
module PSRP
module MessageData
# Handles decoding a raw powershell output response
class PipelineOutput < Base
def output
extract_out_string(remove_bom(raw.force_encoding('utf-8')))
end

private

def extract_out_string(text)
doc = REXML::Document.new(text)
doc.root.get_elements('//S').map do |node|
text = ''
if node.text
text << node.text.gsub(/_x(\h\h\h\h)_/) do
decoded_text = Regexp.last_match[1].hex.chr.force_encoding('utf-8')
if decoded_text.respond_to?(:scrub)
decoded_text.scrub
else
decoded_text.encode('utf-16', invalid: :replace, undef: :replace).encode('utf-8')
end
end.chomp
end
text << "\r\n"
end.join
end

def remove_bom(text)
text.sub("\xEF\xBB\xBF", '')
end
end
end
end
end
# Copyright 2016 Matt Wrock <[email protected]>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

require 'rexml/document'

module WinRM
module PSRP
module MessageData
# Handles decoding a raw powershell output response
class PipelineOutput < Base
def output
extract_out_string(remove_bom(raw.force_encoding('utf-8')))
end

private

def extract_out_string(text)
doc = REXML::Document.new(text)
doc.root.get_elements('//S').map do |node|
text = ''
if node.text
text << node.text.gsub(/(_x\h\h\h\h_)+/) do |match|
match.scan(/_x(\h\h\h\h)_/).flatten.map(&:hex)
.pack('S*').force_encoding('utf-16le').encode('utf-8')
end.chomp
end
text << "\r\n"
end.join
end

def remove_bom(text)
text.sub("\xEF\xBB\xBF", '')
end
end
end
end
end

0 comments on commit 91739a3

Please sign in to comment.