diff options
author | Claire McQuin <claire@getchef.com> | 2015-09-01 11:36:25 -0700 |
---|---|---|
committer | Claire McQuin <claire@getchef.com> | 2015-09-01 13:37:53 -0700 |
commit | 12425d32e29fd612a2afaa99a1978df1b600b941 (patch) | |
tree | 0f2e3ccdcb60504f085624f35211e9c79ad5ae9b | |
parent | 3770ec1025fd09d3a3bb393ad955ee2985252a67 (diff) | |
download | chef-12425d32e29fd612a2afaa99a1978df1b600b941.tar.gz |
Refactor Chef::Mixin::WideString to remove implicit Windows dependency.mcquin/refactor-wstring
-rw-r--r-- | lib/chef/mixin/wide_string.rb | 72 | ||||
-rw-r--r-- | lib/chef/mixin/windows_env_helper.rb | 5 | ||||
-rw-r--r-- | lib/chef/mixin/wstring.rb | 31 | ||||
-rw-r--r-- | lib/chef/win32/api/file.rb | 1 | ||||
-rw-r--r-- | lib/chef/win32/api/net.rb | 1 | ||||
-rw-r--r-- | lib/chef/win32/api/unicode.rb | 43 | ||||
-rw-r--r-- | lib/chef/win32/crypto.rb | 1 | ||||
-rw-r--r-- | lib/chef/win32/file.rb | 9 | ||||
-rw-r--r-- | lib/chef/win32/mutex.rb | 3 | ||||
-rw-r--r-- | lib/chef/win32/net.rb | 2 | ||||
-rw-r--r-- | lib/chef/win32/registry.rb | 2 | ||||
-rw-r--r-- | lib/chef/win32/security.rb | 2 | ||||
-rw-r--r-- | lib/chef/win32/security/token.rb | 2 | ||||
-rw-r--r-- | lib/chef/win32/unicode.rb | 9 |
14 files changed, 96 insertions, 87 deletions
diff --git a/lib/chef/mixin/wide_string.rb b/lib/chef/mixin/wide_string.rb new file mode 100644 index 0000000000..0c32b76365 --- /dev/null +++ b/lib/chef/mixin/wide_string.rb @@ -0,0 +1,72 @@ +# +# Author:: Jay Mundrawala(<jdm@chef.io>) +# Copyright:: Copyright 2015 Chef Software +# License:: Apache License, Version 2.0 +# +# 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. +# + +class Chef + module Mixin + module WideString + + def wstring(str) + if str.nil? || str.encoding == Encoding::UTF_16LE + str + else + utf8_to_wide(str) + end + end + + def utf8_to_wide(ustring) + # ensure it is actually UTF-8 + # Ruby likes to mark binary data as ASCII-8BIT + ustring = (ustring + "").force_encoding('UTF-8') if ustring.respond_to?(:force_encoding) && ustring.encoding.name != "UTF-8" + + # ensure we have the double-null termination Windows Wide likes + ustring = ustring + "\000\000" if ustring.length == 0 or ustring[-1].chr != "\000" + + # encode it all as UTF-16LE AKA Windows Wide Character AKA Windows Unicode + ustring = begin + if ustring.respond_to?(:encode) + ustring.encode('UTF-16LE') + else + require 'iconv' + Iconv.conv("UTF-16LE", "UTF-8", ustring) + end + end + ustring + end + + def wide_to_utf8(wstring) + # ensure it is actually UTF-16LE + # Ruby likes to mark binary data as ASCII-8BIT + wstring = wstring.force_encoding('UTF-16LE') if wstring.respond_to?(:force_encoding) + + # encode it all as UTF-8 + wstring = begin + if wstring.respond_to?(:encode) + wstring.encode('UTF-8') + else + require 'iconv' + Iconv.conv("UTF-8", "UTF-16LE", wstring) + end + end + # remove trailing CRLF and NULL characters + wstring.strip! + wstring + end + + end + end +end diff --git a/lib/chef/mixin/windows_env_helper.rb b/lib/chef/mixin/windows_env_helper.rb index a126801a28..cd12b4254a 100644 --- a/lib/chef/mixin/windows_env_helper.rb +++ b/lib/chef/mixin/windows_env_helper.rb @@ -18,6 +18,7 @@ require 'chef/exceptions' +require 'chef/mixin/wide_string' require 'chef/platform/query_helpers' require 'chef/win32/error' if Chef::Platform.windows? require 'chef/win32/api/system' if Chef::Platform.windows? @@ -26,6 +27,8 @@ require 'chef/win32/api/unicode' if Chef::Platform.windows? class Chef module Mixin module WindowsEnvHelper + include Chef::Mixin::WideString + if Chef::Platform.windows? include Chef::ReservedNames::Win32::API::System end @@ -45,7 +48,7 @@ class Chef Chef::ReservedNames::Win32::Error.raise! end if ( SendMessageTimeoutW(HWND_BROADCAST, WM_SETTINGCHANGE, 0, FFI::MemoryPointer.from_string( - Chef::ReservedNames::Win32::Unicode.utf8_to_wide('Environment') + utf8_to_wide('Environment') ).address, flags, 5000, nil) == 0 ) Chef::ReservedNames::Win32::Error.raise! end diff --git a/lib/chef/mixin/wstring.rb b/lib/chef/mixin/wstring.rb deleted file mode 100644 index bb6fdf4884..0000000000 --- a/lib/chef/mixin/wstring.rb +++ /dev/null @@ -1,31 +0,0 @@ -# -# Author:: Jay Mundrawala(<jdm@chef.io>) -# Copyright:: Copyright 2015 Chef Software -# License:: Apache License, Version 2.0 -# -# 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. -# - -class Chef - module Mixin - module WideString - def wstring(str) - if str.nil? || str.encoding == Encoding::UTF_16LE - str - else - str.to_wstring - end - end - end - end -end diff --git a/lib/chef/win32/api/file.rb b/lib/chef/win32/api/file.rb index 728a6c14df..9ff1ad40d6 100644 --- a/lib/chef/win32/api/file.rb +++ b/lib/chef/win32/api/file.rb @@ -20,6 +20,7 @@ require 'chef/win32/api' require 'chef/win32/api/security' require 'chef/win32/api/system' +require 'chef/win32/unicode' class Chef module ReservedNames::Win32 diff --git a/lib/chef/win32/api/net.rb b/lib/chef/win32/api/net.rb index 6828d7ee2f..b173987a05 100644 --- a/lib/chef/win32/api/net.rb +++ b/lib/chef/win32/api/net.rb @@ -17,6 +17,7 @@ # require 'chef/win32/api' +require 'chef/win32/unicode' class Chef module ReservedNames::Win32 diff --git a/lib/chef/win32/api/unicode.rb b/lib/chef/win32/api/unicode.rb index 2e3a599f0a..2a9166aa99 100644 --- a/lib/chef/win32/api/unicode.rb +++ b/lib/chef/win32/api/unicode.rb @@ -129,49 +129,6 @@ int WideCharToMultiByte( =end safe_attach_function :WideCharToMultiByte, [:UINT, :DWORD, :LPCWSTR, :int, :LPSTR, :int, :LPCSTR, :LPBOOL], :int - ############################################### - # Helpers - ############################################### - - def utf8_to_wide(ustring) - # ensure it is actually UTF-8 - # Ruby likes to mark binary data as ASCII-8BIT - ustring = (ustring + "").force_encoding('UTF-8') if ustring.respond_to?(:force_encoding) && ustring.encoding.name != "UTF-8" - - # ensure we have the double-null termination Windows Wide likes - ustring = ustring + "\000\000" if ustring.length == 0 or ustring[-1].chr != "\000" - - # encode it all as UTF-16LE AKA Windows Wide Character AKA Windows Unicode - ustring = begin - if ustring.respond_to?(:encode) - ustring.encode('UTF-16LE') - else - require 'iconv' - Iconv.conv("UTF-16LE", "UTF-8", ustring) - end - end - ustring - end - - def wide_to_utf8(wstring) - # ensure it is actually UTF-16LE - # Ruby likes to mark binary data as ASCII-8BIT - wstring = wstring.force_encoding('UTF-16LE') if wstring.respond_to?(:force_encoding) - - # encode it all as UTF-8 - wstring = begin - if wstring.respond_to?(:encode) - wstring.encode('UTF-8') - else - require 'iconv' - Iconv.conv("UTF-8", "UTF-16LE", wstring) - end - end - # remove trailing CRLF and NULL characters - wstring.strip! - wstring - end - end end end diff --git a/lib/chef/win32/crypto.rb b/lib/chef/win32/crypto.rb index 79cf51b002..aa20c2dfd4 100644 --- a/lib/chef/win32/crypto.rb +++ b/lib/chef/win32/crypto.rb @@ -19,6 +19,7 @@ require 'chef/win32/error'
require 'chef/win32/api/memory'
require 'chef/win32/api/crypto'
+require 'chef/win32/unicode'
require 'digest'
class Chef
diff --git a/lib/chef/win32/file.rb b/lib/chef/win32/file.rb index 57347643fc..700ddb24d3 100644 --- a/lib/chef/win32/file.rb +++ b/lib/chef/win32/file.rb @@ -17,10 +17,11 @@ # limitations under the License. # +require 'chef/mixin/wide_string' require 'chef/win32/api/file' require 'chef/win32/api/security' require 'chef/win32/error' -require 'chef/mixin/wstring' +require 'chef/win32/unicode' class Chef module ReservedNames::Win32 @@ -161,9 +162,9 @@ class Chef def self.file_access_check(path, desired_access) security_descriptor = Chef::ReservedNames::Win32::Security.get_file_security(path) - token_rights = Chef::ReservedNames::Win32::Security::TOKEN_IMPERSONATE | + token_rights = Chef::ReservedNames::Win32::Security::TOKEN_IMPERSONATE | Chef::ReservedNames::Win32::Security::TOKEN_QUERY | - Chef::ReservedNames::Win32::Security::TOKEN_DUPLICATE | + Chef::ReservedNames::Win32::Security::TOKEN_DUPLICATE | Chef::ReservedNames::Win32::Security::STANDARD_RIGHTS_READ token = Chef::ReservedNames::Win32::Security.open_process_token( Chef::ReservedNames::Win32::Process.get_current_process, @@ -176,7 +177,7 @@ class Chef mapping[:GenericExecute] = Chef::ReservedNames::Win32::Security::FILE_GENERIC_EXECUTE mapping[:GenericAll] = Chef::ReservedNames::Win32::Security::FILE_ALL_ACCESS - Chef::ReservedNames::Win32::Security.access_check(security_descriptor, duplicate_token, + Chef::ReservedNames::Win32::Security.access_check(security_descriptor, duplicate_token, desired_access, mapping) end diff --git a/lib/chef/win32/mutex.rb b/lib/chef/win32/mutex.rb index 0b7d99f111..f4755e9019 100644 --- a/lib/chef/win32/mutex.rb +++ b/lib/chef/win32/mutex.rb @@ -17,6 +17,7 @@ # require 'chef/win32/api/synchronization' +require 'chef/win32/unicode' class Chef module ReservedNames::Win32 @@ -113,5 +114,3 @@ if the mutex is attempted to be acquired by other threads.") end end end - - diff --git a/lib/chef/win32/net.rb b/lib/chef/win32/net.rb index c1ef3e83ce..59f29c4d1b 100644 --- a/lib/chef/win32/net.rb +++ b/lib/chef/win32/net.rb @@ -18,7 +18,7 @@ require 'chef/win32/api/net' require 'chef/win32/error' -require 'chef/mixin/wstring' +require 'chef/mixin/wide_string' class Chef module ReservedNames::Win32 diff --git a/lib/chef/win32/registry.rb b/lib/chef/win32/registry.rb index 2bb7b78965..b25ce7937e 100644 --- a/lib/chef/win32/registry.rb +++ b/lib/chef/win32/registry.rb @@ -18,7 +18,7 @@ # require 'chef/reserved_names' require 'chef/win32/api' -require 'chef/mixin/wstring' +require 'chef/mixin/wide_string' if RUBY_PLATFORM =~ /mswin|mingw32|windows/ require 'chef/win32/api/registry' diff --git a/lib/chef/win32/security.rb b/lib/chef/win32/security.rb index 5c83180bc0..bc80517d80 100644 --- a/lib/chef/win32/security.rb +++ b/lib/chef/win32/security.rb @@ -22,7 +22,7 @@ require 'chef/win32/memory' require 'chef/win32/process' require 'chef/win32/unicode' require 'chef/win32/security/token' -require 'chef/mixin/wstring' +require 'chef/mixin/wide_string' class Chef module ReservedNames::Win32 diff --git a/lib/chef/win32/security/token.rb b/lib/chef/win32/security/token.rb index 9e494a73b9..8d4e54ad8c 100644 --- a/lib/chef/win32/security/token.rb +++ b/lib/chef/win32/security/token.rb @@ -18,7 +18,7 @@ require 'chef/win32/security' require 'chef/win32/api/security' - +require 'chef/win32/unicode' require 'ffi' class Chef diff --git a/lib/chef/win32/unicode.rb b/lib/chef/win32/unicode.rb index ea10dc71d0..562301a040 100644 --- a/lib/chef/win32/unicode.rb +++ b/lib/chef/win32/unicode.rb @@ -17,6 +17,7 @@ # limitations under the License. # +require 'chef/mixin/wide_string' require 'chef/win32/api/unicode' class Chef @@ -30,6 +31,8 @@ end module FFI class Pointer + include Chef::Mixin::WideString + def read_wstring(num_wchars = nil) if num_wchars.nil? # Find the length of the string @@ -43,14 +46,16 @@ module FFI num_wchars = length end - Chef::ReservedNames::Win32::Unicode.wide_to_utf8(self.get_bytes(0, num_wchars*2)) + wide_to_utf8(self.get_bytes(0, num_wchars*2)) end end end class String + include Chef::Mixin::WideString + def to_wstring - Chef::ReservedNames::Win32::Unicode.utf8_to_wide(self) + utf8_to_wide(self) end end |