Fix share local address check

We're resolving share addresses to determine if those point to a
local address. The issue is that we fetch the local ips resolving
the local hostname, which won't include '127.0.0.1' or '::1'.

For this reason, a share such as '\\localhost\share' won't be
reported as being local.

This change handles this case.

Closes-Bug: #1680029

Change-Id: I36df4aa79bb7af548b6e39f9f9e7c4f979ae0a77
This commit is contained in:
Lucian Petrut 2017-04-05 14:08:40 +03:00
parent 033bba1c52
commit 54d97f2477
2 changed files with 10 additions and 1 deletions

View File

@ -187,6 +187,9 @@ class SMBUtilsTestCase(test_base.OsWinBaseTestCase):
'expected_local': False},
{'local_ips': [mock.sentinel.ip0, mock.sentinel.ip1],
'dest_ips': [mock.sentinel.ip1, mock.sentinel.ip3],
'expected_local': True},
{'local_ips': [],
'dest_ips': ['127.0.0.1'],
'expected_local': True})
@ddt.unpack
@mock.patch('os_win._utils.get_ips')
@ -195,7 +198,10 @@ class SMBUtilsTestCase(test_base.OsWinBaseTestCase):
local_ips, dest_ips, expected_local):
fake_share_server = 'fake_share_server'
fake_share = '\\\\%s\\fake_share' % fake_share_server
mock_get_ips.side_effect = (local_ips, dest_ips)
mock_get_ips.side_effect = (local_ips,
['127.0.0.1', '::1'],
dest_ips)
self._smbutils._loopback_share_map = {}
is_local = self._smbutils.is_local_share(fake_share)
@ -209,4 +215,5 @@ class SMBUtilsTestCase(test_base.OsWinBaseTestCase):
mock_gethostname.assert_called_once_with()
mock_get_ips.assert_has_calls(
[mock.call(mock_gethostname.return_value),
mock.call('localhost'),
mock.call(fake_share_server)])

View File

@ -136,6 +136,8 @@ class SMBUtils(baseutils.BaseUtils):
addr = share_path.lstrip('\\').split('\\', 1)[0]
local_ips = _utils.get_ips(socket.gethostname())
local_ips += _utils.get_ips('localhost')
dest_ips = _utils.get_ips(addr)
is_local = bool(set(local_ips).intersection(set(dest_ips)))